ci: try creating preview deploys with swa url #1099
Workflow file for this run
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: Azure Static Web Apps CI/CD | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
types: [opened, synchronize, reopened, closed] | |
branches: | |
- main | |
jobs: | |
build_and_deploy_job: | |
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') | |
runs-on: ubuntu-latest | |
name: Build and Deploy Job | |
permissions: | |
id-token: write | |
contents: read | |
deployments: write | |
steps: | |
- uses: actions/checkout@v4 | |
- run: npm i -g --force corepack && corepack enable | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: lts/* | |
cache: pnpm | |
- run: pnpm install --frozen-lockfile | |
- name: Get Id Token | |
uses: actions/github-script@v7 | |
id: idtoken | |
with: | |
script: | | |
const coredemo = require('@actions/core') | |
return await coredemo.getIDToken() | |
result-encoding: string | |
- name: Build And Deploy | |
id: builddeploy | |
uses: Azure/static-web-apps-deploy@v1 | |
env: | |
PRE_BUILD_COMMAND: npm i -g --force corepack && corepack enable | |
CUSTOM_BUILD_COMMAND: pnpm install && pnpm build | |
AZURE_STORAGE_ACCOUNT_KEY: ${{ secrets.AZURE_STORAGE_ACCOUNT_KEY }} | |
with: | |
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_DELIGHTFUL_CLIFF_0ACDAF71E }} | |
action: "upload" | |
###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### | |
# For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig | |
app_location: "/" # App source code path | |
api_location: ".output/server" # Api source code path - optional | |
skip_api_build: true | |
output_location: ".output/public" # Built app content directory - optional | |
github_id_token: ${{ steps.idtoken.outputs.result }} | |
###### End of Repository/Build Configurations ###### | |
- name: Extract deployment URL | |
if: github.event_name == 'pull_request' | |
id: extract_url | |
run: | | |
# Extract URL from builddeploy step output | |
DEPLOYMENT_URL=$(echo '${{ steps.builddeploy.outputs.static_web_app_url }}' | grep -o 'https://[^ ]*') | |
echo "PREVIEW_URL=$DEPLOYMENT_URL" >> $GITHUB_ENV | |
echo "preview_url=$DEPLOYMENT_URL" >> $GITHUB_OUTPUT | |
- name: Create GitHub deployment for PR | |
if: github.event_name == 'pull_request' | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const previewUrl = '${{ steps.extract_url.outputs.preview_url }}'; | |
if (!previewUrl) { | |
console.log('No preview URL found, skipping deployment creation'); | |
return; | |
} | |
console.log(`Creating deployment with preview URL: ${previewUrl}`); | |
const deployment = await github.rest.repos.createDeployment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
ref: context.payload.pull_request.head.ref, | |
environment: `pr-${context.payload.pull_request.number}`, | |
auto_merge: false, | |
required_contexts: [], | |
description: 'Azure Static Web Apps Preview', | |
task: 'deployment', | |
transient_environment: true, | |
production_environment: false | |
}); | |
await github.rest.repos.createDeploymentStatus({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
deployment_id: deployment.data.id, | |
state: 'success', | |
environment_url: previewUrl, | |
log_url: previewUrl, | |
description: 'Deployment succeeded', | |
auto_inactive: false | |
}); | |
- name: Clear Cloudflare cache | |
if: github.event_name == 'push' | |
uses: Cyb3r-Jak3/[email protected] | |
with: | |
zone: ${{ secrets.CLOUDFLARE_ZONE }} | |
api_token: ${{ secrets.CLOUDFLARE_TOKEN }} | |
close_pull_request_job: | |
if: github.event_name == 'pull_request' && github.event.action == 'closed' | |
runs-on: ubuntu-latest | |
name: Close Pull Request Job | |
permissions: | |
id-token: write | |
contents: read | |
deployments: write | |
steps: | |
- uses: actions/checkout@v4 | |
- run: npm i -g --force corepack && corepack enable | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: lts/* | |
cache: pnpm | |
- run: pnpm install --frozen-lockfile | |
- name: Get Id Token | |
uses: actions/github-script@v7 | |
id: idtoken | |
with: | |
script: | | |
const coredemo = require('@actions/core') | |
return await coredemo.getIDToken() | |
result-encoding: string | |
- name: Close Pull Request | |
id: closepullrequest | |
uses: Azure/static-web-apps-deploy@v1 | |
with: | |
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_DELIGHTFUL_CLIFF_0ACDAF71E }} | |
github_id_token: ${{ steps.idtoken.outputs.result }} | |
action: "close" | |
- name: Deactivate GitHub deployment for PR | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const prNumber = context.payload.pull_request.number; | |
const environment = `pr-${prNumber}`; | |
console.log(`Deactivating deployment for environment: ${environment}`); | |
// Get all deployments for this environment | |
const deployments = await github.rest.repos.listDeployments({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
environment: environment | |
}); | |
// Mark each deployment as inactive | |
for (const deployment of deployments.data) { | |
await github.rest.repos.createDeploymentStatus({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
deployment_id: deployment.id, | |
state: 'inactive', | |
description: 'Pull request closed', | |
auto_inactive: false | |
}); | |
} |