Skip to content

Commit 7edef29

Browse files
authored
Merge pull request #84 from SliDeeN/ci-beta-workflow
ci: add the beta release workflow to main
2 parents 9a857b8 + b1008e7 commit 7edef29

1 file changed

Lines changed: 134 additions & 0 deletions

File tree

‎.github/workflows/beta.yml‎

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
name: Beta release
2+
3+
# Publie une PRE-RELEASE GitHub consommee par le canal beta de l'application.
4+
#
5+
# Difference avec "Test build" : ce workflow PUBLIE, donc les APK arrivent en OTA chez les
6+
# testeurs qui ont coche « Canal de mise a jour beta ». Ne le declencher que sur un etat du
7+
# code qu'on accepte de diffuser.
8+
#
9+
# Le numero de version installe DOIT correspondre au tag, sinon la mise a jour est reproposee
10+
# en boucle : d'ou -Pmg4.versionSuffix, qui injecte le suffixe dans le versionName de l'APK.
11+
#
12+
# La release stable (release.yml) reste prioritaire : a numero egal, une pre-release est
13+
# consideree ANTERIEURE (precedence semver), donc la stable remplace toujours la derniere beta.
14+
on:
15+
workflow_dispatch:
16+
inputs:
17+
label:
18+
description: "Identifiant de la beta (ex: beta1, rc2)"
19+
type: string
20+
default: beta
21+
notes:
22+
description: "Ce qu'il faut tester / ce qui a change"
23+
type: string
24+
default: ""
25+
26+
permissions:
27+
contents: write
28+
29+
jobs:
30+
build:
31+
runs-on: ubuntu-latest
32+
env:
33+
MG4_KEYSTORE_BASE64: ${{ secrets.MG4_KEYSTORE_BASE64 }}
34+
steps:
35+
- uses: actions/checkout@v4
36+
37+
- uses: actions/setup-java@v4
38+
with:
39+
distribution: temurin
40+
java-version: "17"
41+
42+
- name: Setup Gradle
43+
uses: gradle/actions/setup-gradle@v4
44+
45+
- name: Decode platform keystore
46+
run: |
47+
if [ -z "$MG4_KEYSTORE_BASE64" ]; then
48+
echo "::error::MG4_KEYSTORE_BASE64 absent. Une beta NON signee par la cle plateforme"
49+
echo "::error::serait refusee a l'installation par le controle de signature (T-901)."
50+
exit 1
51+
fi
52+
printf '%s' "$MG4_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore"
53+
if [ "$(head -c1 "$RUNNER_TEMP/platform.keystore" | od -An -tx1 | tr -d ' ')" != "30" ]; then
54+
echo "::error::MG4_KEYSTORE_BASE64 est invalide. Recreer le secret avec : base64 -w0 platform.keystore"
55+
exit 1
56+
fi
57+
echo "MG4_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV"
58+
59+
# Suffixe unique et croissant : le numero de run garantit qu'une beta publiee apres une
60+
# autre est bien vue comme posterieure, meme si le libelle saisi est identique.
61+
- name: Compute version
62+
id: ver
63+
run: |
64+
# sed plutot que grep -oP : PCRE depend de la locale du runner, sed non.
65+
BASE=$(sed -n 's/.*versionName = "\([^"]*\)".*/\1/p' app/build.gradle.kts | head -1)
66+
if [ -z "$BASE" ]; then
67+
echo "::error::versionName introuvable dans app/build.gradle.kts"; exit 1
68+
fi
69+
SUFFIX="-${{ inputs.label }}.${{ github.run_number }}"
70+
echo "base=$BASE" >> "$GITHUB_OUTPUT"
71+
echo "suffix=$SUFFIX" >> "$GITHUB_OUTPUT"
72+
echo "full=${BASE}${SUFFIX}" >> "$GITHUB_OUTPUT"
73+
echo "Version beta : ${BASE}${SUFFIX}"
74+
75+
- name: Build online + offline APKs
76+
env:
77+
MG4_KEYSTORE_PASSWORD: ${{ secrets.MG4_KEYSTORE_PASSWORD }}
78+
MG4_KEY_ALIAS: ${{ secrets.MG4_KEY_ALIAS }}
79+
MG4_KEY_PASSWORD: ${{ secrets.MG4_KEY_PASSWORD }}
80+
run: |
81+
chmod +x gradlew
82+
./gradlew assembleOnlineRelease assembleOfflineRelease --no-daemon \
83+
-Pmg4.versionSuffix='${{ steps.ver.outputs.suffix }}'
84+
85+
- name: Collect APKs
86+
run: |
87+
mkdir -p dist
88+
find app/build/outputs/apk -name "MG4Control-*.apk" -exec cp {} dist/ \;
89+
ls -la dist/
90+
91+
# Controle que l'APK annonce bien la version du tag : c'est la condition pour que l'OTA
92+
# cesse de proposer la mise a jour une fois installee.
93+
- name: Verify APK version matches the tag
94+
run: |
95+
AAPT=$(ls "$ANDROID_SDK_ROOT"/build-tools/*/aapt2 | sort -V | tail -1)
96+
EXPECTED='${{ steps.ver.outputs.full }}'
97+
for f in dist/*.apk; do
98+
GOT=$("$AAPT" dump badging "$f" | grep -oP "versionName='\K[^']+")
99+
echo "$(basename "$f") -> $GOT"
100+
case "$GOT" in
101+
"$EXPECTED"|"$EXPECTED-offline") ;;
102+
*) echo "::error::$(basename "$f") annonce '$GOT', attendu '$EXPECTED'"; exit 1 ;;
103+
esac
104+
done
105+
106+
- name: Signature report
107+
run: |
108+
APKSIGNER=$(ls "$ANDROID_SDK_ROOT"/build-tools/*/apksigner | sort -V | tail -1)
109+
for f in dist/*.apk; do
110+
echo "-- $(basename "$f") --"
111+
"$APKSIGNER" verify --print-certs -v "$f" 2>&1 \
112+
| grep -E 'Verified using v[0-9]|certificate SHA-256 digest' || echo " (non verifiable)"
113+
done
114+
115+
- name: Publish pre-release
116+
uses: softprops/action-gh-release@v2
117+
with:
118+
tag_name: v${{ steps.ver.outputs.full }}
119+
name: Beta ${{ steps.ver.outputs.full }}
120+
prerelease: true
121+
files: dist/*.apk
122+
body: |
123+
## MG4Control ${{ steps.ver.outputs.full }} — version de test
124+
125+
> Diffusee uniquement aux utilisateurs ayant active
126+
> **Reglages -> Reglages avances -> Canal de mise a jour beta**.
127+
> Le retour a une version anterieure n'est pas possible par mise a jour.
128+
129+
${{ inputs.notes }}
130+
131+
| Variante | Fichier | Reseau | Mise a jour auto |
132+
|---|---|---|---|
133+
| **Online** | `MG4Control-online-*.apk` | oui | oui |
134+
| **Offline** | `MG4Control-offline-*.apk` | aucun | non |

0 commit comments

Comments
 (0)