# Prompt pour créer un workflow de déploiement GitHub Actions

> Prompt d'agent IA pour générer un workflow CI/CD GitHub Actions de production pour une application Next.js avec les étapes de vérification de type, test, build et déploiement.

**Type:** Prompt  
**Tools:** Cursor, Claude Code, Codex, Windsurf  
**Stack:** Next.js, TypeScript, Cloudflare  
**Difficulty:** medium  
**Updated:** 2026-06-08

---

Donnez ce prompt à votre agent pour générer un fichier de workflow GitHub Actions éprouvé
qui exécute la vérification de type, les tests et un build de production avant le déploiement — sans
commettre de secrets ni utiliser de versions d'actions dépréciées.

## Prompt Principal

```txt title="Main Prompt"
You are working in a Next.js 15 project that uses TypeScript and Bun as the package manager.
Deployments go to Cloudflare Pages.

Task: create a GitHub Actions CI/CD workflow at `.github/workflows/deploy.yml`.

Requirements:
- Trigger on: `push` to `main` and `pull_request` targeting `main`.
- On pull_request: run only the `ci` job (lint, typecheck, build).
- On push to main: run `ci` then `deploy` (deploy only if ci passes).
- `ci` job:
  - Runner: `ubuntu-latest`.
  - Steps: checkout, setup Bun (`oven-sh/setup-bun@v2`), `bun install --frozen-lockfile`,
    `bun run typecheck`, `bun run build`.
  - Cache: use `actions/cache@v4` to cache `node_modules` keyed on `bun.lock` hash.
- `deploy` job:
  - needs: [ci]
  - if: `github.event_name == 'push'`
  - Deploy to Cloudflare Pages using `cloudflare/wrangler-action@v3`.
  - Secrets used: `CLOUDFLARE_API_TOKEN` and `CLOUDFLARE_ACCOUNT_ID` (from GitHub secrets — do NOT
    hard-code values).
  - Set `command: pages deploy .next --project-name=my-app --branch=main`.
- Add a concurrency group to cancel in-progress runs on the same branch.
- Do NOT pin to `@v1` of any action — use the versions specified above.
- Do NOT store any secret value in the YAML file.

Stop and show the complete workflow YAML before writing the file.
```

## Notes d'Implémentation

- `oven-sh/setup-bun@v2` installe la version de Bun depuis `.bun-version` ou `package.json#engines.bun`
  si présent — assurez-vous que l'un de ces fichiers existe ou spécifiez avec `bun-version: '1.x'`.
- `--frozen-lockfile` empêche le CI de mettre à jour silencieusement les dépendances ; un échec ici signifie que `bun.lock`
  est désynchronisé localement.
- Cloudflare Pages avec `wrangler-action@v3` nécessite que le projet existe dans le tableau de bord Cloudflare
  en premier lieu — documentez cette condition préalable dans un commentaire à l'intérieur du YAML.
- Concurrence : utilisez `group: ${{ github.workflow }}-${{ github.ref }}` avec `cancel-in-progress: true`.

## Changements de Fichiers Attendus

```txt
.github/workflows/deploy.yml    (new)
```

## Critères d'Acceptation

- Une PR vers `main` déclenche uniquement le job `ci` et publie un statut de vérification.
- La fusion vers `main` déclenche `ci` puis `deploy`, dans cet ordre.
- Aucun secret n'apparaît dans le fichier YAML.
- Un deuxième push sur la même branche annule la précédente exécution en cours.

## Commandes de Test

```bash
# validate YAML syntax locally
bun x @actions/validator .github/workflows/deploy.yml || true
# or use actionlint
docker run --rm -v "$(pwd):/repo" rhysd/actionlint:latest /repo/.github/workflows/deploy.yml
```

## Erreurs Courantes des IA

- Coder en dur la valeur de `CLOUDFLARE_API_TOKEN` au lieu d'utiliser `${{ secrets.CLOUDFLARE_API_TOKEN }}`.
- Utiliser des versions dépréciées `actions/checkout@v2` ou `actions/cache@v2` au lieu de v4.
- Exécuter le job de déploiement sur des événements pull_request, ce qui déploie depuis des forks.
- Oublier `needs: [ci]` sur le job de déploiement, permettant des déploiements même si les tests échouent.

## Prompt de Correction

```txt title="Fix Prompt"
The workflow deploys even when CI fails, or secrets are exposed. Fix in order:
1. Add `needs: [ci]` to the `deploy` job.
2. Add `if: github.event_name == 'push' && github.ref == 'refs/heads/main'` to the deploy job.
3. Replace any hard-coded token values with `${{ secrets.CLOUDFLARE_API_TOKEN }}`.
4. Upgrade any @v1/@v2 action references to the versions specified in the original prompt.
Show only the corrected YAML diff.
```