-
Notifications
You must be signed in to change notification settings - Fork 3
145 lines (124 loc) · 4.79 KB
/
ci.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
name: CI - Test Runner
# Run the workflow when commits are pushed on main or when a PR is modified
on:
push:
branches:
- main
pull_request:
types:
- opened
- synchronize
- reopened
jobs:
ci:
name: CI
# Execute the CI on the course's runners
runs-on: ubuntu-latest
steps:
# First step : Checkout the repository on the runner
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of Sonar analysis (if we use Sonar Later)
# Kernel-based Virtual Machine (KVM) is an open source virtualization technology built into Linux. Enabling it allows the Android emulator to run faster.
- name: Enable KVM group perms
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "17"
# Caching is a very useful part of a CI, as a workflow is executed in a clean environment every time,
# this means that one would need to re-download and re-process gradle files for every run. Which is very time consuming.
#
# To avoid that, we cache the the gradle folder to reuse it later.
- name: Gradle cache
uses: gradle/actions/setup-gradle@v3
# Load google-services.json and local.properties from the secrets
- name: Decode secrets
env:
GOOGLE_SERVICES: ${{ secrets.GOOGLE_SERVICES }}
# LOCAL_PROPERTIES: ${{ secrets.LOCAL_PROPERTIES }}
run: |
echo "$GOOGLE_SERVICES" | base64 --decode > ./app/google-services.json
# echo "$LOCAL_PROPERTIES" | base64 --decode > ./local.properties
# Cache the Emulator, if the cache does not hit, create the emulator
- name: AVD cache
uses: actions/cache@v4
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-34
- 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: 34
target: google_apis
arch: x86_64
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: false
script: echo "Generated AVD snapshot for caching."
- name: Grant execute permission for gradlew
run: |
chmod +x ./gradlew
# Check formatting
- name: KTFmt Check
run: |
./gradlew ktfmtCheck
# This step runs gradle commands to build the application
- name: Assemble
run: |
# To run the CI with debug information, add --info
./gradlew assemble lint --parallel --build-cache
- name: Cache firebase emulators
uses: actions/cache@v4
with:
path: /home/runner/.cache/firebase/emulators
key: ${{ runner.os }}-firebase-emulators
restore-keys: |
${{ runner.os }}-firebase-emulators
- name: Install Firebase CLI
run: |
npm install -g firebase-tools
- name: Build functions
run: |
cd cloud-functions/functions
npm install
npm run build
cd ../..
# Run Unit tests
- name: Run tests
run: |
# To run the CI with debug information, add --info
./gradlew check --parallel --build-cache
# Run connected tests on the emulator
- name: run tests
uses: reactivecircus/android-emulator-runner@v2
env:
FIREBASE_LOGIN_TOKEN: ${{ secrets.FIREBASE_LOGIN_TOKEN }}
with:
api-level: 34
target: google_apis
arch: x86_64
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
script: firebase emulators:exec --token "$FIREBASE_LOGIN_TOKEN" "./gradlew connectedCheck --parallel --build-cache"
# This step generates the coverage report which will be uploaded to sonar
- name: Generate Coverage Report
run: |
./gradlew jacocoTestReport
# Upload the various reports to sonar
- name: Upload report to SonarCloud
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./gradlew sonar --parallel --build-cache