-
Notifications
You must be signed in to change notification settings - Fork 0
170 lines (148 loc) · 5.87 KB
/
Copy pathci.yml
File metadata and controls
170 lines (148 loc) · 5.87 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
name: CI
# ⚠️ Les branches de travail SONT couvertes, et ce n'est pas cosmétique :
# tant que ce workflow ne ciblait que `main`, une branche `fix/**` pouvait
# accumuler des dizaines de commits sans qu'aucun outil ne tourne — analyse,
# tests et build ne se déclenchaient qu'à la fusion, c'est-à-dire trop tard.
# `pull_request` sans filtre de branche cible couvre en prime les PR qui ne
# visent pas `main`.
on:
push:
branches:
- main
- 'fix/**'
- 'feat/**'
- 'chore/**'
pull_request:
jobs:
build:
name: Analyze + Test + Build (debug)
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout app
uses: actions/checkout@v6
with:
path: notes_tech
# Le pubspec référence files_tech_voice + files_tech_core via path:.
# On les checkout en sibling pour que `flutter pub get` résolve les deps.
- name: Checkout files_tech_voice (path dependency)
uses: actions/checkout@v6
with:
repository: gitubpatrice/files_tech_voice
path: files_tech_voice
- name: Checkout files_tech_core (path dependency)
uses: actions/checkout@v6
with:
repository: gitubpatrice/files_tech_core
path: files_tech_core
- name: Setup Java 17
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true
- name: Flutter version
run: flutter --version
- name: Pub get
working-directory: notes_tech
run: flutter pub get
- name: Analyze
working-directory: notes_tech
run: flutter analyze --no-fatal-infos
- name: Run tests
working-directory: notes_tech
run: flutter test
# Build debug APK pour valider que la compilation passe end-to-end
# (pas besoin de keystore release en CI).
- name: Build APK (debug, unsigned)
working-directory: notes_tech
run: flutter build apk --debug
- name: Upload APK artifact
if: always()
uses: actions/upload-artifact@v7
with:
name: notes_tech-debug-${{ github.sha }}
path: notes_tech/build/app/outputs/flutter-apk/app-debug.apk
retention-days: 7
if-no-files-found: ignore
# Tests SUR ÉMULATEUR — la chaîne de sécurité de cette app (SQLCipher,
# Keystore Android, Argon2id, triggers FTS5) ne s'instancie pas dans un
# `flutter test`. Le bug qui déchiffrait une note de coffre à l'épinglage
# écrivait dans la vraie base : aucun test pure-Dart ne pouvait le voir.
# Sans ce job, ces tests-là ne tournent que lancés à la main.
#
# Volontairement PAS sur les branches de travail : un émulateur coûte
# ~10-15 min et reste la source de flakiness la plus courante en CI. Le
# gate rapide (analyse + tests unitaires) tourne à chaque commit, celui-ci
# à la proposition de fusion et sur `main`. C'est le compromis entre une
# garde réelle et une CI que l'on finit par ignorer parce qu'elle est rouge
# sans raison.
#
# Si ce job casse un jour : les 11 tests eux-mêmes ont été validés sur
# émulateur x86_64 API 30 en local le 2026-08-07 (14 s d'exécution), et sur
# Galaxy S9 arm64. Chercher donc du côté du runner — KVM, version de
# l'action, checkout des dépendances `path:` — avant de suspecter les tests.
integration:
name: Tests sur émulateur (coffre)
runs-on: ubuntu-latest
timeout-minutes: 45
if: github.event_name == 'pull_request' || github.ref == 'refs/heads/main'
steps:
- name: Checkout app
uses: actions/checkout@v6
with:
path: notes_tech
- name: Checkout files_tech_voice (path dependency)
uses: actions/checkout@v6
with:
repository: gitubpatrice/files_tech_voice
path: files_tech_voice
- name: Checkout files_tech_core (path dependency)
uses: actions/checkout@v6
with:
repository: gitubpatrice/files_tech_core
path: files_tech_core
- name: Setup Java 17
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
cache: true
- name: Pub get
working-directory: notes_tech
run: flutter pub get
# KVM : sans accélération matérielle l'émulateur démarre en plusieurs
# dizaines de minutes et finit en timeout.
- name: Activer KVM
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
# API 30 = même niveau que le gate instrumenté de SMS Tech, et au-dessus
# du minSdk 23 de l'app. `google_apis` et non `default` : le Keystore
# matériel simulé y est plus proche d'un appareil réel.
- name: Tests d'intégration sur émulateur API 30
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 30
target: google_apis
arch: x86_64
profile: pixel_5
disable-animations: true
working-directory: notes_tech
# Pas de `-d` ici, contrairement à la règle locale : le runner
# n'a qu'un seul appareil, l'émulateur que cette action vient de
# démarrer, et aucun téléphone réel n'y est branché. Sur un poste
# de développement, `-d` reste obligatoire — sans lui la commande
# vise TOUS les appareils connectés, et l'installation désinstalle
# l'app en cas de downgrade de versionCode.
script: flutter test integration_test