Todo Sample CD #389
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Todo Sample CD | |
# Project templates come equipped with CI/CD for both Azure DevOps and GitHub, providing you with a hassle-free way to get started with your new project. It is important to note that you should not depend on the contents of this file. More info at https://bitplatform.dev/templates/dev-ops | |
env: | |
SERVER_ADDRESS: 'https://todo.bitplatform.dev' | |
on: | |
workflow_dispatch: | |
push: | |
branches: [ "main" ] | |
permissions: | |
contents: read | |
jobs: | |
build_api_blazor: | |
name: build api + blazor web | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Remove .NET 9 based global.json | |
run: | | |
rm src/global.json | |
- name: Setup .NET | |
uses: actions/setup-dotnet@v4 | |
with: | |
global-json-file: src/Templates/Boilerplate/Bit.Boilerplate/global8.json | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 22 | |
- name: Create project from Boilerplate | |
run: | | |
cd src/Templates/Boilerplate && dotnet build -c Release | |
dotnet pack -c Release -o . -p:ReleaseVersion=0.0.0 -p:PackageVersion=0.0.0 | |
dotnet new install Bit.Boilerplate.0.0.0.nupkg | |
cd ../../../ && dotnet new bit-bp --name TodoSample --database PostgreSQL --sample Todo --appInsights --sentry --serverUrl ${{ env.SERVER_ADDRESS }} --filesStorage AzureBlobStorage --notification --captcha reCaptcha --signalR --framework net8.0 | |
- name: Update core appsettings.json | |
uses: devops-actions/[email protected] | |
with: | |
files: 'TodoSample/src/Shared/appsettings.json, TodoSample/src/Client/TodoSample.Client.Core/appsettings.json, TodoSample/src/Client/TodoSample.Client.Web/appsettings.json, TodoSample/src/Client/TodoSample.Client.Web/appsettings.Production.json' | |
env: | |
WebAppRender.PrerenderEnabled: true | |
ServerAddress: ${{ env.SERVER_ADDRESS }} | |
WebAppRender.BlazorMode: BlazorWebAssembly | |
Logging.Sentry.Dsn: ${{ secrets.TODO_SENTRY_DSN }} | |
AdsPushVapid.PublicKey: ${{ secrets.TODO_PUBLIC_VAPIDKEY }} | |
GoogleRecaptchaSiteKey: ${{ secrets.GOOGLE_RECAPTCHA_SITE_KEY }} | |
ApplicationInsights.ConnectionString: ${{ secrets.APPLICATION_INSIGHTS_CONNECTION_STRING }} | |
- name: Install wasm | |
run: cd src && dotnet workload install wasm-tools | |
- name: Configure bswup | |
run: | | |
sed -i 's/\/\/ self.disablePassiveFirstBoot/self.disablePassiveFirstBoot/g' TodoSample/src/Client/TodoSample.Client.Web/wwwroot/service-worker.published.js | |
- name: Generate CSS/JS files | |
run: dotnet build TodoSample/src/Client/TodoSample.Client.Core/TodoSample.Client.Core.csproj -t:BeforeBuildTasks -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" --no-restore -c Release | |
- name: Publish | |
run: dotnet publish TodoSample/src/Server/TodoSample.Server.Web/TodoSample.Server.Web.csproj -c Release -p:PwaEnabled=true --self-contained -r linux-x64 -o ${{env.DOTNET_ROOT}}/server -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" | |
- name: Upload server artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: server-bundle | |
path: ${{env.DOTNET_ROOT}}/server | |
include-hidden-files: true # Required for wwwroot/.well-known folder | |
deploy_api_blazor: | |
name: deploy api + blazor | |
needs: build_api_blazor | |
runs-on: ubuntu-24.04 | |
environment: | |
name: 'production' | |
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} | |
steps: | |
- name: Retrieve server bundle | |
uses: actions/download-artifact@v4 | |
with: | |
name: server-bundle | |
- name: Delete DataProtectionCertificate.pfx | |
run: | | |
rm DataProtectionCertificate.pfx | |
- name: Extract identity certificate from env | |
uses: timheuer/[email protected] | |
with: | |
fileDir: './' | |
fileName: 'DataProtectionCertificate.pfx' | |
encodedString: ${{ secrets.API_DATA_PROTECTION_CERTIFICATE_FILE_BASE64 }} | |
- name: Retrieve AppleAuthKey.p8 | |
run: echo "${{ secrets.APPSTORE_API_KEY_PRIVATE_KEY_TODO }}" > AppleAuthKey.p8 | |
- name: Deploy to Azure Web App | |
id: deploy-to-webapp | |
uses: azure/webapps-deploy@v3 | |
with: | |
app-name: 'bit-todo' | |
slot-name: 'production' | |
publish-profile: ${{ secrets.TODO_AZURE_APP_SERVICE_PUBLISH_PROFILE }} | |
package: . | |
- name: Purge cache | |
uses: jakejarvis/[email protected] | |
env: | |
CLOUDFLARE_ZONE: ${{ secrets.BITPLATFORM_DEV_CLOUDFLARE_ZONE }} | |
CLOUDFLARE_TOKEN: ${{ secrets.CLOUDFLARE_TOKEN }} | |
deploy_blazor_wasm_standalone: | |
name: build blazor wasm standalone | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Setup .NET | |
uses: actions/setup-dotnet@v4 | |
with: | |
global-json-file: src/global.json | |
- name: Create project from Boilerplate | |
run: | | |
cd src/Templates/Boilerplate && dotnet build -c Release | |
dotnet pack -c Release -o . -p:ReleaseVersion=0.0.0 -p:PackageVersion=0.0.0 | |
dotnet new install Bit.Boilerplate.0.0.0.nupkg | |
cd ../../../ && dotnet new bit-bp --name TodoSample --database PostgreSQL --sample Todo --serverUrl ${{ env.SERVER_ADDRESS }} --filesStorage AzureBlobStorage --notification --captcha reCaptcha --framework net9.0 | |
- name: Update core appsettings.json | |
uses: devops-actions/[email protected] | |
with: | |
files: 'TodoSample/src/Shared/appsettings.json, TodoSample/src/Client/TodoSample.Client.Core/appsettings.json, TodoSample/src/Client/TodoSample.Client.Web/appsettings.json, TodoSample/src/Client/TodoSample.Client.Web/appsettings.Production.json' | |
env: | |
ServerAddress: ${{ env.SERVER_ADDRESS }} | |
GoogleRecaptchaSiteKey: ${{ secrets.GOOGLE_RECAPTCHA_SITE_KEY }} | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 22 | |
- name: Install wasm | |
run: cd src && dotnet workload install wasm-tools | |
- name: Generate CSS/JS files | |
run: dotnet build TodoSample/src/Client/TodoSample.Client.Core/TodoSample.Client.Core.csproj -t:BeforeBuildTasks -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" --no-restore -c Release | |
- name: Publish | |
run: dotnet publish TodoSample/src/Client/TodoSample.Client.Web/TodoSample.Client.Web.csproj -c Release -p:PwaEnabled=true -o ${{env.DOTNET_ROOT}}/client -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" -p:RunAOTCompilation=true -p:MultilingualEnabled=false | |
- name: Upload to asw | |
run: | | |
npm install -g @azure/static-web-apps-cli | |
swa deploy --deployment-token ${{ secrets.TODO_ASW_TOKEN }} --env production --app-location ${{env.DOTNET_ROOT}}/client/wwwroot | |
build_blazor_hybrid_windows: | |
name: build blazor hybrid (windows) | |
runs-on: windows-2022 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Remove .NET 9 based global.json | |
run: | | |
rm src/global.json | |
- name: Setup .NET | |
uses: actions/setup-dotnet@v4 | |
with: | |
global-json-file: src\Templates\Boilerplate\Bit.Boilerplate\global8.json | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 22 | |
- name: Create project from Boilerplate | |
run: | | |
cd src\Templates\Boilerplate && dotnet build -c Release | |
dotnet pack -c Release -o . -p:ReleaseVersion=0.0.0 -p:PackageVersion=0.0.0 | |
dotnet new install Bit.Boilerplate.0.0.0.nupkg | |
cd ..\..\..\ && dotnet new bit-bp --name TodoSample --database PostgreSQL --sample Todo --windows --appInsights --sentry --serverUrl ${{ env.SERVER_ADDRESS }} --filesStorage AzureBlobStorage --captcha reCaptcha --signalR --framework net8.0 | |
- name: Update core appsettings.json | |
uses: devops-actions/[email protected] | |
with: | |
files: 'TodoSample\src\Shared\appsettings.json, TodoSample\src\Client\TodoSample.Client.Core\appsettings.json, TodoSample\src\Client\TodoSample.Client.Windows\appsettings.json' | |
env: | |
ServerAddress: ${{ env.SERVER_ADDRESS }} | |
Logging.Sentry.Dsn: ${{ secrets.TODO_SENTRY_DSN }} | |
WindowsUpdate.FilesUrl: https://windows-todo.bitplatform.dev | |
GoogleRecaptchaSiteKey: ${{ secrets.GOOGLE_RECAPTCHA_SITE_KEY }} | |
ApplicationInsights.ConnectionString: ${{ secrets.APPLICATION_INSIGHTS_CONNECTION_STRING }} | |
- name: Generate CSS/JS files | |
run: dotnet build TodoSample\src\Client\TodoSample.Client.Core\TodoSample.Client.Core.csproj -t:BeforeBuildTasks -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" --no-restore -c Release | |
- name: Publish | |
run: | | |
cd TodoSample\src\Client\TodoSample.Client.Windows\ | |
dotnet publish TodoSample.Client.Windows.csproj -c Release -o .\publish-result -r win-x86 -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" | |
dotnet tool restore | |
dotnet vpk pack -u TodoSample.Client.Windows -v "${{ vars.APPLICATION_DISPLAY_VERSION }}" -p .\publish-result -e TodoSample.Client.Windows.exe -r win-x86 --framework webview2 --icon .\wwwroot\favicon.ico --packTitle TodoSample | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: win-exe-bundle | |
path: TodoSample\src\Client\TodoSample.Client.Windows\Releases | |
build_blazor_hybrid_android: | |
name: build blazor hybrid (android) | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Remove .NET 9 based global.json | |
run: | | |
rm src/global.json | |
- name: Setup .NET | |
uses: actions/setup-dotnet@v4 | |
with: | |
global-json-file: src/Templates/Boilerplate/Bit.Boilerplate/global8.json | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 22 | |
- name: Create project from Boilerplate | |
run: | | |
cd src/Templates/Boilerplate && dotnet build -c Release | |
dotnet pack -c Release -o . -p:ReleaseVersion=0.0.0 -p:PackageVersion=0.0.0 | |
dotnet new install Bit.Boilerplate.0.0.0.nupkg | |
cd ../../../ && dotnet new bit-bp --name TodoSample --database PostgreSQL --sample Todo --appInsights --sentry --serverUrl ${{ env.SERVER_ADDRESS }} --filesStorage AzureBlobStorage --notification --captcha reCaptcha --signalR --framework net8.0 | |
- name: Extract Android signing key from env | |
uses: timheuer/[email protected] | |
with: | |
fileDir: './TodoSample/src/Client/TodoSample.Client.Maui/' | |
fileName: 'TodoSample.keystore' | |
encodedString: ${{ secrets.ANDROID_RELEASE_KEYSTORE_FILE_BASE64 }} | |
- name: Extract Android signing key from env | |
uses: timheuer/[email protected] | |
with: | |
fileDir: './TodoSample/src/Client/TodoSample.Client.Maui/Platforms/Android' | |
fileName: 'google-services.json' | |
encodedString: ${{ secrets.TODO_GOOGLE_SERVICES_JSON_BASE64 }} | |
- name: Update core appsettings.json | |
uses: devops-actions/[email protected] | |
with: | |
files: 'TodoSample/src/Shared/appsettings.json, TodoSample/src/Client/TodoSample.Client.Core/appsettings.json, TodoSample/src/Client/TodoSample.Client.Maui/appsettings.json' | |
env: | |
ServerAddress: ${{ env.SERVER_ADDRESS }} | |
Logging.Sentry.Dsn: ${{ secrets.TODO_SENTRY_DSN }} | |
GoogleRecaptchaSiteKey: ${{ secrets.GOOGLE_RECAPTCHA_SITE_KEY }} | |
ApplicationInsights.ConnectionString: ${{ secrets.APPLICATION_INSIGHTS_CONNECTION_STRING }} | |
- name: Install maui | |
run: cd src && dotnet workload install maui-android | |
- name: Install Android Sdk platform tools | |
run: ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --sdk_root=$ANDROID_SDK_ROOT "platform-tools" | |
- name: Delete App Icon | |
run: rm TodoSample/src/Client/TodoSample.Client.Maui/Resources/AppIcon/appicon.svg | |
- name: Extract App Icon from env | |
uses: timheuer/[email protected] | |
with: | |
fileDir: './TodoSample/src/Client/TodoSample.Client.Maui/Resources/AppIcon/' | |
fileName: 'appicon.svg' | |
encodedString: ${{ vars.TODO_ICON }} | |
- name: Delete App Splash Screen | |
run: rm TodoSample/src/Client/TodoSample.Client.Maui/Resources/Splash/splash.svg | |
- name: Extract App Splash Screen from env | |
uses: timheuer/[email protected] | |
with: | |
fileDir: './TodoSample/src/Client/TodoSample.Client.Maui/Resources/Splash/' | |
fileName: 'splash.svg' | |
encodedString: ${{ vars.TODO_SPLASH_SCREEN }} | |
- name: Generate CSS/JS files | |
run: | | |
dotnet build TodoSample/src/Client/TodoSample.Client.Core/TodoSample.Client.Core.csproj -t:BeforeBuildTasks -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" --no-restore -c Release | |
dotnet build TodoSample/src/Client/TodoSample.Client.Maui/TodoSample.Client.Maui.csproj -t:BeforeBuildTasks -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" --no-restore -c Release | |
- name: Publish aab | |
run: dotnet publish TodoSample/src/Client/TodoSample.Client.Maui/TodoSample.Client.Maui.csproj -c Release -p:AndroidPackageFormat=aab -p:AndroidKeyStore=true -p:AndroidSigningKeyStore="TodoSample.keystore" -p:AndroidSigningKeyAlias=bitplatform -p:AndroidSigningKeyPass="${{ secrets.ANDROID_RELEASE_KEYSTORE_PASSWORD }}" -p:AndroidSigningStorePass="${{ secrets.ANDROID_RELEASE_SIGNING_PASSWORD }}" -p:ApplicationDisplayVersion="${{ vars.APPLICATION_DISPLAY_VERSION }}" -p:ApplicationVersion="${{ vars.APPLICATION_VERSION }}" -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" -p:ApplicationTitle="TodoSample" -p:ApplicationId="com.bitplatform.Todo.Template" -f net8.0-android | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: android-bundle | |
path: TodoSample/src/Client/TodoSample.Client.Maui/bin/Release/net8.0-android/*-Signed.* | |
build_blazor_hybrid_ios: | |
name: build blazor hybrid (iOS-macOS) | |
runs-on: macOS-15 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Remove .NET 9 based global.json | |
run: | | |
rm src/global.json | |
- name: Setup .NET | |
uses: actions/setup-dotnet@v4 | |
with: | |
global-json-file: src/Templates/Boilerplate/Bit.Boilerplate/global8.json | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 22 | |
- uses: maxim-lobanov/[email protected] | |
with: | |
xcode-version: '16.2' | |
- name: Create project from Boilerplate | |
run: | | |
cd src/Templates/Boilerplate && dotnet build -c Release | |
dotnet pack -c Release -o . -p:ReleaseVersion=0.0.0 -p:PackageVersion=0.0.0 | |
dotnet new install Bit.Boilerplate.0.0.0.nupkg | |
cd ../../../ && dotnet new bit-bp --name TodoSample --database PostgreSQL --sample Todo --appInsights --sentry --serverUrl ${{ env.SERVER_ADDRESS }} --filesStorage AzureBlobStorage --notification --captcha reCaptcha --signalR --framework net8.0 | |
- name: Update core appsettings.json | |
uses: devops-actions/[email protected] | |
with: | |
files: 'TodoSample/src/Shared/appsettings.json, TodoSample/src/Client/TodoSample.Client.Core/appsettings.json, TodoSample/src/Client/TodoSample.Client.Maui/appsettings.json' | |
env: | |
ServerAddress: ${{ env.SERVER_ADDRESS }} | |
Logging.Sentry.Dsn: ${{ secrets.TODO_SENTRY_DSN }} | |
GoogleRecaptchaSiteKey: ${{ secrets.GOOGLE_RECAPTCHA_SITE_KEY }} | |
ApplicationInsights.ConnectionString: ${{ secrets.APPLICATION_INSIGHTS_CONNECTION_STRING }} | |
- name: Install maui | |
run: cd src && dotnet workload install maui | |
- name: Import Code-Signing Certificates | |
uses: apple-actions/import-codesign-certs@v3 | |
with: | |
p12-file-base64: ${{ secrets.APPSTORE_CODE_SIGNING_CERTIFICATE_FILE_BASE64 }} | |
p12-password: ${{ secrets.APPSTORE_CODE_SIGNING_CERTIFICATE_FILE_PASSWORD }} | |
- name: Download Apple Provisioning Profiles | |
uses: Apple-Actions/download-provisioning-profiles@v3 | |
with: | |
bundle-id: 'com.bitplatform.Todo.Template' | |
issuer-id: ${{ secrets.APPSTORE_API_KEY_ISSUER_ID }} | |
api-key-id: ${{ secrets.APPSTORE_API_KEY_ID }} | |
api-private-key: ${{ secrets.APPSTORE_API_KEY_PRIVATE_KEY }} | |
- name: Delete App Icon | |
run: rm TodoSample/src/Client/TodoSample.Client.Maui/Resources/AppIcon/appicon.svg | |
- name: Extract App Icon from env | |
uses: timheuer/[email protected] | |
with: | |
fileDir: './TodoSample/src/Client/TodoSample.Client.Maui/Resources/AppIcon/' | |
fileName: 'appicon.svg' | |
encodedString: ${{ vars.TODO_ICON }} | |
- name: Delete App Splash Screen | |
run: rm TodoSample/src/Client/TodoSample.Client.Maui/Resources/Splash/splash.svg | |
- name: Extract App Splash Screen from env | |
uses: timheuer/[email protected] | |
with: | |
fileDir: './TodoSample/src/Client/TodoSample.Client.Maui/Resources/Splash/' | |
fileName: 'splash.svg' | |
encodedString: ${{ vars.TODO_SPLASH_SCREEN }} | |
- name: Generate CSS/JS files | |
run: | | |
dotnet build TodoSample/src/Client/TodoSample.Client.Core/TodoSample.Client.Core.csproj -t:BeforeBuildTasks -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" --no-restore -c Release | |
dotnet build TodoSample/src/Client/TodoSample.Client.Maui/TodoSample.Client.Maui.csproj -t:BeforeBuildTasks -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" --no-restore -c Release | |
- name: Build ipa | |
run: dotnet publish TodoSample/src/Client/TodoSample.Client.Maui/TodoSample.Client.Maui.csproj -p:RuntimeIdentifier=ios-arm64 -c Release -p:ArchiveOnBuild=true -p:CodesignKey="iPhone Distribution" -p:CodesignProvision="TodoTemplate" -p:ApplicationDisplayVersion="${{ vars.APPLICATION_DISPLAY_VERSION }}" -p:ApplicationVersion="${{ vars.APPLICATION_VERSION }}" -p:Version="${{ vars.APPLICATION_DISPLAY_VERSION}}" -p:ApplicationTitle="Todo" -p:ApplicationId="com.bitplatform.Todo.Template" -f net8.0-ios | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ios-bundle | |
path: TodoSample/src/Client/TodoSample.Client.Maui/bin/release/net8.0-ios/ios-arm64/publish/*.ipa |