Skip to content

ci: create preview deploys with swa url (#126) #1100

ci: create preview deploys with swa url (#126)

ci: create preview deploys with swa url (#126) #1100

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
});
}