parameters: - name: DeploymentType displayName: Type of Deployment Stage type: string values: - Beta - Production - name: DependsOn displayName: Depends On type: string - name: ApplicationName type: string - name: PublishFolder type: string - name: RepositoryFolder type: string - name: GitEmail type: string - name: GitUsername type: string stages: - stage: deploy${{parameters.DeploymentType}} displayName: ${{parameters.DeploymentType}} lockBehavior: runLatest condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/source')) dependsOn: - build - ${{ if ne(parameters.DependsOn, 'build') }}: - deploy${{parameters.DependsOn}} jobs: - deployment: deploy${{parameters.DeploymentType}} displayName: Deploy ${{parameters.DeploymentType}} environment: github-${{ lower(parameters.DeploymentType) }} workspace: clean: all variables: - name: NewVersionBuild value: $(VersionBuild) - name: NewVersionRevision value: $(VersionRevision) strategy: runOnce: deploy: steps: - task: PowerShell@2 displayName: Write Deployment Parameters condition: contains(variables['system.debug'], 'true') inputs: targetType: inline script: | Write-Host "DeploymentType: ${{parameters.DeploymentType}}" Write-Host "DependsOn: ${{parameters.DependsOn}}" Write-Host "ApplicationName: ${{parameters.ApplicationName}}" Write-Host "PublishFolder: ${{parameters.PublishFolder}}" Write-Host "RepositoryFolder: ${{parameters.RepositoryFolder}}" Write-Host "GitEmail: ${{parameters.GitEmail}}" Write-Host "GitUsername: ${{parameters.GitUsername}}" pwsh: true - task: PowerShell@2 displayName: Write Environment Variables condition: contains(variables['system.debug'], 'true') inputs: targetType: inline script: '(gci env:*).GetEnumerator() | Sort-Object Name | Out-String' pwsh: true - checkout: MasterRepo persistCredentials: true - task: PowerShell@2 displayName: Pull Master Repository Files env: DEPLOY_BUILDNUMBER: $(Build.BuildNumber) DEPLOY_SOURCESDIRECTORY: $(Build.SourcesDirectory) inputs: targetType: inline script: | Write-Host "Setting up the global configuration" git config --global user.email "${{parameters.GitEmail}}" git config --global user.name "${{parameters.GitUsername}}" Write-Host "Performing Git Checkout" git checkout -b master Write-Host "Performing Git Fetch" git fetch Write-Host "Performing Git Branch" git branch --set-upstream-to=origin/master master Write-Host "Performing Git Pull" git pull --force pwsh: true workingDirectory: '$(Build.SourcesDirectory)' - task: PowerShell@2 displayName: Copy ${{parameters.DeploymentType}} Files env: DEPLOY_BUILDNUMBER: $(Build.BuildNumber) DEPLOY_PUBLISHDIRECTORY: "$(Agent.BuildDirectory)/${{parameters.PublishFolder}}" DEPLOY_REPODIRECTORY: "$(Build.SourcesDirectory)/${{parameters.RepositoryFolder}}" inputs: targetType: inline script: | $appVersion = $env:DEPLOY_BUILDNUMBER $appVersionShort = $appVersion.Substring(0, $appVersion.LastIndexOf('.')) if (!(Test-Path $env:DEPLOY_PUBLISHDIRECTORY)) { throw "Source directory does not exist or could not be found ($env:DEPLOY_PUBLISHDIRECTORY)" } if (!(Test-Path $env:DEPLOY_REPODIRECTORY)) { New-Item -Path "$env:DEPLOY_REPODIRECTORY" -ItemType Directory -Force } # copy common files Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\en-US.xaml" -Destination "$env:DEPLOY_REPODIRECTORY" -Force Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\latest.zip" -Destination "$env:DEPLOY_REPODIRECTORY" -Force # copy beta specific files if ('${{parameters.DeploymentType}}' -eq 'Beta') { Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\latestBeta.txt" -Destination "$env:DEPLOY_REPODIRECTORY\latest.txt" -Force Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\VersionFeedBeta.xml" -Destination "$env:DEPLOY_REPODIRECTORY\VersionFeed.xml" -Force } # copy production specific files if ('${{parameters.DeploymentType}}' -eq 'Production') { $applicationFilenamePrefix = "${{parameters.ApplicationName}}_$appVersionShort" Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\$applicationFilenamePrefix.exe" -Destination "$env:DEPLOY_REPODIRECTORY" -Force Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\$applicationFilenamePrefix.zip" -Destination "$env:DEPLOY_REPODIRECTORY" -Force Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\latest.exe" -Destination "$env:DEPLOY_REPODIRECTORY" -Force Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\latest.txt" -Destination "$env:DEPLOY_REPODIRECTORY" -Force Copy-Item -Path "$env:DEPLOY_PUBLISHDIRECTORY\VersionFeed.xml" -Destination "$env:DEPLOY_REPODIRECTORY" -Force } pwsh: true - task: PowerShell@2 displayName: Commit ${{parameters.DeploymentType}} Files env: DEPLOY_BUILDNUMBER: $(Build.BuildNumber) DEPLOY_SOURCESDIRECTORY: $(Build.SourcesDirectory) inputs: targetType: inline script: | $appVersion = $env:DEPLOY_BUILDNUMBER $appVersionShort = $appVersion.Substring(0, $appVersion.LastIndexOf('.')) Write-Host "Setting up the global configuration" git config --global user.email "${{parameters.GitEmail}}" git config --global user.name "${{parameters.GitUsername}}" Write-Host "Performing Git Add" git add -A Write-Host "Performing Git Commit" if ('${{parameters.DeploymentType}}' -eq 'Beta') { git commit -m "${{parameters.ApplicationName}} Beta $appVersion" } if ('${{parameters.DeploymentType}}' -eq 'Production') { git commit -m "${{parameters.ApplicationName}} $appVersionShort" } Write-Host "Performing Git Push" git push --set-upstream origin master --porcelain --force pwsh: true workingDirectory: '$(Build.SourcesDirectory)' - ${{ if eq(parameters.DeploymentType, 'Beta') }}: - pwsh: | [int]$oldValue = $(NewVersionRevision) [int]$newValue = $oldValue + 1 Write-Host "##vso[task.setvariable variable=NewVersionRevision;]$newValue" displayName: Set New Pipeline Version Variable Values - ${{ if eq(parameters.DeploymentType, 'Production') }}: - pwsh: | [int]$oldValue = $(NewVersionBuild) [int]$newValue = $oldValue + 1 Write-Host "##vso[task.setvariable variable=NewVersionBuild;]$newValue" [int]$newValue = 1 Write-Host "##vso[task.setvariable variable=NewVersionRevision;]$newValue" displayName: Set New Pipeline Version Variable Values - template: update-pipeline-variable.yml parameters: VariableName: 'VersionBuild' VariableValue: $(NewVersionBuild) - template: update-pipeline-variable.yml parameters: VariableName: 'VersionRevision' VariableValue: $(NewVersionRevision) - template: clean-agent-folders.yml parameters: CleanArtifactsFolder: true CleanBinariesFolder: true CleanSourcesFolder: true CleanPublishFolder: true PublishFolder: $(PublishFolder)