-
Notifications
You must be signed in to change notification settings - Fork 8
146 lines (125 loc) · 4.14 KB
/
main-build-and-deploy.yml
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
name: Main - build and deploy
on:
push:
branches:
- main
workflow_dispatch:
concurrency:
group: main
permissions:
id-token: write
contents: read
env:
SOURCE_IMG: staging
DESTINATION_IMG: production
jobs:
run-tests-and-coverage:
name: Run tests & coverage
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
package_json_file: package.json
- name: Install dependencies
run: pnpm install
- name: Run Tests & Coverage
run: pnpm test-and-coverage --outputFile=coverage-report.json
- name: Generate Coverage Report for main Build
id: coverage
uses: ArtiomTr/jest-coverage-report-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
coverage-file: coverage-report.json
base-coverage-file: coverage-report.json
skip-step: all
annotations: none
output: report-markdown
- name: Code Coverage Summary
shell: pwsh
run: |
$report_content='${{ steps.coverage.outputs.report }}'
"$report_content" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append
build:
name: Build and upload artifacts
uses: ./.github/workflows/template-build.yml
with:
tag: staging
secrets: inherit
deploy-staging:
name: Deploy to staging slot
needs: build
runs-on: ubuntu-latest
environment:
name: production
url: ${{ steps.deploy.outputs.url }}
permissions:
id-token: write
contents: read
outputs:
url: ${{ steps.deploy.outputs.url }}
steps:
- uses: actions/checkout@v4
- name: Load .env file
uses: xom9ikk/dotenv@v2
with:
path: ./.github
- name: Deploy to staging
id: deploy
uses: ./.github/actions/deploy
with:
slot_name: staging
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
AZURE_RESOURCE_GROUP: ${{ env.AZURE_RESOURCE_GROUP }}
APP_SERVICE_NAME: ${{ env.APP_SERVICE_NAME }}
ACR_LOGIN_SERVER: ${{ env.ACR_LOGIN_SERVER }}
IMAGE_NAME: ${{ env.IMAGE_NAME }}
AZURE_SERVICE_PRINCIPAL_OBJECT_ID: ${{ secrets.AZURE_SERVICE_PRINCIPAL_OBJECT_ID }}
test:
name: Run Playwright Tests
needs: deploy-staging
uses: ./.github/workflows/template-ui-tests.yml
with:
deploy_url: ${{ needs.deploy-staging.outputs.url }}
tests_to_run: "images seo-noindex" # staging slot should not be indexed
swap-staging:
name: Swap staging with production
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Load .env file
uses: xom9ikk/dotenv@v2
with:
path: ./.github
- name: Azure CLI - Login
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: ACR - Login
run: |
az acr login --name ${{ env.ACR_LOGIN_SERVER }}
- name: Tag Production ACR Image
run: |
# Pull the staging image from ACR
docker pull ${{ env.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:${{ env.SOURCE_IMG }}
# Tag the Docker image with the production tag
docker tag ${{ env.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:${{ env.SOURCE_IMG}} \
${{ env.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:${{ env.DESTINATION_IMG }}
- name: Push Production ACR Image
run: |
# Push the newly tagged image to ACR
docker push ${{ env.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:${{ env.DESTINATION_IMG }}
- name: ♻️ Swap slots
run: |
az webapp deployment slot swap \
--resource-group ${{ env.AZURE_RESOURCE_GROUP }} \
--name ${{ env.APP_SERVICE_NAME }} \
--slot staging \
--target-slot production