diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000..98aa3eb --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,721 @@ +# Processes all apps Lastenrad Bayern, sharee.bike and Mein konrad +# i,e, +# - builds apps +# - publishes apps to MS App Center + +parameters: +- name: codeBase + displayName: Codebase + type: string + default: git://sharee.bike Buchungsplattform/Code@main + values: + - git://sharee.bike Buchungsplattform/Code@main + - git://sharee.bike Buchungsplattform/Code@develop + +trigger: +- main +- develop + +variables: + # General purpose variables. + buildConfiguration: 'Release' + outputDirectory: '$(build.binariesDirectory)/$(buildConfiguration)' + solutionName : 'TINK.sln' + + # TeilRad GbmH related variables. + ownerNameTeilRad : 'TeilRad' + keyStoreFile : 'TeilRad.keystore' + ownerTeilRadFullName : '$(ownerNameTeilRad)-GmbH' + + # HauffWare related variables. + ownerNameHauffWare : 'HauffWare' + keyStoreFileHauffWare : 'hauffware.keystore' + ownerHauffWareFullName : '$(ownerNameHauffWare)' + + # Lastenrad Bayern related variales. + appNameLastenradBayern : 'LastenradBayern' + + appProjectDroidLastenradBayern : '$(appNameLastenradBayern).Android.csproj' + appArtefactNameDroidLastenradBayern : 'com.$(ownerNameTeilRad).$(appNameLastenradBayern)-Signed.aab' + msAppCenterAppSlugLastenradBayernDroid : '$(appNameLastenradBayern)-1' + msAppCenterDistributionGroupIdLastenradBayernDroid : '088eb829-9030-424f-917f-3117dfff8a4b' + + solutionNameIosLastenradBayern : 'LastenradBayern.sln' + appArtefactNameIosLastenradBayern : '$(appNameLastenradBayern).iOS.ipa' + msAppCenterAppSlugLastenradBayernIos : '$(appNameLastenradBayern)' + msAppCenterDistributionGroupIdLastenradBayernIos : 'b4d4cd32-1a79-40fa-a170-797e9a62a813' + + # Sharee.bike related variables. + appNameShareeBike : 'sharee.bike' + appNameShareeBikeLegacy : 'TINK' + + appProjectDroidShareeBike : '$(appNameShareeBikeLegacy).Android.csproj' + appArtefactNameDroidShareeBike : 'com.$(ownerNameHauffWare).sharee-Signed.aab' + msAppCenterAppSlugShareeBikeDroid : '$(appNameShareeBike)-1' + msAppCenterDistributionGroupIdShareeBikeDroid : '1f9f7deb-cd88-460a-bd64-29488121bb5f' + + solutionNameIosShareeBike : 'ShareeBike.sln' + appArtefactNameIosShareeBike : '$(appNameShareeBikeLegacy).iOS.ipa' + msAppCenterAppSlugShareeBikeIos : '$(appNameShareeBike)' + msAppCenterDistributionGroupIdShareeBikeIos : 'd47dbf12-d7ec-4ef4-85f2-2bd6c249a2d9' + + # Mein konrad related variables. + appNameMeinKonrad : 'Meinkonrad' + + appProjectDroidMeinKonrad : '$(appNameMeinKonrad).Android.csproj' + appArtefactNameDroidMeinKonrad : 'com.$(ownerNameTeilRad).$(appNameMeinKonrad)-Signed.aab' + msAppCenterAppSlugMeinKonrad : 'Mein-konrad-1' + msAppCenterDistributionGroupIdMeinKonradDroid : 'e048d2f8-5b54-4a65-8c57-dd2df05269eb' + + solutionNameIosMeinKonrad : 'MeinKonrad.sln' + appArtefactNameIosMeinKonrad : '$(appNameMeinKonrad).iOS.ipa' + msAppCenterAppSlugMeinKonradIos : 'Mein-konrad' + msAppCenterDistributionGroupIdMeinKonradIos : ' 40cf103b-2d13-477a-a75a-424045dfd00d' + +stages: + - stage: RunUnitTestsStage + displayName: "Run unittests" + + # Test require widows + pool: + vmImage: 'windows-latest' + + jobs: + - job: RunUnittests + displayName: "Run Unit Tests" + + steps: + # Get code from internal repo. + # https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#specify-multiple-repositories + - checkout: ${{ parameters.codeBase}} + + - task: DotNetCoreCLI@2 + displayName: "Build TestLockItShared Unit Tests" + inputs: + command: 'build' + projects: '**/TestLockItShared.csproj' + configuration: '$(buildConfiguration)' + + - task: DotNetCoreCLI@2 + displayName: "Build TestLockItBLE Unit Tests" + inputs: + command: 'build' + projects: '**/TestLockItBLE.csproj' + configuration: '$(buildConfiguration)' + + - task: DotNetCoreCLI@2 + displayName: "Build TestShareeLib Unit Tests" + inputs: + command: 'build' + projects: '**/TestShareeLib.csproj' + configuration: '$(buildConfiguration)' + + - task: DotNetCoreCLI@2 + displayName: "Build TestShareeSharedGuiLib Unit Tests" + inputs: + command: 'build' + projects: '**/TestShareeSharedGuiLib.csproj' + configuration: '$(buildConfiguration)' + + - task: DotNetCoreCLI@2 + displayName: "Build TestSharee Unit Tests" + inputs: + command: 'build' + projects: '**/TestSharee.csproj' + configuration: '$(buildConfiguration)' + + # Infos about test filters see + # https://docs.microsoft.com/en-us/previous-versions/jj155796(v=vs.140)?redirectedfrom=MSDN + - task: VSTest@2 + displayName: "Run tests TestLockItShared" + inputs: + failOnMinTestsNotRun: true + minimumExpectedTests: 6 + testSelector: 'testAssemblies' + testAssemblyVer2: | + **\TestLockItShared.dll + !**\obj\** + searchFolder: '$(System.DefaultWorkingDirectory)' + testFiltercriteria: 'TestCategory!=Explicit&TestCategory!=RequiresCOPRI&TestCategory!=RequiresCOPRI.Live&TestCategory!=RequiresCOPRI.Devel' + + - task: VSTest@2 + displayName: "Run tests TestLockItBLE" + inputs: + failOnMinTestsNotRun: true + minimumExpectedTests: 19 + testSelector: 'testAssemblies' + testAssemblyVer2: | + **\TestLockItBLE.dll + !**\obj\** + searchFolder: '$(System.DefaultWorkingDirectory)' + testFiltercriteria: 'TestCategory!=Explicit&TestCategory!=RequiresCOPRI&TestCategory!=RequiresCOPRI.Live&TestCategory!=RequiresCOPRI.Devel' + + # Infos about test filters see + # https://docs.microsoft.com/en-us/previous-versions/jj155796(v=vs.140)?redirectedfrom=MSDN + - task: VSTest@2 + inputs: + testSelector: 'testAssemblies' + testAssemblyVer2: | + **\TestShareeLib.dll + !**\obj\** + searchFolder: '$(System.DefaultWorkingDirectory)' + testFiltercriteria: 'TestCategory!=Explicit&TestCategory!=RequiresCOPRI&TestCategory!=RequiresCOPRI.Live&TestCategory!=RequiresCOPRI.Devel' + + - task: VSTest@2 + displayName: "Run tests TestShareeSharedGuiLib" + inputs: + failOnMinTestsNotRun: true + minimumExpectedTests: 11 + testSelector: 'testAssemblies' + testAssemblyVer2: | + **\TestShareeSharedGuiLib.dll + !**\obj\** + searchFolder: '$(System.DefaultWorkingDirectory)' + testFiltercriteria: 'TestCategory!=Explicit&TestCategory!=RequiresCOPRI&TestCategory!=RequiresCOPRI.Live&TestCategory!=RequiresCOPRI.Devel' + + - task: VSTest@2 + displayName: "Run tests Sharee" + inputs: + failOnMinTestsNotRun: false # there are not yet tests in project. + minimumExpectedTests: 1 + testSelector: 'testAssemblies' + testAssemblyVer2: | + **\TestSharee.dll + !**\obj\** + searchFolder: '$(System.DefaultWorkingDirectory)' + testFiltercriteria: 'TestCategory!=Explicit&TestCategory!=RequiresCOPRI&TestCategory!=RequiresCOPRI.Live&TestCategory!=RequiresCOPRI.Devel' + + - stage: BuildAppsDroidStage + displayName: "Build the Droid apps." + dependsOn: RunUnitTestsStage + + # Droid versions can be build either on MacOS or Windows + pool: + vmImage: 'windows-latest' + + jobs: + - job: BuildAppDroid + displayName: "Build droid version of apps." + + steps: + # Get code from internal repo. + # https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#specify-multiple-repositories + - checkout: ${{ parameters.codeBase}} + + - task: NuGetToolInstaller@1 + + - task: NuGetCommand@2 + inputs: + restoreSolution: '$(solutionName)' + + # Set merchant-id. + - task: PowerShell@2 + displayName: "Set secret merchant-id for Lastenrad Bayern." + inputs: + targetType: filePath + filePath: 'Set-MerchantId.ps1' + # Merchant id is defined by COPRI + arguments: "-appName '$(appNameLastenradBayern)' -merchantId $(merchantIdLastenradBayern)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + - task: PowerShell@2 + displayName: "Set secret merchant-id for sharee.bike." + inputs: + targetType: filePath + filePath: 'Set-MerchantId.ps1' + # Merchant id is defined by COPRI + arguments: "-appName '$(appNameShareeBikeLegacy)' -merchantId $(merchantIdShareeBike)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + - task: PowerShell@2 + displayName: "Set secret merchant-id for Mein konrad." + inputs: + targetType: filePath + filePath: 'Set-MerchantId.ps1' + # Merchant id is defined by COPRI + arguments: "-appName '$(appNameMeinKonrad)' -merchantId $(merchantIdMeinkonrad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Set google maps api key + - task: PowerShell@2 + displayName: "Set secret Google Maps api-keys for Lastenrad Bayern." + inputs: + targetType: filePath + filePath: 'Set-GMapsApiKey.ps1' + # Parameter droidApiKey value should be GMapsDroidApiKey2TeilRad not GMapsDroidApiKeyTeilRad but the restricted version of key leads to a grayed google maps + arguments: "-appName '$(appNameLastenradBayern)' -droidApiKey $(GMapsDroidApiKeyTeilRad) -iOsApiKey $(GMapsIosApiKey2TeilRad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + - task: PowerShell@2 + displayName: "Set secret Google Maps api-keys for sharee.bike." + inputs: + targetType: filePath + filePath: 'Set-GMapsApiKey.ps1' + # Parameter droidApiKey value should be GMapsDroidApiKey2TeilRad not GMapsDroidApiKeyTeilRad but the restricted version of key leads to a grayed google maps + arguments: "-appName '$(appNameShareeBikeLegacy)' -droidApiKey $(GMapsDroidApiKeyTeilRad) -iOsApiKey $(GMapsIosApiKey2TeilRad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + - task: PowerShell@2 + displayName: "Set secret Google Maps api-keys for Mein konrad." + inputs: + targetType: filePath + filePath: 'Set-GMapsApiKey.ps1' + # Parameter droidApiKey value should be GMapsDroidApiKey2TeilRad not GMapsDroidApiKeyTeilRad but the restricted version of key leads to a grayed google maps + arguments: "-appName '$(appNameMeinKonrad)' -droidApiKey $(GMapsDroidApiKeyTeilRad) -iOsApiKey $(GMapsIosApiKey2TeilRad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Download keystore file for singning. + - task: DownloadSecureFile@1 + displayName: "Download TeilRad GmbH secret keystore file." + name: TeilRadKeystoreFile + inputs: + secureFile: '$(keyStoreFile)' + + - task: DownloadSecureFile@1 + displayName: "Download HauffWare secret keystore file." + name: HauffWareKeystoreFile + inputs: + secureFile: '$(keyStoreFileHauffWare)' + + # Build the apps + - task: XamarinAndroid@1 + displayName: "Build Lastenrad Bayern." + inputs: + projectFile: '**/$(appProjectDroidLastenradBayern)' + outputDirectory: '$(outputDirectory)' + configuration: '$(buildConfiguration)' + # Password keystorePasswordTeilRad and alias keystoreNameTeilRad can be found in KeePassXC database PasswörterApp.kdbx, entry with title "Android Keystore TeilRad GmbH (App-Signing)" + msbuildArguments: '-restore -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(TeilRadKeystoreFile.secureFilePath) -p:AndroidSigningStorePass=$(keystorePasswordTeilRad) -p:AndroidSigningKeyAlias=$(keystoreNameTeilRad) -p:AndroidSigningKeyPass=$(keystorePasswordTeilRad)' + + - task: XamarinAndroid@1 + displayName: "Build sharee.bike." + inputs: + projectFile: '**/$(appProjectDroidShareeBike)' + outputDirectory: '$(outputDirectory)' + configuration: '$(buildConfiguration)' + # Password keystorePasswordHauffWare and alias keystoreNameHauffWare can be found in KeePassXC database PasswörterApp.kdbx, entry with title "Android Keystore HauffWare (App-Signing)" + msbuildArguments: '-restore -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(HauffWareKeystoreFile.secureFilePath) -p:AndroidSigningStorePass=$(keystorePasswordHauffWare) -p:AndroidSigningKeyAlias=$(keystoreNameHauffWare) -p:AndroidSigningKeyPass=$(keystorePasswordHauffWare)' + + - task: XamarinAndroid@1 + displayName: "Build Mein konrad." + inputs: + projectFile: '**/$(appProjectDroidMeinKonrad)' + outputDirectory: '$(outputDirectory)' + configuration: '$(buildConfiguration)' + # Password keystorePasswordTeilRad and alias keystoreNameTeilRad can be found in KeePassXC database PasswörterApp.kdbx, entry with title "Android Keystore TeilRad GmbH (App-Signing)" + msbuildArguments: '-restore -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(TeilRadKeystoreFile.secureFilePath) -p:AndroidSigningStorePass=$(keystorePasswordTeilRad) -p:AndroidSigningKeyAlias=$(keystoreNameTeilRad) -p:AndroidSigningKeyPass=$(keystorePasswordTeilRad)' + + # Publish siged apk as pipeline artifact + - task: PublishPipelineArtifact@1 + displayName: "Publish Lastenrad Bayern aab as artifact to azure library." + inputs: + targetPath: '$(outputDirectory)/$(appArtefactNameDroidLastenradBayern)' + artifactName: LastenradBayernAndroidAab + + # Publish siged apk as pipeline artifact + - task: PublishPipelineArtifact@1 + displayName: "Publish sharee.bike aab as artifact to azure library." + inputs: + targetPath: '$(outputDirectory)/$(appArtefactNameDroidShareeBike)' + artifactName: ShareeBikeAndroidAab + + # Publish siged apk as pipeline artifact + - task: PublishPipelineArtifact@1 + displayName: "Publish Mein konrad aab as artifact to azure library." + inputs: + targetPath: '$(outputDirectory)/$(appArtefactNameDroidMeinKonrad)' + artifactName: MeinKonradAndroidAab + + - stage: BuildLastenradBayernIosStage + displayName: "Build Lastenrad Bayern iOS." + dependsOn: RunUnitTestsStage + + # Build iOS version requires MacOS + pool: + vmImage: 'macos-12' + + jobs: + + - job: BuildLastenradBayernIos + displayName: "Build Lastenrad Bayern iOs" + + steps: + # To manually select a Xamarin SDK version on the Microsoft-hosted macOS agent, + # configure this task with the *Mono* version that is associated with the + # Xamarin SDK version that you need, and set the "enabled" property to true. + # See https://go.microsoft.com/fwlink/?linkid=871629 + - script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_12_0 + displayName: 'Select the Xamarin SDK version' + enabled: false + + # Get code from Open Source repo. + # https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#specify-multiple-repositories + - checkout: ${{ parameters.codeBase}} + + - task: NuGetToolInstaller@1 + + - task: NuGetCommand@2 + inputs: + restoreSolution: '**/$(solutionNameIosLastenradBayern)' + + # Install signing certificate to keychain + # Certificate resides in "Code Signing Certificate for Distribution TeilRad GmbH (LXJD6URCHR)" + - task: InstallAppleCertificate@2 + inputs: + certSecureFile: 'AppleDistributionCertificate_TeilRadGmbH_LXJD6URCHR_20221008.p12' + certPwd: '$(AppleDistributionCertificate_TeilRadGmbh_Password)' + keychain: 'temp' + + # Install provisioning profile + - task: InstallAppleProvisioningProfile@1 + inputs: + provisioningProfileLocation: 'secureFiles' + provProfileSecureFile: 'ProvisioningProfileLastenradBayernAppStore3.mobileprovision' + + # Set merchant-id. + - task: PowerShell@2 + displayName: "Set secret merchant-id." + inputs: + targetType: filePath + filePath: 'Set-MerchantId.ps1' + # Merchant id is defined by COPRI + arguments: "-appName '$(appNameLastenradBayern)' -merchantId $(merchantIdLastenradBayern)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Set google maps api key + - task: PowerShell@2 + displayName: "Set secret Google Maps api-keys." + inputs: + targetType: filePath + filePath: 'Set-GMapsApiKey.ps1' + arguments: "-appName '$(appNameLastenradBayern)' -droidApiKey $(GMapsDroidApiKeyTeilRad) -iOsApiKey $(GMapsIosApiKey2TeilRad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Build the app + - task: XamariniOS@2 + inputs: + solutionFile: '**/$(solutionNameIosLastenradBayern)' + configuration: '$(buildConfiguration)' + packageApp: true + buildForSimulator: false + runNugetRestore: false + signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)' + signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)' + + # Publish siged apk as pipeline artifact + - task: PublishPipelineArtifact@1 + displayName: "Publish ipa as artifact." + inputs: + targetPath: '$(appNameLastenradBayern)/TINK.iOS/bin/iPhone/$(buildConfiguration)/$(appArtefactNameIosLastenradBayern)' + artifactName: LastenradBayernIpa + + - stage: BuildShareeBikeIosStage + displayName: "Build sharee.bike iOS app" + dependsOn: RunUnitTestsStage + + # Build iOS version requires MacOS + pool: + vmImage: 'macos-12' + + jobs: + + - job: BuildShareeBikeIos + displayName: "Build sharee.bike iOs" + + steps: + # To manually select a Xamarin SDK version on the Microsoft-hosted macOS agent, + # configure this task with the *Mono* version that is associated with the + # Xamarin SDK version that you need, and set the "enabled" property to true. + # See https://go.microsoft.com/fwlink/?linkid=871629 + - script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_12_0 + displayName: 'Select the Xamarin SDK version' + enabled: false + + # Get code from Open Source repo. + # https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#specify-multiple-repositories + - checkout: ${{ parameters.codeBase}} + + - task: NuGetToolInstaller@1 + + - task: NuGetCommand@2 + inputs: + restoreSolution: '**/$(solutionNameIosShareeBike)' + + # Install signing certificate to keychain + # Certificate resides in "App-Mittagessen", entry "Code Signing Certificate for Distribution TeilRad GmbH (LXJD6URCHR)" + - task: InstallAppleCertificate@2 + inputs: + certSecureFile: 'AppleDistributionCertificate_TeilRadGmbH_LXJD6URCHR_20221008.p12' + certPwd: '$(AppleDistributionCertificate_TeilRadGmbh_Password)' + keychain: 'temp' + + # Install provisioning profile + - task: InstallAppleProvisioningProfile@1 + inputs: + provisioningProfileLocation: 'secureFiles' + provProfileSecureFile: 'ProvisioningProfileTeilRadShareeBikeAppStore3.mobileprovision' + + # Set merchant-id. + - task: PowerShell@2 + displayName: "Set secret merchant-id." + inputs: + targetType: filePath + filePath: 'Set-MerchantId.ps1' + # Merchant id is defined by COPRI + arguments: "-appName '$(appNameShareeBikeLegacy)' -merchantId $(merchantIdShareeBike)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Set google maps api key + - task: PowerShell@2 + displayName: "Set secret Google Maps api-keys." + inputs: + targetType: filePath + filePath: 'Set-GMapsApiKey.ps1' + arguments: "-appName '$(appNameShareeBikeLegacy)' -droidApiKey $(GMapsDroidApiKeyTeilRad) -iOsApiKey $(GMapsIosApiKey2TeilRad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Build the app + - task: XamariniOS@2 + inputs: + solutionFile: '**/$(solutionNameIosShareeBike)' + configuration: '$(buildConfiguration)' + packageApp: true + buildForSimulator: false + runNugetRestore: false + signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)' + signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)' + + # Publish siged apk as pipeline artifact + - task: PublishPipelineArtifact@1 + displayName: "Publish sharee.bike ipa as artifact." + inputs: + targetPath: '$(appNameShareeBikeLegacy)/TINK.iOS/bin/iPhone/$(buildConfiguration)/$(appArtefactNameIosShareeBike)' + artifactName: ShareeBikeIpa + + - stage: BuildMeinKonradIosStage + displayName: "Build Mein konrad iOS app" + dependsOn: RunUnitTestsStage + + # Build iOS version requires MacOS + pool: + vmImage: 'macos-12' + + jobs: + + - job: appNameMeinKonradBuildMeinKonradIos + displayName: "Build Mein konrad iOs" + + steps: + # To manually select a Xamarin SDK version on the Microsoft-hosted macOS agent, + # configure this task with the *Mono* version that is associated with the + # Xamarin SDK version that you need, and set the "enabled" property to true. + # See https://go.microsoft.com/fwlink/?linkid=871629 + - script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_12_0 + displayName: 'Select the Xamarin SDK version' + enabled: false + + # Get code from Open Source repo. + # https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#specify-multiple-repositories + - checkout: ${{ parameters.codeBase}} + + - task: NuGetToolInstaller@1 + + - task: NuGetCommand@2 + inputs: + restoreSolution: '**/$(solutionNameIosMeinKonrad)' + + # Install signing certificate to keychain + # Certificate resides in "App-Mittagessen", entry "Code Signing Certificate for iPhone Distribution Stadtwerke Konstanz GmbH (2SZR625MSV)" + - task: InstallAppleCertificate@2 + inputs: + certSecureFile: 'Code Signing Certificate for iPhone Distribution Stadtwerke Konstanz GmbH 2SZR625MSV.p12' + certPwd: '$(AppleDevelopmentCertificatePassword)' + keychain: 'temp' + + # Install provisioning profile + - task: InstallAppleProvisioningProfile@1 + inputs: + provisioningProfileLocation: 'secureFiles' + provProfileSecureFile: 'Meinkonrad_to_App_Store_3.mobileprovision' + + # Set merchant-id. + - task: PowerShell@2 + displayName: "Set secret merchant-id." + inputs: + targetType: filePath + filePath: 'Set-MerchantId.ps1' + # Merchant id is defined by COPRI + arguments: "-appName '$(appNameMeinKonrad)' -merchantId $(merchantIdMeinKonrad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Set google maps api key + - task: PowerShell@2 + displayName: "Set secret Google Maps api-keys." + inputs: + targetType: filePath + filePath: 'Set-GMapsApiKey.ps1' + arguments: "-appName '$(appNameMeinKonrad)' -droidApiKey $(GMapsDroidApiKeyTeilRad) -iOsApiKey $(GMapsIosApiKey2TeilRad)" + pwsh: true + workingDirectory: '$(build.SourcesDirectory)' + + # Build the app + - task: XamariniOS@2 + inputs: + solutionFile: '**/$(solutionNameIosMeinKonrad)' + configuration: '$(buildConfiguration)' + packageApp: true + buildForSimulator: false + runNugetRestore: false + signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)' + signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)' + + # Publish siged apk as pipeline artifact + - task: PublishPipelineArtifact@1 + displayName: "Publish Mein Konrad ipa as artifact to azure library." + inputs: + # Path '$(outputDirectory)/$(appArtefactNameIosMeinKonrad)' is not valid + targetPath: '$(appNameMeinKonrad)/TINK.iOS/bin/iPhone/$(buildConfiguration)/$(appArtefactNameIosMeinKonrad)' + artifactName: MeinKonradIpa + + - stage: BetaVersion + # Distribute only of all app could be build successfully. + dependsOn: + - BuildAppsDroidStage + - BuildLastenradBayernIosStage + - BuildShareeBikeIosStage + - BuildMeinKonradIosStage + displayName: "Publish all apps to MS App Center" + + # Distribution to MS App center can be on MacOS or Windows. + pool: + vmImage: 'windows-latest' + + jobs: + - job: AndroidBeta + displayName: "Publish all apps to MS App Center" + steps: + + # Download apk from pipeline artifacs + - task: DownloadPipelineArtifact@2 + displayName: "Download Lastenrad Bayern Droid artifact form azure library." + inputs: + artifact: LastenradBayernAndroidAab + + - task: DownloadPipelineArtifact@2 + displayName: "Download Lastenrad Bayern iOS artifact form azure library." + inputs: + artifact: LastenradBayernIpa + + - task: DownloadPipelineArtifact@2 + displayName: "Download sharee.bike Droid artifact form azure library." + inputs: + artifact: ShareeBikeAndroidAab + + - task: DownloadPipelineArtifact@2 + displayName: "Download sharee.bike iOS artifact form azure library." + inputs: + artifact: ShareeBikeIpa + + - task: DownloadPipelineArtifact@2 + displayName: "Download Mein konrad Droid artifact form azure library." + inputs: + artifact: MeinKonradAndroidAab + + - task: DownloadPipelineArtifact@2 + displayName: "Download Mein konrad iOS artifact form azure library." + inputs: + artifact: MeinKonradIpa + + # Checkout release notes: They are required for publishing to app center. + - checkout: ${{ parameters.codeBase}} + + # Publish singed apk to app center. + - task: AppCenterDistribute@3 + displayName: "Publish Lastenrad Bayern Droid to MS App Center." + inputs: + serverEndpoint: 'App Center' + appSlug: '$(ownerTeilRadFullName)/$(msAppCenterAppSlugLastenradBayernDroid)' + appFile: '$(Pipeline.Workspace)/$(appArtefactNameDroidLastenradBayern)' + releaseNotesOption: 'file' + releaseNotesFile: 'ReleaseNotes.txt' + destinationType: 'groups' + distributionGroupId: '$(msAppCenterDistributionGroupIdLastenradBayernDroid)' + + - task: AppCenterDistribute@3 + displayName: "Publish Lastenrad Bayern iOS to MS App Center." + inputs: + serverEndpoint: 'App Center' + appSlug: '$(ownerTeilRadFullName)/$(msAppCenterAppSlugLastenradBayernIos)' + appFile: '$(Pipeline.Workspace)/$(appArtefactNameIosLastenradBayern)' + releaseNotesOption: 'file' + releaseNotesFile: 'ReleaseNotes.txt' + destinationType: 'groups' + distributionGroupId: '$(msAppCenterDistributionGroupIdLastenradBayernIos)' + + - task: PublishPipelineArtifact@1 + inputs: + targetPath: '$(appNameLastenradBayern)/TINK.iOS/Entitlements.plist' + artifactName: EntitlementsLastenradBayern + + - task: AppCenterDistribute@3 + displayName: "Publish sharee.bike Droid to MS App Center." + inputs: + serverEndpoint: 'App Center' + appSlug: '$(ownerHauffWareFullName)/$(msAppCenterAppSlugShareeBikeDroid)' + appFile: '$(Pipeline.Workspace)/$(appArtefactNameDroidShareeBike)' + releaseNotesOption: 'file' + releaseNotesFile: 'ReleaseNotes.txt' + destinationType: 'groups' + distributionGroupId: '$(msAppCenterDistributionGroupIdShareeBikeDroid)' + + - task: AppCenterDistribute@3 + displayName: "Publish sharee.bike iOS to MS App Center." + inputs: + serverEndpoint: 'App Center' + appSlug: '$(ownerTeilRadFullName)/$(msAppCenterAppSlugShareeBikeIos)' + appFile: '$(Pipeline.Workspace)/$(appArtefactNameIosShareeBike)' + releaseNotesOption: 'file' + releaseNotesFile: 'ReleaseNotes.txt' + destinationType: 'groups' + distributionGroupId: '$(msAppCenterDistributionGroupIdShareeBikeIos)' + - task: PublishPipelineArtifact@1 + inputs: + targetPath: '$(appNameShareeBikeLegacy)/TINK.iOS/Entitlements.plist' + artifactName: EntitlementsShareeBike + + - task: AppCenterDistribute@3 + displayName: "Publish Mein konrad Droid to MS App Center." + inputs: + serverEndpoint: 'App Center' + appSlug: '$(ownerTeilRadFullName)/$(msAppCenterAppSlugMeinKonrad)' + appFile: '$(Pipeline.Workspace)/$(appArtefactNameDroidMeinKonrad)' + releaseNotesOption: 'file' + releaseNotesFile: 'ReleaseNotes.txt' + destinationType: 'groups' + distributionGroupId: '$(msAppCenterDistributionGroupIdMeinKonradDroid)' + + - task: AppCenterDistribute@3 + displayName: "Publish Mein konrad iOS to MS App Center." + inputs: + serverEndpoint: 'App Center' + appSlug: '$(ownerTeilRadFullName)/$(msAppCenterAppSlugMeinKonradIos)' + appFile: '$(Pipeline.Workspace)/$(appArtefactNameIosMeinKonrad)' + releaseNotesOption: 'file' + releaseNotesFile: 'ReleaseNotes.txt' + destinationType: 'groups' + distributionGroupId: '$(msAppCenterDistributionGroupIdMeinKonradIos)' + - task: PublishPipelineArtifact@1 + inputs: + targetPath: '$(appNameMeinKonrad)/TINK.iOS/Entitlements.plist' + artifactName: EntitlementsMeinKonrad