Chaque workflow se déclenchait sur push (toutes branches) et sur pull_request : chaque commit de PR jouait tout deux fois. sonarqube.yml reconstruisait et retestait front, back et ML en parallèle des workflows qui le faisaient déjà, et son test backend tournait sans uv sync. ci.yml devient le seul point d'entrée (pull_request, push sur dev et main) : - paths-filter choisit les composants à jouer sur une PR, tout est rejoué sur dev et main ; - backend, frontend, ml, airflow et infra passent en workflow_call ; - le job sonar reprend les couvertures versées par ces jobs au lieu de tout rejouer ; - « CI ok » agrège le résultat, seul check à exiger dans les règles de branche. Au passage : - npm run test:ci au lieu de npm test --watch=false, option que npm gardait pour lui ; - uv sync --locked au lieu de --frozen, pour qu'un verrou périmé casse la CI ; - setup-uv et sonarqube-scan-action épinglés sur un SHA (règle S7637), timeout sur chaque job ; - frontend : un seul npm ci pour la construction et les tests ; - infra : validation des fichiers Compose et actionlint sur les workflows ; - exclusions Sonar en globs, doublon apps/frontend/sonar-project.properties supprimé.
90 lines
2.7 KiB
YAML
90 lines
2.7 KiB
YAML
name: Infra
|
|
|
|
# Pourquoi : rien de ce qui décrit l'infrastructure ne s'exécute avant le déploiement. Terraform est
|
|
# resté cassé sans que rien ne le dise, faute de job qui le joue : ce workflow n'applique rien, il
|
|
# vérifie le Terraform, les fichiers Compose et les workflows eux-mêmes - jobs terraform, compose,
|
|
# workflows. ci.yml choisit par ses entrées ceux qui tournent (ADR 0014).
|
|
# Piège : la boucle Terraform parcourt `environments/*`, pour qu'une racine ajoutée soit couverte
|
|
# sans toucher à ce fichier.
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
terraform:
|
|
type: boolean
|
|
default: false
|
|
compose:
|
|
type: boolean
|
|
default: false
|
|
workflows:
|
|
type: boolean
|
|
default: false
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
terraform:
|
|
name: Formatage et validation Terraform
|
|
if: inputs.terraform
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Action tierce, épinglée sur le commit du tag (règle Sonar githubactions:S7637).
|
|
- name: Installe Terraform
|
|
uses: hashicorp/setup-terraform@dfe3c3f87815947d99a8997f908cb6525fc44e9e # v4.0.1
|
|
with:
|
|
terraform_version: 1.16.3
|
|
terraform_wrapper: false
|
|
|
|
- name: Vérifie le formatage
|
|
run: terraform fmt -check -recursive infra/terraform
|
|
|
|
- name: Valide chaque racine
|
|
run: |
|
|
for racine in infra/terraform/environments/*/; do
|
|
echo "::group::${racine}"
|
|
terraform -chdir="${racine}" init -backend=false -input=false
|
|
terraform -chdir="${racine}" validate
|
|
echo "::endgroup::"
|
|
done
|
|
|
|
compose:
|
|
name: Validation des fichiers Compose
|
|
if: inputs.compose
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Compose interpole tout le fichier : les `:?` exigent une valeur, pas un vrai secret.
|
|
- name: Prépare un .env d'exemple
|
|
run: cp .env.example .env
|
|
|
|
- name: Valide la stack de développement
|
|
run: docker compose config --quiet
|
|
|
|
- name: Valide la stack déployée, profils compris
|
|
run: docker compose -f docker-compose.yml -f docker-compose.prod.yml --profile acme config --quiet
|
|
|
|
workflows:
|
|
name: Analyse des workflows
|
|
if: inputs.workflows
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
# Image épinglée par tag, comme les images des fichiers Compose. Elle embarque shellcheck,
|
|
# qui analyse aussi les blocs `run:`.
|
|
- name: actionlint
|
|
run: docker run --rm -v "$PWD:/repo" --workdir /repo rhysd/actionlint:1.7.12 -color
|