Deploy #109
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: Deploy | |
on: | |
push: | |
branches: ["main"] | |
tags: ["v[0-9]+.[0-9]+.[0-9]+"] | |
workflow_dispatch: | |
schedule: | |
- cron: "0 0 * * *" | |
env: | |
PRODUCTION_URL: https://nugettools.azurewebsites.net | |
jobs: | |
build: | |
runs-on: windows-latest | |
outputs: | |
versions-changed: ${{ steps.check-versions.outputs.versions-changed }} | |
steps: | |
- name: Check out | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- name: Set up .NET Core | |
uses: actions/setup-dotnet@v2 | |
with: | |
dotnet-version: 6.0.x | |
- name: Build | |
run: .\build.ps1 | |
- name: Zip publish directory | |
run: Compress-Archive -Path .\src\Knapcode.NuGetTools.Website\bin\Release\net472\publish\* -DestinationPath .\src\Knapcode.NuGetTools.Website\bin\website.zip | |
- name: Upload artifact for deployment job | |
uses: actions/upload-artifact@v3 | |
with: | |
name: website | |
path: .\src\Knapcode.NuGetTools.Website\bin\website.zip | |
- name: Check for new versions | |
id: check-versions | |
run: | | |
$report = dotnet run --project .\src\Knapcode.NuGetTools.PackageDownloader -- check-versions .\src\Knapcode.NuGetTools.Website\packages ${{ env.PRODUCTION_URL }} | |
$report | |
$notMatching = $report | ? { !$_.StartsWith("Matching") } | |
Write-Output "versions-changed=$(($notMatching.Length -ne 0).ToString().ToLowerInvariant())" >> $Env:GITHUB_OUTPUT | |
deploy-to-dev: | |
concurrency: | |
group: deploy-to-dev | |
permissions: | |
id-token: write | |
contents: read | |
runs-on: windows-latest | |
needs: build | |
environment: | |
name: DEV | |
url: ${{ steps.deploy.outputs.webapp-url }} | |
steps: | |
- name: Download artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: website | |
path: . | |
- name: Log in to Azure | |
uses: azure/login@v1 | |
with: | |
tenant-id: ${{ secrets.AZURE_TENANT_ID }} | |
client-id: ${{ secrets.AZURE_CLIENT_ID }} | |
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
- name: Deploy | |
id: deploy | |
uses: azure/webapps-deploy@v2 | |
with: | |
app-name: NuGetToolsDev | |
package: .\website.zip | |
deploy-to-prod: | |
concurrency: | |
group: deploy-to-prod | |
permissions: | |
id-token: write | |
contents: read | |
runs-on: windows-latest | |
needs: build | |
environment: | |
name: PROD | |
url: ${{ steps.set-environment-url.outputs.url }} | |
env: | |
RESOURCE_GROUP: Knapcode.NuGetTools | |
WEBAPP_NAME: NuGetTools | |
SLOT_NAME: staging | |
steps: | |
- name: Check out | |
uses: actions/checkout@v3 | |
- name: Download artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: website | |
path: . | |
- name: Log in to Azure | |
uses: azure/login@v1 | |
with: | |
tenant-id: ${{ secrets.AZURE_TENANT_ID }} | |
client-id: ${{ secrets.AZURE_CLIENT_ID }} | |
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
- name: Deploy | |
id: deploy | |
uses: azure/webapps-deploy@v2 | |
with: | |
app-name: ${{ env.WEBAPP_NAME }} | |
slot-name: ${{ env.SLOT_NAME }} | |
package: .\website.zip | |
- name: Copy packages for tests | |
run: | | |
Expand-Archive -Path .\website.zip -DestinationPath .\website | |
Copy-Item .\website\packages .\src\Knapcode.NuGetTools.Website -Recurse | |
- name: Run integration tests | |
run: dotnet test --logger "console;verbosity=normal" --filter "FullyQualifiedName~Knapcode.NuGetTools.Website.Tests.IntegrationTest" | |
env: | |
NUGETTOOLS_BASE_URL: ${{ steps.deploy.outputs.webapp-url }} | |
- name: Swap slots | |
if: ${{ needs.build.outputs.versions-changed == 'true' || github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/v') }} | |
id: swap-slots | |
run: az webapp deployment slot swap -s ${{ env.SLOT_NAME }} -n ${{ env.WEBAPP_NAME }} -g ${{ env.RESOURCE_GROUP }} | |
- name: Set environment URL | |
id: set-environment-url | |
run: | | |
if ("${{ steps.swap-slots.outcome }}" -eq "success") { | |
Write-Output "url=${{ env.PRODUCTION_URL }}" >> $Env:GITHUB_OUTPUT | |
} else { | |
Write-Output "url=${{ steps.deploy.outputs.webapp-url }}" >> $Env:GITHUB_OUTPUT | |
} |