-
Notifications
You must be signed in to change notification settings - Fork 1
198 lines (174 loc) · 8.25 KB
/
Copy pathrelease.yml
File metadata and controls
198 lines (174 loc) · 8.25 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
name: Release
# Construit les exécutables Linux et Windows et publie une release GitHub avec
# les deux archives. Se déclenche au push d'un tag de version (v1.2.3), ou
# manuellement depuis l'onglet Actions.
on:
push:
tags:
- "v*"
workflow_dispatch:
permissions:
contents: write
jobs:
build-linux:
name: Build Linux
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# GLFW a besoin des en-têtes X11 et OpenGL ; GLAD génère ses sources via
# Python (déjà présent sur le runner). libcurl (paquet de développement)
# est désormais obligatoire : la radio internet du cockpit en dépend.
- name: Installer les dépendances système
run: |
sudo apt-get update
sudo apt-get install -y xorg-dev libgl1-mesa-dev libcurl4-openssl-dev
# Accélère les builds suivants : on garde les sources tierces clonées par
# FetchContent (assimp est volumineux).
- name: Cache des dépendances FetchContent
uses: actions/cache@v4
with:
path: build/_deps
key: deps-linux-${{ hashFiles('cmake/Dependencies.cmake') }}
# CMAKE_POLICY_VERSION_MINIMUM=3.5 : les runners ont CMake 4.x, qui refuse le
# vieux cmake_minimum_required de certaines dependances (GLAD). Cette option
# leur accorde une compatibilite minimale.
- name: Configurer
run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM=3.5
- name: Compiler
run: cmake --build build -j
- name: Tester
run: ctest --test-dir build --output-on-failure
- name: Empaqueter
run: cd build && cpack
- name: Publier l'artefact
uses: actions/upload-artifact@v4
with:
name: artouste-linux
path: build/artouste-*.tar.gz
if-no-files-found: error
build-windows:
name: Build Windows
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Cache des dépendances FetchContent
uses: actions/cache@v4
with:
path: build/_deps
key: deps-windows-${{ hashFiles('cmake/Dependencies.cmake') }}
# libcurl (radio internet du cockpit) via vcpkg, en statique : tout est
# fondu dans artouste.exe, aucune DLL à embarquer dans le zip. Le triplet
# x64-windows-static utilise le CRT statique (/MT), comme le reste du
# projet (CMAKE_MSVC_RUNTIME_LIBRARY dans CMakeLists.txt). Un triplet -md
# (CRT dynamique) provoquerait des symboles __imp_ non résolus à l'édition
# de liens.
- name: Installer libcurl (vcpkg, statique)
shell: bash
run: vcpkg install curl:x64-windows-static
# En bash (present sur le runner) : PowerShell decoupe sinon l'argument
# -DCMAKE_POLICY_VERSION_MINIMUM=3.5 au point decimal. La toolchain vcpkg
# et le triplet statique exposent libcurl a find_package(CURL).
- name: Configurer
shell: bash
run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_TOOLCHAIN_FILE="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-static
- name: Compiler
run: cmake --build build --config Release -j
- name: Tester
run: ctest --test-dir build -C Release --output-on-failure
- name: Empaqueter
run: cd build && cpack -C Release
- name: Publier l'artefact
uses: actions/upload-artifact@v4
with:
name: artouste-windows
path: build/artouste-*.zip
if-no-files-found: error
release:
name: Publier la release
needs: [build-linux, build-windows]
runs-on: ubuntu-latest
# Une release n'est créée que pour un tag, pas pour un lancement manuel.
if: startsWith(github.ref, 'refs/tags/')
steps:
# Ce job ne compile rien, mais il lui faut quand même le dépôt : le texte de
# la release est lu dans docs/RELEASE_NOTES.md ci-dessous. Sans ce checkout,
# body_path désignerait un fichier absent et l'action retomberait sur une
# description vide, sans échouer. En premier, car actions/checkout nettoie le
# répertoire de travail : après le téléchargement, il effacerait les archives.
- uses: actions/checkout@v4
- name: Récupérer les artefacts
uses: actions/download-artifact@v4
with:
path: artefacts
# RITUEL DE PUBLICATION : tout est dans scripts/release.sh, à lancer après
# avoir écrit les notes dans docs/RELEASE_NOTES.md, bumpé la version dans
# CMakeLists.txt, commité et poussé :
#
# ./scripts/release.sh vX.Y.Z
#
# Il pose le tag, le pousse (ce workflow démarre, une quinzaine de minutes
# de compilation) et crée aussitôt la release, avec le seul texte de cette
# version. Ce job ne fait plus qu'y attacher les archives, une fois prêtes.
#
# Pourquoi la release est créée là-bas et pas ici : son auteur est figé à
# sa création et ne se change plus ensuite. Créée par ce workflow, elle
# porterait le compte du robot, qui apparaissait alors dans les auteurs du
# projet (c'est arrivé pour v0.25.0, v0.27.0 et v0.30.2, quand la création
# à la main était encore une étape séparée, oubliable). D'où le garde-fou
# ci-dessous : plutôt échouer que créer la release ici.
- name: Attacher les archives à la release
env:
GH_TOKEN: ${{ github.token }}
run: |
if ! gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then
echo "Release $GITHUB_REF_NAME absente : créez-la avec scripts/release.sh," >&2
echo "puis relancez ce workflow. Elle n'est pas créée ici, pour que son" >&2
echo "auteur reste le vôtre et non le compte du robot." >&2
exit 1
fi
gh release upload "$GITHUB_REF_NAME" artefacts/*/artouste-* --clobber
page:
name: Inscrire le tag dans la page
needs: [release]
runs-on: ubuntu-latest
# Même garde que la release, plus une seconde : un lancement manuel ne publie
# rien, et un tag d'essai ou de version candidate (portant un tiret) ne doit pas
# inscrire son numéro dans la page vue par les visiteurs.
if: startsWith(github.ref, 'refs/tags/') && !contains(github.ref_name, '-')
steps:
# Le tag est un état détaché ; la page, elle, est servie par GitHub Pages
# depuis docs/ sur main. C'est donc main qu'on met à jour, et le push
# déclenche la reconstruction de la page.
- uses: actions/checkout@v4
with:
ref: main
# Le numéro est écrit en clair dans la page, à deux endroits repérables :
# le contenu des liens de classe "release-tag" (un par langue, sous les
# boutons de téléchargement) et le champ softwareVersion des données
# structurées, qui lui s'écrit sans le "v" du tag. Rien à charger côté
# visiteur, et le numéro reste affiché sans JavaScript.
- name: Inscrire le tag dans docs/index.html
run: |
sed -i \
-e 's|\(<a class="release-tag"[^>]*>\)[^<]*\(</a>\)|\1'"$GITHUB_REF_NAME"'\2|g' \
-e 's|"softwareVersion": "[^"]*"|"softwareVersion": "'"${GITHUB_REF_NAME#v}"'"|' \
docs/index.html
grep -n 'release-tag\|softwareVersion' docs/index.html
# Rien à pousser si le numéro est déjà le bon (relance du workflow sur un
# tag déjà traité) : sans ce garde-fou, git commit échouerait sur un index
# vide et ferait échouer le job pour rien.
- name: Commiter le numéro s'il a changé
run: |
if git diff --quiet -- docs/index.html; then
echo "La page porte déjà le numéro $GITHUB_REF_NAME."
exit 0
fi
# Identité de l'auteur du dépôt, et non celle du robot : ce commit est
# celui de la release que vous venez de poser, pas la contribution d'un
# tiers. Signer avec le compte du robot le faisait apparaître dans la
# liste des contributeurs du projet.
git config user.name "Olivier Booklage"
git config user.email "obooklage@free.fr"
git add docs/index.html
git commit -m "docs(page): Version $GITHUB_REF_NAME"
git push