# Déployer avec GitHub Actions, sans l'application

Tu préfères garder la main sur ton workflow, ou tu utilises une autre CI ? L’app GitHub n’est pas nécessaire : la CLI suffit. Ce guide met en place un workflow qui construit et déploie à chaque push.

**Résultat attendu** : un push sur la branche principale publie en production, et un push sur une autre branche publie une preview.

**Ce que tu perds par rapport à l’app** : le déploiement n’apparaît dans Host qu’à l’envoi, sans sortie de build en direct, et le statut du commit n’est pas mis à jour.

## Relier le dossier au projet

1. **Lance un premier déploiement en local**

   Depuis le dossier du projet, avec ta clé d’organisation :

   ```bash
   export VERCEL_TOKEN=ah_…
   vercel --api https://api.host.hgdc.ch deploy --yes
   ```

   La commande crée `.vercel/project.json`, qui contient `orgId` et `projectId`.

   **Vérification** : le fichier `.vercel/project.json` existe, et le projet apparaît dans Host.

2. **Ajoute les secrets au dépôt**

   Dans le dépôt GitHub, ouvre **Settings → Secrets and variables → Actions** et crée trois secrets :

   | Secret              | Valeur                                          |
   | ------------------- | ----------------------------------------------- |
   | `VERCEL_TOKEN`      | Une clé d’API `ah_…` d’organisation             |
   | `VERCEL_ORG_ID`     | La valeur `orgId` de `.vercel/project.json`     |
   | `VERCEL_PROJECT_ID` | La valeur `projectId` de `.vercel/project.json` |

   Ne mets ni la clé ni les identifiants dans le fichier de workflow.

3. **Ajoute le workflow**

   Crée `.github/workflows/deploy.yml` :

   ```yaml
   name: Déploiement

   on:
     push:
       branches: [main]
     pull_request:

   permissions:
     contents: read

   env:
     VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
     VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
     VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
     API: https://api.host.hgdc.ch

   jobs:
     deploy:
       runs-on: ubuntu-latest
       steps:
         - uses: actions/checkout@v7
         - uses: actions/setup-node@v7
           with:
             node-version: 24
         - run: npm install --global vercel@63
         - name: Production
           if: github.ref == 'refs/heads/main'
           run: |
             vercel pull --yes --environment=production --api "$API"
             vercel build --prod --api "$API"
             vercel deploy --prebuilt --prod --api "$API"
         - name: Preview
           if: github.ref != 'refs/heads/main'
           run: |
             vercel pull --yes --environment=preview --api "$API"
             vercel build --api "$API"
             vercel deploy --prebuilt --api "$API"
   ```

   La CLI lit `VERCEL_TOKEN`, `VERCEL_ORG_ID` et `VERCEL_PROJECT_ID` dans l’environnement. Le projet n’a pas besoin d’un dossier `.vercel` dans le dépôt.

   Adapte `node-version` à la version de Node.js de ton projet. Pour un site qui n’a pas de build, supprime les étapes `vercel build`.

   **Vérification** : le run **Déploiement** apparaît dans l’onglet **Actions**, et son job se termine en vert. Le déploiement apparaît dans le projet Host.

## Variables sensibles

Une variable sensible n’est livrée qu’à une clé limitée au projet, celle que pose l’app GitHub. Avec une clé d’organisation, `vercel pull` ne la récupère pas.

Si ton build a besoin d’un secret, passe-le par un secret du dépôt, puis expose-le au build avec `env:`. Ne le mets pas dans une variable publique du projet. Voir [Secrets et coffre](/docs/concepts/secrets-et-coffre/).

## Si ça ne marche pas

- Le job échoue sur `vercel pull` avec un `403` : la clé `VERCEL_TOKEN` est mal copiée ou révoquée. Voir [Dépannage](/docs/guides/depannage/#la-cli-renvoie-403).
- Le job tourne, mais aucun déploiement n’apparaît : vérifie que `VERCEL_PROJECT_ID` et `VERCEL_ORG_ID` viennent bien de `.vercel/project.json`.
