From 2d927a0cb9bcda0e755f5d34916a1da204c857ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bertrand?= Date: Fri, 23 Oct 2026 23:22:47 +0200 Subject: [PATCH] ci: deploy main to gh-pages and check PRs to main MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - deploy.yml builds main on every merge and publishes dist/ to the gh-pages branch through a dedicated deploy key - ci.yml builds on push to dev and on PRs to main, and requires PRs to main to come from dev - README documents the dev → main → gh-pages flow and the rulesets Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 49 ++++++++++++++++++++++++++++++++++++ .github/workflows/deploy.yml | 41 +++++++++++++----------------- README.md | 31 +++++++++++++++++++++-- 3 files changed, 96 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c2ceec4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,49 @@ +# Vérifications d'une pull request vers main (toutes deux obligatoires pour merger) : +# - Build : le site se construit (les fichiers de réglage et le contenu sont valides) ; +# - Source dev : la PR part de la branche dev. +# Le build tourne aussi à chaque push sur dev, pour voir tôt ce qui casse. +name: CI + +on: + pull_request: + branches: [main] + push: + branches: [dev] + +permissions: + contents: read + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + source: + name: Source dev + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - name: La PR vers main doit partir de dev + env: + HEAD_REF: ${{ github.head_ref }} + run: | + if [ "$HEAD_REF" != "dev" ]; then + echo "::error::Les PR vers main doivent partir de la branche dev (branche actuelle : $HEAD_REF)." + exit 1 + fi + echo "PR depuis dev : OK" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2c3a235..0116835 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,22 +1,23 @@ -name: Deploy to GitHub Pages +# Mise en production : à chaque merge dans main, construit le site et publie dist/ dans la +# branche gh-pages, servie par GitHub Pages (Settings → Pages : branche gh-pages, dossier /). +# gh-pages est protégée : seule la clé de déploiement GH_PAGES_DEPLOY_KEY peut y écrire. +name: Deploy to gh-pages on: push: - branches: - - main + branches: [main] workflow_dispatch: permissions: contents: read - pages: write - id-token: write concurrency: - group: pages - cancel-in-progress: true + group: deploy-gh-pages + cancel-in-progress: false jobs: - build: + deploy: + name: Build & deploy runs-on: ubuntu-latest steps: - name: Checkout @@ -25,7 +26,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: npm - name: Install dependencies @@ -34,18 +35,12 @@ jobs: - name: Build run: npm run build - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + - name: Publish dist/ to gh-pages + uses: peaceiris/actions-gh-pages@v4 with: - path: dist - - deploy: - needs: build - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + deploy_key: ${{ secrets.GH_PAGES_DEPLOY_KEY }} + publish_branch: gh-pages + publish_dir: ./dist + user_name: github-actions[bot] + user_email: 41898282+github-actions[bot]@users.noreply.github.com + full_commit_message: "deploy: ${{ github.sha }}" diff --git a/README.md b/README.md index ad46254..fb694c1 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Portfolio · orelink.github.io Site statique (Astro), une seule page qui défile, pensée autant pour l'ordinateur que -pour le téléphone. Publié sur GitHub Pages à chaque push sur `main` -(`.github/workflows/deploy.yml`). +pour le téléphone. Publié sur GitHub Pages à chaque merge dans `main` (voir +« Branches et mise en ligne »). ```bash npm install @@ -11,6 +11,33 @@ npm run build # génère dist/ (et vérifie tous les réglages) npm run preview # sert dist/ ``` +## Branches et mise en ligne + +| Branche | Rôle | Qui peut y écrire | +|---|---|---| +| `dev` | développement : on y pousse son travail | tout le monde (push direct) | +| `main` | production : ce qui est en ligne | personne en direct, uniquement par PR depuis `dev` | +| `gh-pages` | le site construit (`dist/`), servi par GitHub Pages | uniquement l'action de déploiement | + +Le circuit : + +1. Travailler sur `dev`, pousser : la CI construit le site à chaque push. +2. Ouvrir une PR `dev` → `main`. Deux vérifications doivent passer pour pouvoir merger : + **Build** (le site se construit) et **Source dev** (la PR part bien de `dev`). +3. Merger la PR : `.github/workflows/deploy.yml` construit `main` et publie `dist/` dans + `gh-pages`. Le site est en ligne une à deux minutes plus tard. + +Les règles sont des *rulesets* GitHub (Settings → Rules → Rulesets) : + +- **main** : PR obligatoire, vérifications Build et Source dev obligatoires, ni force push ni + suppression. Personne ne les contourne, administrateur compris. +- **gh-pages** : écriture réservée à la clé de déploiement « gh-pages deploy (GitHub + Actions) » (Settings → Deploy keys), dont la partie privée est le secret + `GH_PAGES_DEPLOY_KEY` de l'action. Ni force push ni suppression. + +GitHub Pages sert la branche `gh-pages`, dossier `/` (Settings → Pages). Pour relancer une +mise en ligne sans changement : Actions → Deploy to gh-pages → Run workflow. + ## Modifier le site : les fichiers de réglage Tout ce qui s'affiche vient de ces fichiers. On n'a jamais besoin de toucher au code.