Repository navigation
132 lines (112 loc) · 3.98 KB
/
Copy pathdeploy.yml
File metadata and controls
132 lines (112 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
name: Deploy to Cloudflare Pages
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm install
- name: Copy database files
run: npm run copy-db
- name: Validate question bank
if: ${{ hashFiles('src/content/questions/**/*.yaml') != '' }}
run: npm run validate:questions
- name: Validate challenge tracks
if: ${{ hashFiles('src/content/challenges/**/*.yaml') != '' }}
run: npm run validate:challenges
- name: Validate lab simulation cases
if: ${{ hashFiles('src/content/cases/**/*.yaml') != '' }}
run: npm run validate:cases
- name: Build
run: npm run build
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
deploy:
runs-on: ubuntu-latest
needs: build
if: github.ref == 'refs/heads/main' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
permissions:
contents: read
deployments: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: dist
path: dist/
- name: Deploy to Cloudflare Pages
uses: cloudflare/pages-action@v1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: gemmology-dev
directory: dist
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Purge Cloudflare Cache
run: |
set -euo pipefail
response=$(curl -sS -X POST "https://api.cloudflare.com/client/v4/zones/${{ secrets.CLOUDFLARE_ZONE_ID }}/purge_cache" \
-H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}')
echo "Cloudflare purge response: $response"
# The purge API returns HTTP 200 even on auth failure, so check the
# JSON `success` field explicitly — otherwise a broken token silently
# leaves the edge cache serving stale content on every deploy.
if [ "$(echo "$response" | jq -r '.success')" != "true" ]; then
echo "::error::Cloudflare cache purge FAILED (edge cache not invalidated — visitors may see stale content). Check CLOUDFLARE_API_TOKEN has Zone.Cache Purge:Edit for CLOUDFLARE_ZONE_ID."
exit 1
fi
echo "Cloudflare cache purged successfully."
preview:
runs-on: ubuntu-latest
needs: build
if: github.event_name == 'pull_request'
permissions:
contents: read
deployments: write
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: dist
path: dist/
- name: Deploy Preview to Cloudflare Pages
uses: cloudflare/pages-action@v1
id: deploy
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: gemmology-dev
directory: dist
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
- name: Comment PR with preview URL
uses: actions/github-script@v7
with:
script: |
const url = '${{ steps.deploy.outputs.url }}';
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `🚀 Preview deployed to: ${url}`
});