La promotion de branche CI/CD avec GitHub Actions automatise le passage de code entre environnements en déclenchant des workflows basés sur des événements Git. Elle permet de valider le code, construire des artefacts et déployer de manière sécurisée.
Actuellement, le flux est le suivant :
Feature → PR vers develop → merge après validation
Puis develop → staging → main, avec validation CI à chaque étape.
Ce processus étant chronophage, nous allons l'automatiser avec les conditions suivantes :
→ Déclenchement après push sur develop
→ Création automatique d'une PR vers staging (idem staging → main)
feature branch
↓
PR → develop
↓ (CI OK)
merge
develop mis à jour
↓
PR → staging
↓ (CI OK)
merge
staging mis à jour
↓
PR → main
↓ (CI + tests OK)
merge manuel
Pour automatiser le passage entre branches, plusieurs approches sont possible, voyons cela rapidement:
Les PR créées avec le GITHUB_TOKEN, par défaut ne déclenchent pas les workflows
Il s'agit d'un mécanisme de sécurité pour éviter les boucles infinies.
Pour définir les étapes, une pratique courante consiste à utiliser des fichiers YAML depuis .github/workflows/
Nous créons deux fichiers séparés, ce qui permet l'isolation des responsabilités et l'ajout d'extensions futures
name: Auto PR - Develop to Staging
on:
push:
branches: [develop]
permissions:
contents: read
pull-requests: write
actions: read
jobs:
create-pr:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v6.0.2
with:
fetch-depth: 0
- name: Create PR if needed
env:
GH_TOKEN: ${{ secrets.GH_PAT }}
run: |
set -e
COMMITS=$(gh api \
repos/${{ github.repository }}/compare/staging...develop \
--jq '.ahead_by')
if [ "$COMMITS" -eq 0 ]; then
echo "No differences between develop and staging"
exit 0
fi
COMMIT_MSG=$(git log -1 --pretty=%B)
PR_NUMBER=$(gh pr list \
--base staging \
--head develop \
--json number \
--jq '.[0].number')
if [ -z "$PR_NUMBER" ]; then
gh pr create \
--base staging \
--head develop \
--title "Promote develop → staging" \
--body "Automatic promotion after successful CI.
Commit:
$GITHUB_SHA
https://github.com/${{ github.repository }}/commit/$GITHUB_SHA
Message:
$COMMIT_MSG" \
--label "automated" \
--label "promote"
PR_NUMBER=$(gh pr list \
--base staging \
--head develop \
--json number \
--jq '.[0].number')
else
echo "PR already exists"
fi
echo "PR number: $PR_NUMBER"
echo "$GITHUB_SHA" > deployed_version.txt
- name: Upload deployment info
uses: actions/upload-artifact@v7
with:
name: deployed-version
path: deployed_version.txt
Le fichier "pr-staging-to-main" est similaire, vous pouvez le trouver dans le repository
| Name | Size |
|---|---|
| deployed-version.txt | 194 Bytes |
| Le Digest contient le SHA déployé | |
L'auto-merge n'est pas présent dans ce workflow de base. Il est ajouté dans la section suivante
Pour tester, les commits doivent diverger:
git checkout -b feature/pr-auto
echo "// test" >> README.md
git commit -am "trigger auto promotion"
git push origin feature/pr-auto

Merge pull request #184 from val7304/staging-to-main
Prod Build, Analyze and Deploy Flashcards App #102: Commit f505634 pushed by val7304 main Feb 23, 1:43 AM GMT+1 4m 30s
Promote staging → main
Prod Build, Analyze and Deploy Flashcards App #101: Pull request #184 synchronize by val7304 staging Feb 23, 1:37 AM GMT+1 4m 23s
Merge pull request #186 from val7304/develop-to-staging
CI - Staging #155: Commit f7134b7 pushed by val7304 staging Feb 23, 1:37 AM GMT+1 7m 22s
Promote develop → staging
CI - Staging #154: Pull request #186 synchronize by val7304 develop Feb 23, 1:32 AM GMT+1 4m 26s
Merge pull request #176 from val7304/develop
CI - Staging #149: Commit c94e694 pushed by val7304 staging Feb 22, 10:49 PM GMT+1 7m 12s
Merge pull request #175 from val7304/feature/pr-auto
CI - Develop #109: Commit 0648c2f pushed by val7304 develop Feb 22, 10:40 PM GMT+1 2m 24s
Ajout de l'auto-merge pour finaliser automatiquement la PR après validation des checks.
Modification du workflow, ajout en fin de scriptgh pr merge "$PR_NUMBER" \
--auto \
--merge
Cette commande active l'auto-merge et attend que tous les required checks soient validés
feature → develop
↓
PR auto
↓
CI OK
↓
merge auto
Option Allow auto-merge activée :
Sinon GitHub n'activera pas l'auto-merge correctement
Voir les règles de protection des branches pour rappel
1. Modifier les permissions du token PAT: Contents: read and write

2. Configuration Github
Depuis le projet Settings, activer:
You can allow setting pull requests to merge automatically once all required reviews and status checks have passed
Allow auto-merge
Waits for merge requirements to be met and then merges automatically.
Résultat :→ La Promotion est automatisée, la validation CI est exécutée à chaque étape.
→ Le merge automatique est contrôlé. Le pipeline est fiable et traçable