-
Notifications
You must be signed in to change notification settings - Fork 1.7k
246 lines (213 loc) · 8.45 KB
/
on-push-or-pull.yml
File metadata and controls
246 lines (213 loc) · 8.45 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
name: on-pull-request-or-push
on:
workflow_dispatch:
pull_request:
push:
branches:
- development
env:
NX_BRANCH: ${{ github.event.number }}
NX_RUN_GROUP: ${{ github.run_id }}
NX_CLOUD_AUTH_TOKEN: ${{ secrets.NX_CLOUD_AUTH_TOKEN }}
MOZ_HEALESS: 1
SAUCE_USERNAME_PR: valorkinpr
SAUCE_ACCESS_KEY_PR: e0a97bd3-4b74-4408-89bf-cce1b44a8bf1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 0
CACHE_NODE_MODULES_PATH: |
~/.npm
node_modules
CACHE_DIST_PATH: dist
jobs:
# one run
one_run:
runs-on: ubuntu-22.04
steps:
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.12.1
with:
access_token: ${{ secrets.GITHUB_TOKEN }}
# install dependencies
install:
runs-on: ubuntu-22.04
needs: one_run
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
id: cache
with:
path: ${{ env.CACHE_NODE_MODULES_PATH }}
key: node_modules-${{ hashFiles('**/package-lock.json') }}
- run: npm ci
if: steps.cache.outputs.cache-hit != 'true'
# build ngx-bootstrap
build:
needs: install
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_NODE_MODULES_PATH }}
key: node_modules-${{ hashFiles('**/package-lock.json') }}
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_DIST_PATH }}
key: dist-${{ github.run_id }}
- run: |
npx nx build ngx-bootstrap --configuration=production
npx nx prerender --configuration=production
# run unit tests
unit_tests_with_coverage:
runs-on: ubuntu-22.04
needs: build
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_NODE_MODULES_PATH }}
key: node_modules-${{ hashFiles('**/package-lock.json') }}
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_DIST_PATH }}
key: dist-${{ github.run_id }}
# - run: npm test -- --runner=cloud --codeCoverage
- run: npm test -- --codeCoverage
- run: npx codecov ./coverage/
continue-on-error: true
# run linting
linting:
runs-on: ubuntu-22.04
needs: install
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_NODE_MODULES_PATH }}
key: node_modules-${{ hashFiles('**/package-lock.json') }}
# - run: npm run lint -- --runner=cloud
- run: npm run lint --
# deploy to cloudflare pages
cloudflare_deploy:
runs-on: ubuntu-22.04
needs: build
outputs:
deployment_url: ${{ steps.cloudflare_deploy.outputs.deployment-url }}
preview_url: ${{ steps.extract_preview_url.outputs.preview_url }}
steps:
- uses: actions/checkout@v4
# Wait for Cloudflare deployment with intelligent polling
- name: Wait for Cloudflare deployment
id: wait_deployment
run: |
echo "Waiting for Cloudflare deployment to complete..."
MAX_ATTEMPTS=30
ATTEMPT=0
BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
echo "Attempt $((ATTEMPT + 1))/$MAX_ATTEMPTS: Checking deployment status..."
# Get deployments for the project
RESPONSE=$(curl -s -H "Authorization: Bearer ${{ secrets.CLOUDFLARE_API_TOKEN }}" \
"https://api.cloudflare.com/client/v4/accounts/${{ secrets.CLOUDFLARE_ACCOUNT_ID }}/pages/projects/ngx-bootstrap/deployments")
# Check if we have a successful deployment for this branch/commit
DEPLOYMENT_URL=$(echo "$RESPONSE" | jq -r --arg branch "$BRANCH_NAME" --arg commit "$GITHUB_SHA" \
'.result[] | select(.deployment_trigger.metadata.branch == $branch and .deployment_trigger.metadata.commit_hash == $commit and .latest_stage.status == "success") | .url' | head -1)
if [ "$DEPLOYMENT_URL" != "null" ] && [ -n "$DEPLOYMENT_URL" ]; then
echo "✅ Deployment ready! URL: $DEPLOYMENT_URL"
echo "deployment_url=$DEPLOYMENT_URL" >> $GITHUB_OUTPUT
exit 0
fi
# Check if deployment failed
FAILED=$(echo "$RESPONSE" | jq -r --arg branch "$BRANCH_NAME" --arg commit "$GITHUB_SHA" \
'.result[] | select(.deployment_trigger.metadata.branch == $branch and .deployment_trigger.metadata.commit_hash == $commit and .latest_stage.status == "failure") | .id' | head -1)
if [ "$FAILED" != "null" ] && [ -n "$FAILED" ]; then
echo "❌ Deployment failed!"
exit 1
fi
echo "⏳ Deployment still in progress, waiting 20 seconds..."
sleep 20
ATTEMPT=$((ATTEMPT + 1))
done
echo "❌ Timeout waiting for deployment"
exit 1
- name: Set preview URL output
id: get_preview_url
run: |
if [ -n "${{ steps.cloudflare_deploy.outputs.deployment-url }}" ]; then
# Extract just the hostname from the full URL
PREVIEW_URL=$(echo "${{ steps.cloudflare_deploy.outputs.deployment-url }}" | sed 's|https://||')
echo "preview_url=$PREVIEW_URL" >> $GITHUB_OUTPUT
echo "Preview URL: https://$PREVIEW_URL"
else
echo "No preview URL available"
fi
# run playwright
e2e_smoke:
name: e2e smoke (${{ matrix.shard }}/${{ strategy.job-total }})
runs-on: ubuntu-22.04
needs: [install, build, cloudflare_deploy]
strategy:
fail-fast: false
matrix:
shard: [1, 2]
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_NODE_MODULES_PATH }}
key: node_modules-${{ hashFiles('**/package-lock.json') }}
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_DIST_PATH }}
key: dist-${{ github.run_id }}
- name: Install playwright browsers
run: |
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npx playwright install
npx playwright install-deps chromium
- name: smoke e2e on cloudflare pages
if: ${{ needs.cloudflare_deploy.outputs.preview_url }}
run: PLAYWRIGHT_TEST_BASE_URL="https://${{ needs.cloudflare_deploy.outputs.preview_url }}" npx nx run ngx-bootstrap-docs-e2e:e2e --pwProject=chromium-integration --skipServe --shard=${{ matrix.shard }}/${{ strategy.job-total }}
- name: smoke e2e local
if: ${{ !needs.cloudflare_deploy.outputs.preview_url }}
run: npx nx run ngx-bootstrap-docs-e2e:e2e --pwProject=chromium-integration --shard=${{ matrix.shard }}/${{ strategy.job-total }}
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-smoke-${{ matrix.shard }}_${{ strategy.job-total }}
path: apps/ngx-bootstrap-docs-e2e/playwright-report
retention-days: 14
e2e_full:
name: e2e full
runs-on: ubuntu-22.04
needs: [e2e_smoke, cloudflare_deploy]
strategy:
fail-fast: false
matrix:
shard: [1, 2]
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_NODE_MODULES_PATH }}
key: node_modules-${{ hashFiles('**/package-lock.json') }}
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_DIST_PATH }}
key: dist-${{ github.run_id }}
- name: Install playwright browsers
run: |
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npx playwright install
npx playwright install-deps chromium
- name: full e2e on cloudflare pages
if: ${{ needs.cloudflare_deploy.outputs.preview_url }}
continue-on-error: true
run: npx nx run ngx-bootstrap-docs-e2e:e2e --pwProject=chromium-full --baseUrl=https://${{ needs.cloudflare_deploy.outputs.preview_url }} --skipServe --shard=${{ matrix.shard }}/${{ strategy.job-total }}
- name: full e2e on local
if: ${{ !needs.cloudflare_deploy.outputs.preview_url }}
continue-on-error: true
run: npx nx run ngx-bootstrap-docs-e2e:e2e --pwProject=chromium-full --shard=${{ matrix.shard }}/${{ strategy.job-total }}
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report-full-${{ matrix.shard }}_${{ strategy.job-total }}
path: apps/ngx-bootstrap-docs-e2e/playwright-report
retention-days: 14