-
Notifications
You must be signed in to change notification settings - Fork 73
232 lines (197 loc) · 8.16 KB
/
trigger_release.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
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
# Trigger Bitrise to make a demo and prod release on `release/*` branch creation
name: trigger_release
on: create
concurrency:
group: demo-release-${{ github.ref }}
cancel-in-progress: true
jobs:
qa_lint:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
steps:
- uses: actions/checkout@v4
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: QA Lint
run: ./gradlew --build-cache --no-daemon lintQaDebug
qa_unit_tests:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
steps:
- uses: actions/checkout@v4
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: QA Unit Tests
run: ./gradlew --build-cache --no-daemon testQaDebugUnitTest
# reactivecircus/android-emulator-runner@v2 requires MacOS to run on
# https://github.com/ReactiveCircus/android-emulator-runner
qa_android_tests:
runs-on: macos-14
if: ${{ contains(github.ref, 'refs/heads/release/') }}
timeout-minutes: 60
env:
AVD_API_LEVEL: 30
AVD_ARCH: x86_64
HEROKU_API_KEY: ${{ secrets.SERVICES_HEROKU_API_KEY }}
steps:
- name: Checkout Android source
uses: actions/checkout@v4
with:
path: android-app
- name: Checkout server app source
uses: actions/checkout@v4
with:
repository: simpledotorg/simple-server
fetch-depth: 0 # Full clone needed for Heroku deploys (https://devcenter.heroku.com/changelog-items/775)
path: server-app
- name: Create node dependency hash
id: create_node_modules_hash
run: android-app/.github/scripts/compute_node_dependency_hash.sh
- name: Cache node modules
id: node-dependency-cache
uses: actions/cache@v4
with:
path: |
node_modules
package-lock.json
key: ${{ runner.os }}-npm-${{ steps.create_node_modules_hash.outputs.node_dep_hash }}
- name: Install Heroku CLI
if: steps.node-dependency-cache.outputs.cache-hit != 'true'
run: npm install heroku
- name: Link Heroku CLI globally
run: npm link heroku
- name: Install Heroku Buildpacks registry
run: heroku plugins:install buildpack-registry
- name: Link Heroku CLI globally
run: heroku plugins:install buildpacks
- name: Cache AVD
uses: actions/cache@v4
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: ${{ runner.os }}-avd-${{ env.AVD_API_LEVEL }}-${{ env.AVD_ARCH }}
- name: create AVD and generate snapshot for caching
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ env.AVD_API_LEVEL }}
arch: ${{ env.AVD_ARCH }}
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: false
disk-size: 8G
script: echo "Generated AVD snapshot for caching."
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: Generate server app name
id: generate-server-app-name
run: android-app/.github/scripts/generate_heroku_app_name.sh ${{ github.ref }}
- name: Deploy the server on Heroku
id: start-simple-server
run: |
android-app/.github/scripts/setup_heroku_instance.sh \
${{ steps.generate-server-app-name.outputs.heroku_app_name }} \
${{ env.HEROKU_API_KEY }} \
master \
server-app \
android-app \
${{ secrets.HEROKU_SECRET_PROPERTIES }}
- name: QA Android Tests
id: run-instrumented-tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ env.AVD_API_LEVEL }}
arch: ${{ env.AVD_ARCH }}
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
disk-size: 8G
script: |
adb root
mkdir -p android-app/app/build/outputs/test-artifacts
android-app/gradlew -p android-app --build-cache --no-daemon -PmanifestEndpoint=${{ steps.start-simple-server.outputs.heroku_app_url }}api/ installQaDebug installQaDebugAndroidTest
adb shell am instrument -w -e filter org.simple.clinic.benchmark.SelectBenchmarkTests -e benchmark_app_performance false org.simple.clinic.qa.debug.test/org.simple.clinic.AndroidTestJUnitRunner >android-app/app/build/outputs/test-artifacts/logs.txt 2>android-app/app/build/outputs/test-artifacts/logs.txt
cat android-app/app/build/outputs/test-artifacts/logs.txt
adb pull /storage/emulated/0/Android/data/org.simple.clinic.qa.debug/ android-app/app/build/outputs/test-artifacts/ || true
adb uninstall org.simple.clinic.qa.debug
adb uninstall org.simple.clinic.qa.debug.test
! grep -q "FAILURES\!\!\!" android-app/app/build/outputs/test-artifacts/logs.txt
- name: Upload failed test artifacts
if: always() && steps.run-instrumented-tests.outcome != 'success'
uses: actions/upload-artifact@v4
with:
name: test-artifacts
path: android-app/app/build/outputs/test-artifacts
- name: Teardown Heroku instance
if: always() && (steps.start-simple-server.outcome != 'success' || contains(github.ref, '/release/'))
run: |
heroku apps:destroy \
--app=${{ steps.generate-server-app-name.outputs.heroku_app_name }} \
--confirm=${{ steps.generate-server-app-name.outputs.heroku_app_name }}
verify_release_bundles:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
strategy:
matrix:
buildType: [ 'Production' ]
steps:
- uses: actions/checkout@v4
- name: set up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17
cache: 'gradle'
- name: Build ${{ matrix.buildType }} Release bundle
run: |
./gradlew \
-PrunProguard=true \
-PdefaultProguardFile=proguard-android.txt \
bundle${{ matrix.buildType }}Release
verify_room_schemas:
runs-on: [ ubuntu-latest ]
if: ${{ contains(github.ref, 'refs/heads/release/') }}
steps:
- name: Checkout master
uses: actions/checkout@v4
with:
ref: master
path: master
- name: Checkout current
uses: actions/checkout@v4
with:
path: current
- name: Verify existing Room schemas are not modified
run: current/.github/scripts/compare_directory_contents.sh master/app/schemas/org.simple.clinic.AppDatabase current/app/schemas/org.simple.clinic.AppDatabase
demo_release:
needs: [ qa_lint, qa_unit_tests, qa_android_tests, verify_release_bundles, verify_room_schemas ]
runs-on: [ ubuntu-latest ]
steps:
- uses: actions/checkout@v4
with:
ref: ${{github.ref}}
- name: Trigger Demo Release
run: kotlinc -script ".github/scripts/TriggerBitriseRelease.main.kts" "${{ github.ref }}" "${{ secrets.BITRISE_ACCESS_TOKEN }}" "${{ secrets.BITRISE_APP_SLUG }}" "${{ secrets.BITRISE_DEMO_WORKFLOW }}"
prod_release:
needs: [ qa_lint, qa_unit_tests, qa_android_tests, verify_release_bundles, verify_room_schemas ]
runs-on: [ ubuntu-latest ]
steps:
- uses: actions/checkout@v4
with:
ref: ${{github.ref}}
- name: Trigger Prod Release
run: kotlinc -script ".github/scripts/TriggerBitriseRelease.main.kts" "${{ github.ref }}" "${{ secrets.BITRISE_ACCESS_TOKEN }}" "${{ secrets.BITRISE_APP_SLUG }}" "${{ secrets.BITRISE_PROD_WORKFLOW }}"