← Retour aux articles
Tooling GitHub ActionsDevOpsTypeScript

GitHub Actions : automatiser le CI/CD des projets TypeScript

· 4 min de lecture

Chaque pull request devrait être validée automatiquement avant qu’un humain ne la review. Type checking, linting, tests et vérification du build devraient se lancer sur chaque push sans que personne ne les déclenche manuellement. GitHub Actions rend ça natif au dépôt. Les workflows sont des fichiers YAML committés avec le code, déclenchés par des événements git, et exécutés sur les runners GitHub. Pas de service CI externe à configurer, pas de webhooks à maintenir, pas de dashboard séparé à surveiller.

Un workflow CI complet pour TypeScript

Un seul fichier workflow peut lancer le type checking, le linting et les tests en parallèle. Chaque job tourne sur son propre runner, donc les échecs sont isolés et le temps total du pipeline équivaut au job le plus lent, pas à la somme de tous les jobs.

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  typecheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm tsc --noEmit

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm eslint . --max-warnings 0

  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm vitest run --coverage

L’option cache: pnpm sur setup-node met en cache le store pnpm entre les runs. Ça réduit les temps d’installation de plusieurs minutes à quelques secondes sur les exécutions suivantes. --frozen-lockfile garantit que la CI utilise les versions exactes des dépendances du lockfile, empêchant la dérive “ça marche sur ma machine”.

Workflows réutilisables pour éviter la duplication

Quand plusieurs dépôts partagent la même structure CI, copier les fichiers YAML entre eux crée un fardeau de maintenance. Les workflows réutilisables permettent de définir un workflow une fois et de l’appeler depuis n’importe quel dépôt.

name: Reusable CI

on:
  workflow_call:
    inputs:
      node-version:
        type: string
        default: '22'

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm tsc --noEmit
      - run: pnpm eslint . --max-warnings 0
      - run: pnpm vitest run
name: CI
on: [push, pull_request]

jobs:
  ci:
    uses: your-org/shared-workflows/.github/workflows/ci-reusable.yml@main
    with:
      node-version: '22'

Le workflow appelant fait trois lignes. Toute la logique vit dans le dépôt partagé. Mettre à jour le pipeline CI pour tous les projets revient à modifier un seul fichier.

Automatiser les déploiements avec la protection d’environnements

GitHub Actions gère les pipelines de déploiement avec des règles de protection d’environnement intégrées. Les déploiements en production peuvent nécessiter une approbation manuelle, restreindre les branches autorisées à déployer, et stocker des secrets spécifiques à chaque environnement.

name: Deploy

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm build
      - uses: actions/upload-artifact@v4
        with:
          name: build-output
          path: .next/

  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: build-output
          path: .next/
      - run: echo "Deploying to production..."

La déclaration environment: production se lie aux paramètres d’environnement GitHub où on configure les reviewers requis, les timers d’attente et les politiques de branches de déploiement. L’artefact de build est passé entre les jobs pour que le step de deploy utilise exactement ce qui a été testé.

Workflows planifiés et automatisation

Au-delà du CI/CD, GitHub Actions exécute des tâches planifiées directement dans le dépôt. Audits de dépendances, nettoyage d’issues inactives et health checks périodiques s’intègrent naturellement.

name: Security Audit

on:
  schedule:
    - cron: '0 8 * * 1'

jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm audit --audit-level=high

Ça tourne tous les lundis à 8h. Si pnpm audit trouve des vulnérabilités de sévérité haute, le workflow échoue et GitHub envoie une notification. Pas de service cron externe, pas d’outil de monitoring séparé.

Conclusion

GitHub Actions transforme le dépôt en source unique de vérité pour le code et l’automatisation. Pipelines CI, workflows de déploiement, tâches planifiées et templates réutilisables vivent tous à côté du code sur lequel ils opèrent. Pour les projets TypeScript, la combinaison de jobs parallèles, de cache de dépendances et de protection d’environnements couvre tout le chemin du commit à la production.