diff --git a/azure-devops/azure-devops-api.ps1 b/azure-devops/azure-devops-api.ps1 index bb5ed1e..f928ce7 100644 --- a/azure-devops/azure-devops-api.ps1 +++ b/azure-devops/azure-devops-api.ps1 @@ -56,6 +56,15 @@ class AzureDevOpsApi return $this.InvokeRestMethod($url, 'GET', $null) } + [object] UpdateBuildStatus([UInt32]$BuildId, [string]$BuildStatus){ + $url = "build/builds/$BuildId" + $body = @{ + status = $BuildStatus + } | ConvertTo-Json + + return $this.InvokeRestMethod($url, 'PATCH', $body) + } + [string] hidden BuildUrl([string]$Url) { return "$($this.BaseUrl)/${Url}/?api-version=5.1" } diff --git a/azure-pipelines/get-tool-versions.yml b/azure-pipelines/get-tool-versions.yml new file mode 100644 index 0000000..629c224 --- /dev/null +++ b/azure-pipelines/get-tool-versions.yml @@ -0,0 +1,48 @@ +name: $(date:yyyyMMdd)$(rev:.r) +trigger: none +pr: none +schedules: +- cron: "0 3 * * *" + displayName: First daily build + branches: + include: + - master + always: true +- cron: "0 15 * * *" + displayName: Second daily build + branches: + include: + - master + always: true + +variables: + PoolName: 'Azure Pipelines' + VmImage: 'ubuntu-18.04' + +stages: +- stage: Get_New_Versions + dependsOn: [] + jobs: + - job: Get_Tool_Versions + pool: + name: $(PoolName) + vmImage: $(VmImage) + steps: + - template: /azure-pipelines/templates/get-tool-versions-steps.yml + +- stage: Trigger_Builds + dependsOn: Get_New_Versions + jobs: + - deployment: Run_Builds + pool: + name: $(PoolName) + vmImage: $(VmImage) + variables: + ToolVersions: $[ stageDependencies.Get_New_Versions.Get_Tool_Versions.outputs['Get_versions.TOOL_VERSIONS'] ] + timeoutInMinutes: 180 + environment: 'Get Available Tools Versions - Publishing Approval' + strategy: + runOnce: + deploy: + steps: + - template: /azure-pipelines/templates/run-ci-builds-steps.yml diff --git a/azure-pipelines/templates/get-tool-versions-steps.yml b/azure-pipelines/templates/get-tool-versions-steps.yml new file mode 100644 index 0000000..4dae6fc --- /dev/null +++ b/azure-pipelines/templates/get-tool-versions-steps.yml @@ -0,0 +1,47 @@ +steps: +- task: PowerShell@2 + displayName: 'Get new versions' + name: 'Get_versions' + inputs: + targetType: filePath + filePath: './get-new-tool-versions/get-new-tool-versions.ps1' + arguments: | + -DistURL "$(DIST_URL)" ` + -ManifestLink "$(MANIFEST_URL)" ` + -VersionFilterToInclude $(INCLUDE_FILTER) ` + -VersionFilterToExclude $(EXCLUDE_FILTER) + +- task: PowerShell@2 + displayName: 'Cancel build' + condition: and(succeeded(), eq(variables['Get_versions.TOOL_VERSIONS'], '')) + inputs: + TargetType: inline + script: | + Import-Module "./azure-devops/azure-devops-api.ps1" + $azureDevOpsApi = Get-AzureDevOpsApi -TeamFoundationCollectionUri $(System.TeamFoundationCollectionUri) ` + -ProjectName $(System.TeamProject) ` + -AccessToken $(System.AccessToken) + + $AzureDevOpsApi.UpdateBuildStatus($(Build.BuildId), 'Cancelling') | Out-Null + +- task: PowerShell@2 + displayName: 'Set env variable' + condition: and(succeeded(), ne(variables['Get_versions.TOOL_VERSIONS'], '')) + inputs: + TargetType: inline + script: | + $PipelineUrl = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_build/results?buildId=$(Build.BuildId)" + Write-Output "##vso[task.setvariable variable=PIPELINE_URL]$PipelineUrl" + +- task: PowerShell@2 + displayName: 'Send Slack notification' + condition: and(succeeded(), ne(variables['Get_versions.TOOL_VERSIONS'], '')) + inputs: + targetType: filePath + filePath: './get-new-tool-versions/send-slack-notification.ps1' + arguments: | + -Url "$(SLACK_CHANNEL_URL)" ` + -ToolName "$(TOOL_NAME)" ` + -ToolVersion "$(Get_versions.TOOL_VERSIONS)" ` + -PipelineUrl "$(PIPELINE_URL)" ` + -ImageUrl "$(IMAGE_URL)" diff --git a/azure-pipelines/templates/run-ci-builds-steps.yml b/azure-pipelines/templates/run-ci-builds-steps.yml new file mode 100644 index 0000000..f5a6634 --- /dev/null +++ b/azure-pipelines/templates/run-ci-builds-steps.yml @@ -0,0 +1,29 @@ +steps: +- checkout: self + +- task: PowerShell@2 + displayName: 'Get source version' + inputs: + TargetType: inline + script: | + $url = "https://api.github.com/repos/$(REPOSITORY)/commits/$(BRANCH)" + $commit = Invoke-RestMethod -Uri $url -Method "GET" + Write-Output "##vso[task.setvariable variable=COMMIT_SHA]$($commit.sha)" + +- task: PowerShell@2 + displayName: 'Run builds' + inputs: + targetType: filePath + filePath: './azure-devops/run-ci-builds.ps1' + arguments: | + -TeamFoundationCollectionUri $(System.TeamFoundationCollectionUri) ` + -AzureDevOpsProjectName $(System.TeamProject) ` + -AzureDevOpsAccessToken $(System.AccessToken) ` + -SourceBranch $(BRANCH) ` + -DefinitionId $(DEFINITION_ID) ` + -SourceVersion $(COMMIT_SHA) ` + -ManifestLink $(MANIFEST_URL) ` + -WaitForBuilds $(WAIT_FOR_BUILDS) ` + -ToolVersions "$(ToolVersions)" ` + -RetryIntervalSec $(INTERVAL_SEC) ` + -RetryCount $(RETRY_COUNT) diff --git a/get-new-tool-versions/get-new-tool-versions.ps1 b/get-new-tool-versions/get-new-tool-versions.ps1 index c6f42fe..af4b1a8 100644 --- a/get-new-tool-versions/get-new-tool-versions.ps1 +++ b/get-new-tool-versions/get-new-tool-versions.ps1 @@ -72,8 +72,9 @@ $versionsToBuild = Skip-ExistingVersions -VersionsFromManifest $versionsFromMani if ($versionsToBuild) { $availableVersions = $versionsToBuild -join "," - Write-Host "The following versions are available to build:`n$availableVersions" - Write-Output "##vso[task.setvariable variable=TOOL_VERSIONS]$availableVersions" + $toolVersions = $availableVersions.Replace(",",", ") + Write-Host "The following versions are available to build:`n$toolVersions" + Write-Output "##vso[task.setvariable variable=TOOL_VERSIONS;isOutput=true]$toolVersions" } else { Write-Host "There aren't versions to build" } diff --git a/get-new-tool-versions/send-slack-notification.ps1 b/get-new-tool-versions/send-slack-notification.ps1 index 0e6fbc5..75441e9 100644 --- a/get-new-tool-versions/send-slack-notification.ps1 +++ b/get-new-tool-versions/send-slack-notification.ps1 @@ -60,4 +60,3 @@ $jsonBodyMessage = @" # Send Slack message $null = Send-SlackPostMessageIncomingWebHook -Uri $url -Body $jsonBodyMessage -Write-Host "Message template: `n $jsonBodyMessage"