Publish libraries #67
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: Publish libraries | |
on: | |
workflow_dispatch: | |
inputs: | |
dry-run: | |
description: 'Dry run' | |
required: true | |
type: boolean | |
default: true | |
schedule: | |
- cron: '49 3 * * 1' # 3:49 AM UTC every Monday | |
jobs: | |
preflight: | |
name: Preflight | |
runs-on: ubuntu-20.04 | |
outputs: | |
dry-run: ${{ steps.get-dry-run.outputs.dry-run }} | |
steps: | |
- name: Get dry run | |
id: get-dry-run | |
shell: pwsh | |
run: | | |
Set-PSDebug -Trace 1 | |
$IsDryRun = '${{ github.event.inputs.dry-run }}' -Eq 'true' -Or '${{ github.event_name }}' -Eq 'schedule' | |
if ($IsDryRun) { | |
echo "dry-run=true" >> $Env:GITHUB_OUTPUT | |
} else { | |
echo "dry-run=false" >> $Env:GITHUB_OUTPUT | |
} | |
nuget-build: | |
name: NuGet package build [${{matrix.library}}] | |
runs-on: windows-2022 | |
strategy: | |
fail-fast: false | |
matrix: | |
library: [ dotnet-client, dotnet-subscriber, utils, pedm-dotnet-client ] | |
include: | |
- library: dotnet-client | |
libpath: ./devolutions-gateway/openapi/dotnet-client | |
- library: dotnet-subscriber | |
libpath: ./devolutions-gateway/openapi/dotnet-subscriber | |
- library: utils | |
libpath: ./utils/dotnet | |
- library: pedm-dotnet-client | |
libpath: ./crates/devolutions-pedm/openapi/dotnet-client | |
steps: | |
- name: Check out ${{ github.repository }} | |
uses: actions/checkout@v4 | |
- name: Build | |
shell: pwsh | |
run: | | |
Set-PSDebug -Trace 1 | |
$Path = '${{matrix.libpath}}' | |
& "$Path/build.ps1" | |
New-Item -ItemType "directory" -Path . -Name "nuget-packages" | |
Get-ChildItem -Path $Path -Recurse -Include '*.nupkg' | ForEach { Copy-Item $_ "./nuget-packages" } | |
Get-ChildItem -Path $Path -Recurse -Include '*.snupkg' | ForEach { Copy-Item $_ "./nuget-packages" } | |
- name: Upload packages | |
uses: actions/upload-artifact@v4 | |
with: | |
name: nupkg-${{matrix.library}} | |
path: | | |
nuget-packages/*.nupkg | |
nuget-packages/*.snupkg | |
nuget-merge: | |
name: NuGet merge artifacts | |
runs-on: ubuntu-latest | |
needs: nuget-build | |
steps: | |
- name: Merge Artifacts | |
uses: actions/upload-artifact/merge@v4 | |
with: | |
name: nupkg | |
pattern: nupkg-* | |
delete-merged: true | |
npm-build: | |
name: NPM package build | |
runs-on: ubuntu-20.04 | |
steps: | |
- name: Check out ${{ github.repository }} | |
uses: actions/checkout@v4 | |
- name: Build | |
shell: pwsh | |
run: | | |
Set-PSDebug -Trace 1 | |
$Path = './devolutions-gateway/openapi/ts-angular-client' | |
& "$Path/build.ps1" | |
New-Item -ItemType "directory" -Path . -Name "npm-packages" | |
Get-ChildItem -Path $Path -Recurse *.tgz | ForEach { Copy-Item $_ "./npm-packages" } | |
- name: Upload packages | |
uses: actions/upload-artifact@v4 | |
with: | |
name: npm | |
path: npm-packages/*.tgz | |
nuget-publish: | |
name: Publish NuGet packages | |
runs-on: ubuntu-20.04 | |
environment: publish-prod | |
if: needs.preflight.outputs.dry-run == 'false' | |
needs: | |
- preflight | |
- nuget-merge | |
steps: | |
- name: Download NuGet packages artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: nupkg | |
path: nuget-packages | |
- name: Publish to nuget.org | |
shell: pwsh | |
run: | | |
Set-PSDebug -Trace 1 | |
$Files = Get-ChildItem -Recurse nuget-packages/*.nupkg | |
foreach ($File in $Files) { | |
$PushCmd = @( | |
'dotnet', | |
'nuget', | |
'push', | |
"$File", | |
'--api-key', | |
'${{ secrets.NUGET_API_KEY }}', | |
'--source', | |
'https://api.nuget.org/v3/index.json', | |
'--skip-duplicate' | |
) | |
Write-Host "Publishing $($File.Name)..." | |
$PushCmd = $PushCmd -Join ' ' | |
Invoke-Expression $PushCmd | |
} | |
npm-publish: | |
name: Publish NPM packages | |
runs-on: ubuntu-20.04 | |
environment: publish-prod | |
if: needs.preflight.outputs.dry-run == 'false' | |
needs: | |
- preflight | |
- npm-build | |
steps: | |
- name: Check out ${{ github.repository }} | |
uses: actions/checkout@v4 | |
- name: Download NPM packages artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: npm | |
path: npm-packages | |
- name: Configure NPM | |
shell: pwsh | |
run: npm config set "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" | |
- name: Publish | |
shell: pwsh | |
run: | | |
Set-PSDebug -Trace 1 | |
$Files = Get-ChildItem -Recurse npm-packages/*.tgz | |
foreach ($File in $Files) { | |
Write-Host "Publishing $($File.Name)..." | |
./ci/npm-publish.ps1 -Tarball "$File" -Access 'public' | |
} | |
- name: Update Artifactory Cache | |
run: gh workflow run update-artifactory-cache.yml --repo Devolutions/scheduled-tasks --field package_name="gateway-client" | |
env: | |
GH_TOKEN: ${{ secrets.DEVOLUTIONSBOT_WRITE_TOKEN }} | |
remove-labels: | |
name: Remove publish-required labels | |
runs-on: ubuntu-latest | |
if: needs.preflight.outputs.dry-run == 'false' | |
needs: | |
- nuget-build | |
- npm-publish | |
steps: | |
- name: Check out ${{ github.repository }} | |
uses: actions/checkout@v4 | |
- name: Remove labels | |
shell: pwsh | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
run: ./ci/remove-labels.ps1 -Label 'publish-required' | |
notify: | |
name: Notify failure | |
runs-on: ubuntu-latest | |
if: ${{ always() && contains(needs.*.result, 'failure') && github.event_name == 'schedule' }} | |
needs: | |
- npm-build | |
- nuget-merge | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_ARCHITECTURE }} | |
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK | |
steps: | |
- name: Send slack notification | |
id: slack | |
uses: slackapi/[email protected] | |
with: | |
payload: | | |
{ | |
"blocks": [ | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": "*${{ github.repository }}* :fire::fire::fire::fire::fire: \n The scheduled build for *${{ github.repository }}* is <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|broken>" | |
} | |
} | |
] | |
} |