release-detect
S'exécute sur un push de tag de release et écrit un fichier release.env exposé comme dotenv report GitLab. Les jobs aval qui le consomment via needs reçoivent les variables VERSION, CHANNEL et RELEASE_TYPE dans leur environnement sans les recalculer eux-mêmes.
C'est le pendant côté pipeline-de-tag de release-tag : release-tag pousse le tag → le tag déclenche un nouveau pipeline → release-detect y publie les métadonnées sémantiques.
Snippet d'include
include:
- component: $CI_SERVER_FQDN/spektrum/ci-templates/release-detect@<version>
inputs:
stage: detect
stages:
- detect
- build
- releaseInputs
| Input | Requis | Défaut | Description |
|---|---|---|---|
stage | non | detect | Stage du job. |
image | non | node:lts-alpine | Image utilisée. Doit fournir npm/npx. |
npm_scope | non | @spektrum | Scope npm à configurer pour tirer release-util. |
npm_scope_registry | non | https://npm.internal.spektrum-suisse.ch/ | URL du registry npm associé au scope. Sans ça, npx interroge registry.npmjs.org et reçoit un 404 puisque @spektrum/release-util n'y est pas publié. |
Trigger
$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+(-staging\.[0-9]+)?$/Match strict : pas de préfixe v, format Capgo-compatible (MAJOR.MINOR.PATCH[-staging.N]). Si le projet utilise un autre schéma de tags (v1.2.3, tags datés…), ce composant n'est pas adapté.
Variables émises dans release.env
| Variable | Valeurs |
|---|---|
VERSION | X.Y.Z ou X.Y.Z-staging.N |
CHANNEL | production ou staging |
RELEASE_TYPE | major, minor, patch |
Consommation depuis un job aval
my-downstream-job:
stage: build
needs:
- job: release-detect
artifacts: true
rules:
- if: $CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+(-staging\.[0-9]+)?$/
script:
- echo "Building $VERSION for $CHANNEL (type=$RELEASE_TYPE)"artifacts: true dans needs: est obligatoire : sans ça, GitLab attend release-detect mais ne charge pas son dotenv.
⚠️ Limitation GitLab : RELEASE_TYPE ne peut pas gater rules:
Les rules: GitLab sont évaluées à la création du pipeline, avant que release-detect ne tourne. Donc RELEASE_TYPE (ainsi que VERSION, CHANNEL) ne peut pas être utilisé dans rules:.
Pattern à utiliser : gater le rules: sur ce qui est déjà connu (typiquement le format du $CI_COMMIT_TAG), et court-circuiter en début de script: :
major-only-job:
rules:
- if: $CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+(-staging\.[0-9]+)?$/
needs:
- job: release-detect
artifacts: true
script:
- |
if [ "$RELEASE_TYPE" != "major" ]; then
echo "Skip — RELEASE_TYPE=$RELEASE_TYPE"
exit 0
fi
# … vrai travailLe runtime gate court-circuite proprement. Le job apparaît comme success dans GitLab dans tous les cas — c'est l'idiome standard.
Notes
expire_in: 1 weeksuffit largement : les jobs aval consomment le dotenv dans la même heure que sa création.- Ne pas confondre avec
release-tag:release-tagtourne sur trunk et pousse un tag ;release-detecttourne sur le pipeline du tag querelease-tagvient de pousser.
Cas d'usage typiques
- Capgo OTA upload :
needs release-detect, litVERSIONetCHANNEL, appellenpx @capgo/cli bundle upload --apikey "$CAPGO_TOKEN" --channel "$CHANNEL" --bundle "$VERSION". - Native mobile build (Fastlane) :
needs release-detect, court-circuite siRELEASE_TYPE != "major", sinon bumpcapacitor.config.ts+pbxproj/build.gradleà$VERSION, build, ship. - Déploiement K8s gated :
needs release-detect, déploie l'image${REGISTRY}/${IMAGE}:${VERSION}sur le cluster correspondant à$CHANNEL.
Voir aussi
release-tag— pousse le tag qui déclenche le pipeline dans lequelrelease-detecttourne.../troubleshooting.md— si les variables n'arrivent pas dans le job aval.

