ci: untested cut at updating CI for Cranko
This commit is contained in:
Родитель
9be33c07a2
Коммит
635a721c6a
|
@ -1,95 +0,0 @@
|
||||||
# Azure Pipelines: build the Webclient
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
# Note that this pipeline will still run on pull requests. However,
|
|
||||||
# operations that require service connections -- namely the AzureFileCopy --
|
|
||||||
# will be skipped on PR builds, so randos can't just update our website by
|
|
||||||
# submitting a PR.
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- master
|
|
||||||
- "refs/tags/v*"
|
|
||||||
|
|
||||||
pool:
|
|
||||||
# We need to run on Windows to take advantage of the AzureFileCopy@3 task.
|
|
||||||
vmImage: 'windows-latest'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- powershell: |
|
|
||||||
$branch = "$(Build.SourceBranch)"
|
|
||||||
if($branch.StartsWith("refs/tags/v")) {
|
|
||||||
$version = $branch.Substring(11)
|
|
||||||
Write-Host "##vso[task.setvariable variable=pub_prefix;]webclient"
|
|
||||||
Write-Host "##vso[task.setvariable variable=profile;]prod"
|
|
||||||
} else {
|
|
||||||
# Won't actually get published on PRs, etc.
|
|
||||||
Write-Host "##vso[task.setvariable variable=pub_prefix;]testing_webclient"
|
|
||||||
Write-Host "##vso[task.setvariable variable=profile;]testing"
|
|
||||||
}
|
|
||||||
displayName: Set deployment parameters
|
|
||||||
|
|
||||||
- task: Npm@1
|
|
||||||
displayName: NPM install
|
|
||||||
inputs:
|
|
||||||
command: 'install'
|
|
||||||
|
|
||||||
- task: Grunt@0
|
|
||||||
displayName: Build distribution directory with Grunt
|
|
||||||
inputs:
|
|
||||||
gruntFile: 'Gruntfile.js'
|
|
||||||
targets: 'dist-$(profile)'
|
|
||||||
|
|
||||||
- task: CopyFiles@2
|
|
||||||
displayName: Copy dist directory to artifact staging
|
|
||||||
inputs:
|
|
||||||
sourceFolder: '$(build.sourcesDirectory)/dist'
|
|
||||||
targetFolder: '$(build.artifactStagingDirectory)'
|
|
||||||
|
|
||||||
- task: PublishPipelineArtifact@1
|
|
||||||
displayName: Publish web deployment artifacts
|
|
||||||
inputs:
|
|
||||||
targetPath: '$(build.artifactStagingDirectory)'
|
|
||||||
publishLocation: 'pipeline'
|
|
||||||
artifactName: wwt-webclient-deployment
|
|
||||||
|
|
||||||
- task: AzureFileCopy@3
|
|
||||||
displayName: Publish artifacts to Azure Blob storage
|
|
||||||
inputs:
|
|
||||||
SourcePath: '$(build.artifactStagingDirectory)'
|
|
||||||
azureSubscription: 'aas@wwtadmindotnetfoundation'
|
|
||||||
Destination: 'AzureBlob'
|
|
||||||
storage: 'wwtwebstatic'
|
|
||||||
ContainerName: '$web'
|
|
||||||
blobPrefix: '$(pub_prefix)'
|
|
||||||
|
|
||||||
# For annoying reasons, we have to include a default.aspx file that does a
|
|
||||||
# JavaScript redirection. In order for that to work, we have to tell the web
|
|
||||||
# server to serve up the file with a non-default "text/html" Content-Type.
|
|
||||||
# This task does the setting. Note that the service principal associated with
|
|
||||||
# the azureSubscription account needs to be set up with the "Storage Blob Data
|
|
||||||
# Contribtor" role on the storage account in order for this to work.
|
|
||||||
|
|
||||||
- task: AzurePowerShell@4
|
|
||||||
displayName: Update Azure Blob storage content types
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'aas@wwtadmindotnetfoundation'
|
|
||||||
azurePowerShellVersion: 'LatestVersion'
|
|
||||||
scriptType: 'inlineScript'
|
|
||||||
inline: |
|
|
||||||
$ctxt = New-AzStorageContext -UseConnectedAccount -StorageAccountName "wwtwebstatic"
|
|
||||||
$blob = Get-AzStorageBlob -Context $ctxt -Container '$web' -Blob "$(pub_prefix)/default.aspx"
|
|
||||||
$blob.ICloudBlob.Properties.ContentType = "text/html"
|
|
||||||
$blob.ICloudBlob.SetProperties()
|
|
||||||
|
|
||||||
- task: AzurePowerShell@4
|
|
||||||
displayName: Purge CDN
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'aas@wwtadmindotnetfoundation'
|
|
||||||
azurePowerShellVersion: 'LatestVersion'
|
|
||||||
scriptType: 'inlineScript'
|
|
||||||
inline: |
|
|
||||||
Unpublish-AzCdnEndpointContent `
|
|
||||||
-ProfileName wwt-cdn-01 `
|
|
||||||
-ResourceGroupName wwt-web01 `
|
|
||||||
-EndpointName wwtweb-prod `
|
|
||||||
-PurgeContent '/$(pub_prefix)/*'
|
|
|
@ -0,0 +1,146 @@
|
||||||
|
# Copyright 2020 the .NET Foundation
|
||||||
|
# Licensed under the MIT License
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: isMainDev
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
- name: isRelease
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# Deployment jobs that might happen on updates to either `master` *or* `rc`.
|
||||||
|
# On updates to master, we deploy everything under the "latest" name. On
|
||||||
|
# updates to `rc`, we deploy some subset of the projects that can only be
|
||||||
|
# determined at runtime.
|
||||||
|
|
||||||
|
- job: deploy
|
||||||
|
pool:
|
||||||
|
vmImage: windows-latest
|
||||||
|
variables:
|
||||||
|
- group: Deployment Credentials
|
||||||
|
steps:
|
||||||
|
- template: azure-job-setup.yml
|
||||||
|
|
||||||
|
- bash: |
|
||||||
|
set -euo pipefail
|
||||||
|
if [[ ${isMainDev} == True ]] ; then
|
||||||
|
tag=testing_webclient
|
||||||
|
elif cranko show if-released --exit-code @wwtelescope/webclient ; then
|
||||||
|
tag=webclient
|
||||||
|
else
|
||||||
|
# This should never happen in the current setup, but doesn't hurt
|
||||||
|
# to future-proof.
|
||||||
|
tag=skip
|
||||||
|
fi
|
||||||
|
echo "webclient deployment tag: $isMainDev, $isRelease => $tag"
|
||||||
|
echo "##vso[task.setvariable variable=WEBCLIENT_DEPLOYMENT_TAG;]$tag"
|
||||||
|
displayName: Determine deployment tag
|
||||||
|
env:
|
||||||
|
isMainDev: ${{ parameters.isMainDev }}
|
||||||
|
isRelease: ${{ parameters.isRelease }}
|
||||||
|
|
||||||
|
- task: AzureFileCopy@3
|
||||||
|
condition: and(succeeded(), ne(variables['WEBCLIENT_DEPLOYMENT_TAG'], 'skip'))
|
||||||
|
displayName: Deploy webclient artifacts
|
||||||
|
inputs:
|
||||||
|
SourcePath: '$(Pipeline.Workspace)/webclient-dist'
|
||||||
|
azureSubscription: 'aas@wwtadmindotnetfoundation'
|
||||||
|
Destination: 'AzureBlob'
|
||||||
|
storage: 'wwtwebstatic'
|
||||||
|
ContainerName: '$web'
|
||||||
|
blobPrefix: '$(WEBCLIENT_DEPLOYMENT_TAG)'
|
||||||
|
|
||||||
|
# For annoying reasons, we have to include a default.aspx file that does a
|
||||||
|
# JavaScript redirection. In order for that to work, we have to tell the web
|
||||||
|
# server to serve up the file with a non-default "text/html" Content-Type.
|
||||||
|
# This task does the setting. Note that the service principal associated with
|
||||||
|
# the azureSubscription account needs to be set up with the "Storage Blob Data
|
||||||
|
# Contribtor" role on the storage account in order for this to work.
|
||||||
|
|
||||||
|
- task: AzurePowerShell@4
|
||||||
|
condition: and(succeeded(), ne(variables['WEBCLIENT_DEPLOYMENT_TAG'], 'skip'))
|
||||||
|
displayName: Update Azure Blob storage content types
|
||||||
|
inputs:
|
||||||
|
azureSubscription: 'aas@wwtadmindotnetfoundation'
|
||||||
|
azurePowerShellVersion: 'LatestVersion'
|
||||||
|
scriptType: 'inlineScript'
|
||||||
|
inline: |
|
||||||
|
$ctxt = New-AzStorageContext -UseConnectedAccount -StorageAccountName "wwtwebstatic"
|
||||||
|
$blob = Get-AzStorageBlob -Context $ctxt -Container '$web' -Blob "$(WEBCLIENT_DEPLOYMENT_TAG)/default.aspx"
|
||||||
|
$blob.ICloudBlob.Properties.ContentType = "text/html"
|
||||||
|
$blob.ICloudBlob.SetProperties()
|
||||||
|
|
||||||
|
- task: AzurePowerShell@4
|
||||||
|
condition: and(succeeded(), ne(variables['WEBCLIENT_DEPLOYMENT_TAG'], 'skip'))
|
||||||
|
displayName: CDN purge - webclient artifacts
|
||||||
|
inputs:
|
||||||
|
azureSubscription: 'aas@wwtadmindotnetfoundation'
|
||||||
|
azurePowerShellVersion: 'LatestVersion'
|
||||||
|
scriptType: 'inlineScript'
|
||||||
|
inline: |
|
||||||
|
Unpublish-AzCdnEndpointContent `
|
||||||
|
-ProfileName wwt-cdn-01 `
|
||||||
|
-ResourceGroupName wwt-web01 `
|
||||||
|
-EndpointName wwtweb-prod `
|
||||||
|
-PurgeContent '/$(WEBCLIENT_DEPLOYMENT_TAG)/*'
|
||||||
|
|
||||||
|
|
||||||
|
# Deployment jobs that should only happen on updates to `rc`, i.e.
|
||||||
|
# primary releases.
|
||||||
|
|
||||||
|
- ${{ if parameters.isRelease }}:
|
||||||
|
- job: branch_and_tag
|
||||||
|
pool:
|
||||||
|
vmImage: ubuntu-20.04
|
||||||
|
variables:
|
||||||
|
- group: Deployment Credentials
|
||||||
|
steps:
|
||||||
|
- template: azure-job-setup.yml
|
||||||
|
parameters:
|
||||||
|
setupGit: true
|
||||||
|
- bash: |
|
||||||
|
set -xeou pipefail
|
||||||
|
cranko release-workflow tag
|
||||||
|
git push --tags origin release:release
|
||||||
|
displayName: Tag and push
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: $(GITHUB_TOKEN)
|
||||||
|
|
||||||
|
- job: github_releases
|
||||||
|
dependsOn: branch_and_tag # otherwise, GitHub creates the tags itself!
|
||||||
|
pool:
|
||||||
|
vmImage: ubuntu-20.04
|
||||||
|
variables:
|
||||||
|
- group: Deployment Credentials
|
||||||
|
steps:
|
||||||
|
- template: azure-job-setup.yml
|
||||||
|
parameters:
|
||||||
|
setupGit: true
|
||||||
|
- bash: |
|
||||||
|
set -xeou pipefail
|
||||||
|
cranko github create-releases
|
||||||
|
displayName: Create GitHub releases
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: $(GITHUB_TOKEN)
|
||||||
|
|
||||||
|
- job: npm_publish
|
||||||
|
pool:
|
||||||
|
vmImage: ubuntu-20.04
|
||||||
|
variables:
|
||||||
|
- group: Deployment Credentials
|
||||||
|
steps:
|
||||||
|
- template: azure-job-setup.yml
|
||||||
|
parameters:
|
||||||
|
setupBuild: true
|
||||||
|
setupNpm: true
|
||||||
|
- bash: npm run build
|
||||||
|
displayName: NPM build
|
||||||
|
- bash: |
|
||||||
|
set -xeou pipefail
|
||||||
|
cranko npm foreach-released npm publish
|
||||||
|
displayName: Publish to NPM
|
||||||
|
- bash: shred ~/.npmrc
|
||||||
|
displayName: Clean up credentials
|
|
@ -0,0 +1,75 @@
|
||||||
|
# Copyright 2020 the .NET Foundation
|
||||||
|
# Licensed under the MIT License
|
||||||
|
|
||||||
|
# Setup steps for the deployment processes.
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: setupGit
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
- name: setupNpm
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- download: current
|
||||||
|
|
||||||
|
- checkout: self
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- bash: |
|
||||||
|
set -euo pipefail
|
||||||
|
d="$(mktemp -d /tmp/cranko.XXXXXX)"
|
||||||
|
cd "$d"
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://pkgw.github.io/cranko/fetch-latest.sh | sh
|
||||||
|
echo "##vso[task.prependpath]$d"
|
||||||
|
displayName: Install latest Cranko (not Windows)
|
||||||
|
condition: and(succeeded(), ne(variables['Agent.OS'], 'Windows_NT'))
|
||||||
|
|
||||||
|
- pwsh: |
|
||||||
|
$d = Join-Path $Env:Temp cranko-$(New-Guid)
|
||||||
|
[void][System.IO.Directory]::CreateDirectory($d)
|
||||||
|
cd $d
|
||||||
|
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
||||||
|
iex ((New-Object System.Net.WebClient).DownloadString('https://pkgw.github.io/cranko/fetch-latest.ps1'))
|
||||||
|
echo "##vso[task.prependpath]$d"
|
||||||
|
displayName: Install latest Cranko (Windows)
|
||||||
|
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
|
||||||
|
|
||||||
|
# work around https://github.com/microsoft/azure-pipelines-tasks/issues/10653
|
||||||
|
# also note that `set -x` messes up `task.setvariable`
|
||||||
|
- bash: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
PIPELINE_WORKSPACE="$(Pipeline.Workspace)"
|
||||||
|
ARTIFACT_STAGING="$(Build.ArtifactStagingDirectory)"
|
||||||
|
|
||||||
|
if [[ $AGENT_OS == Windows_NT ]] ; then
|
||||||
|
PIPELINE_WORKSPACE=$(echo "$PIPELINE_WORKSPACE" | sed -e 's|\\|\/|g' -e 's|^\([A-Za-z]\)\:/\(.*\)|/\L\1\E/\2|')
|
||||||
|
ARTIFACT_STAGING=$(echo "$ARTIFACT_STAGING" | sed -e 's|\\|\/|g' -e 's|^\([A-Za-z]\)\:/\(.*\)|/\L\1\E/\2|')
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "##vso[task.setvariable variable=PIPELINE_WORKSPACE;]$PIPELINE_WORKSPACE"
|
||||||
|
echo "##vso[task.setvariable variable=ARTIFACT_STAGING;]$ARTIFACT_STAGING"
|
||||||
|
displayName: Ensure bash-friendly variable names
|
||||||
|
|
||||||
|
- bash: |
|
||||||
|
set -xeuo pipefail
|
||||||
|
git switch -c release
|
||||||
|
git pull --ff-only $PIPELINE_WORKSPACE/git-release/release.bundle
|
||||||
|
displayName: Restore release commit
|
||||||
|
|
||||||
|
- ${{ if parameters.setupGit }}:
|
||||||
|
- bash: |
|
||||||
|
cranko github install-credential-helper
|
||||||
|
displayName: Set up Git pushes
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: $(GITHUB_TOKEN)
|
||||||
|
|
||||||
|
- ${{ if parameters.setupNpm }}:
|
||||||
|
- bash: |
|
||||||
|
cranko npm install-token
|
||||||
|
displayName: Set up NPM authentication
|
||||||
|
env:
|
||||||
|
NPM_TOKEN: $(NPM_TOKEN)
|
|
@ -0,0 +1,59 @@
|
||||||
|
# Copyright 2020 the .NET Foundation
|
||||||
|
# Licensed under the MIT License
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: build_linux
|
||||||
|
pool:
|
||||||
|
vmImage: ubuntu-20.04
|
||||||
|
|
||||||
|
# Cranko: make and publish release commit
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- bash: |
|
||||||
|
set -euo pipefail
|
||||||
|
d="$(mktemp -d /tmp/cranko.XXXXXX)"
|
||||||
|
cd "$d"
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://pkgw.github.io/cranko/fetch-latest.sh | sh
|
||||||
|
echo "##vso[task.prependpath]$d"
|
||||||
|
displayName: Install latest Cranko (not Windows)
|
||||||
|
condition: and(succeeded(), ne(variables['Agent.OS'], 'Windows_NT'))
|
||||||
|
|
||||||
|
- bash: |
|
||||||
|
set -xeuo pipefail
|
||||||
|
cranko release-workflow apply-versions
|
||||||
|
git add .
|
||||||
|
cranko release-workflow commit
|
||||||
|
git show HEAD
|
||||||
|
displayName: Make release commit
|
||||||
|
|
||||||
|
- bash: |
|
||||||
|
artifact_dir="$(Build.ArtifactStagingDirectory)/git-release"
|
||||||
|
mkdir -p "$artifact_dir"
|
||||||
|
git bundle create "$artifact_dir/release.bundle" origin/master..HEAD
|
||||||
|
displayName: Bundle release commit
|
||||||
|
|
||||||
|
- task: PublishPipelineArtifact@1
|
||||||
|
displayName: Publish release git bundle artifact
|
||||||
|
inputs:
|
||||||
|
targetPath: '$(Build.ArtifactStagingDirectory)/git-release'
|
||||||
|
artifactName: git-release
|
||||||
|
|
||||||
|
# Main build:
|
||||||
|
|
||||||
|
- task: Npm@1
|
||||||
|
displayName: NPM install
|
||||||
|
inputs:
|
||||||
|
command: 'install'
|
||||||
|
|
||||||
|
- task: Grunt@0
|
||||||
|
displayName: Build distribution directory with Grunt
|
||||||
|
inputs:
|
||||||
|
gruntFile: 'Gruntfile.js'
|
||||||
|
targets: 'dist-$(profile)'
|
||||||
|
|
||||||
|
- task: PublishPipelineArtifact@1
|
||||||
|
displayName: Publish web deployment artifacts
|
||||||
|
inputs:
|
||||||
|
targetPath: 'dist'
|
||||||
|
publishLocation: 'pipeline'
|
||||||
|
artifactName: webclient-dist
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Copyright 2020 the .NET Foundation
|
||||||
|
# Licensed under the MIT License
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branches:
|
||||||
|
include:
|
||||||
|
- master
|
||||||
|
- rc
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- stage: MainBuild
|
||||||
|
jobs:
|
||||||
|
- template: azure-main-build.yml
|
||||||
|
|
||||||
|
- stage: Deploy
|
||||||
|
condition: and(succeeded('MainBuild'), ne(variables['build.reason'], 'PullRequest'))
|
||||||
|
jobs:
|
||||||
|
- template: azure-deployment.yml
|
||||||
|
parameters:
|
||||||
|
isMainDev: ${{ ne(variables['Build.SourceBranchName'], 'rc') }}
|
||||||
|
isRelease: ${{ eq(variables['Build.SourceBranchName'], 'rc') }}
|
Загрузка…
Ссылка в новой задаче