Skip to main content

Migration de GitLab CI/CD vers GitHub Actions

GitHub Actions et GitLab CI/CD partagent plusieurs similitudes de configuration, ce qui facilite grandement la migration vers GitHub Actions.

Remarque

Les exécuteurs hébergés sur GitHub ne sont pas pris en charge sur GitHub Enterprise Server.

Introduction

GitLab CI/CD et GitHub Actions vous permettent tous deux de crĂ©er des workflows qui gĂ©nĂšrent, testent, publient, libĂšrent et dĂ©ploient automatiquement du code. GitLab CI/CD et GitHub Actions partagent certaines similitudes dans la configuration de workflow :

  • Les fichiers de configuration de workflow sont Ă©crits en YAML et sont stockĂ©s dans le dĂ©pĂŽt du code.
  • Les workflows comportent un ou plusieurs travaux.
  • Les travaux incluent une ou plusieurs Ă©tapes ou commandes individuelles.
  • Les travaux peuvent s’exĂ©cuter sur des machines gĂ©rĂ©es ou auto-hĂ©bergĂ©es.

Il existe quelques différences, et ce guide vous montre les différences importantes afin que vous puissiez migrer votre workflow vers GitHub Actions.

travaux

Les travaux dans GitLab CI/CD sont trĂšs similaires aux travaux dans GitHub Actions. Dans les deux systĂšmes, les travaux prĂ©sentent les caractĂ©ristiques suivantes :

  • Les travaux contiennent une sĂ©rie d’étapes ou de scripts qui s’exĂ©cutent de maniĂšre sĂ©quentielle.
  • Les travaux peuvent s’exĂ©cuter sur des machines distinctes ou dans des conteneurs distincts.
  • Les travaux s’exĂ©cutent en parallĂšle par dĂ©faut, mais peuvent ĂȘtre configurĂ©s pour s’exĂ©cuter sĂ©quentiellement.

Vous pouvez exĂ©cuter un script ou une commande d’environnement dans un travail. Dans GitLab CI/CD, les Ă©tapes de script sont spĂ©cifiĂ©es Ă  l’aide de la clĂ© script. Dans GitHub Actions, tous les scripts sont spĂ©cifiĂ©s Ă  l’aide de la clĂ© run.

Voici un exemple de syntaxe pour chaque systĂšme.

Syntaxe CI/CD GitLab pour les travaux

job1:
  variables:
    GIT_CHECKOUT: "true"
  script:
    - echo "Run your script here"

Syntaxe GitHub Actions pour les travaux

jobs:
  job1:
    steps:
      - uses: actions/checkout@v5
      - run: echo "Run your script here"

Exécuteurs

Les exĂ©cuteurs sont des ordinateurs sur lesquels les travaux s’exĂ©cutent. GitLab CI/CD et GitHub Actions offrent des variantes managĂ©es et auto-hĂ©bergĂ©es des exĂ©cuteurs. Dans GitLab CI/CD, des tags sont utilisĂ©es pour exĂ©cuter des travaux sur diffĂ©rentes plateformes, tandis que dans GitHub Actions, cette opĂ©ration est effectuĂ©e avec la clĂ© runs-on.

Voici un exemple de syntaxe pour chaque systĂšme.

Syntaxe CI/CD GitLab pour les exécuteurs

windows_job:
  tags:
    - windows
  script:
    - echo Hello, %USERNAME%!

linux_job:
  tags:
    - linux
  script:
    - echo "Hello, $USER!"

Syntaxe GitHub Actions pour les exécuteurs

windows_job:
  runs-on: windows-latest
  steps:
    - run: echo Hello, %USERNAME%!

linux_job:
  runs-on: ubuntu-latest
  steps:
    - run: echo "Hello, $USER!"

Pour plus d’informations, consultez « Workflow syntax for GitHub Actions Â».

docker images

GitLab CI/CD et GitHub Actions prennent en charge l’exĂ©cution de travaux dans une image Docker. Dans GitLab CI/CD, les images Docker sont dĂ©finies avec une clĂ© image, tandis que dans GitHub Actions, cette opĂ©ration est effectuĂ©e avec la clĂ© container.

Voici un exemple de syntaxe pour chaque systĂšme.

Syntaxe CI/CD GitLab pour les images Docker

my_job:
  image: node:20-bookworm-slim

Syntaxe GitHub Actions pour les images Docker

jobs:
  my_job:
    container: node:20-bookworm-slim

Pour plus d’informations, consultez « Workflow syntax for GitHub Actions Â».

Syntaxe de condition et d’expression

GitLab CI/CD utilise des rules pour dĂ©terminer si un travail s’exĂ©cutera pour une condition spĂ©cifique. GitHub Actions utilise le mot clĂ© if pour empĂȘcher l’exĂ©cution d’un travail, sauf si une condition est remplie.

Voici un exemple de syntaxe pour chaque systĂšme.

Syntaxe CI/CD GitLab pour les conditions et expressions

deploy_prod:
  stage: deploy
  script:
    - echo "Deploy to production server"
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'

Syntaxe GitHub Actions pour les conditions et expressions

jobs:
  deploy_prod:
    if: contains( github.ref, 'master')
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploy to production server"

Pour plus d’informations, consultez « Ă‰valuer les expressions dans les workflows et les actions Â».

Dépendances entre les travaux

GitLab CI/CD et GitHub Actions vous permettent de dĂ©finir des dĂ©pendances pour un travail. Dans les deux systĂšmes, les travaux s’exĂ©cutent en parallĂšle par dĂ©faut, mais les dĂ©pendances de travaux dans GitHub Actions peuvent ĂȘtre spĂ©cifiĂ©es explicitement avec la clĂ© needs. GitLab CI/CD a Ă©galement un concept de stages, oĂč les travaux d’une phase s’exĂ©cutent simultanĂ©ment, mais la phase suivante commence lorsque tous les travaux de la phase prĂ©cĂ©dente sont terminĂ©s. Vous pouvez recrĂ©er ce scĂ©nario dans GitHub Actions avec la clĂ© needs.

Voici un exemple de syntaxe pour chaque systĂšme. Les workflows commencent avec deux travaux nommĂ©s build_a et build_b exĂ©cutĂ©s en parallĂšle et, une fois ces travaux terminĂ©s, un autre travail appelĂ© test_ab s’exĂ©cute. Enfin, une fois test_ab terminĂ©, le travail deploy_ab s’exĂ©cute.

Syntaxe CI/CD GitLab pour les dépendances entre les travaux

stages:
  - build
  - test
  - deploy

build_a:
  stage: build
  script:
    - echo "This job will run first."

build_b:
  stage: build
  script:
    - echo "This job will run first, in parallel with build_a."

test_ab:
  stage: test
  script:
    - echo "This job will run after build_a and build_b have finished."

deploy_ab:
  stage: deploy
  script:
    - echo "This job will run after test_ab is complete"

Syntaxe GitHub Actions pour les dépendances entre les travaux

jobs:
  build_a:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This job will be run first."

  build_b:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This job will be run first, in parallel with build_a"

  test_ab:
    runs-on: ubuntu-latest
    needs: [build_a,build_b]
    steps:
      - run: echo "This job will run after build_a and build_b have finished"

  deploy_ab:
    runs-on: ubuntu-latest
    needs: [test_ab]
    steps:
      - run: echo "This job will run after test_ab is complete"

Pour plus d’informations, consultez « Workflow syntax for GitHub Actions Â».

Planification des workflows

GitLab CI/CD et GitHub Actions vous permettent d’exĂ©cuter des workflows Ă  un intervalle spĂ©cifique. Dans GitLab CI/CD, les planifications de pipelines sont configurĂ©es avec l’interface utilisateur, tandis que dans GitHub Actions, vous pouvez dĂ©clencher un workflow selon un intervalle planifiĂ© avec la clĂ© « on Â».

Pour plus d’informations, consultez « Ă‰vĂ©nements qui dĂ©clenchent des flux de travail Â».

Variables et secrets

GitLab CI/CD et GitHub Actions permettent de définir des variables dans le fichier de configuration du pipeline ou du flux de travail, et de créer des secrets à l'aide de l'interface utilisateur de GitLab ou de GitHub. UI.

Pour plus d’informations, consultez « Stocker des informations dans des variables Â» et « Secrets Â».

Mise en cache

GitLab CI/CD et GitHub Actions fournissent une méthode dans le fichier de configuration pour mettre manuellement en cache les fichiers de workflow.

Voici un exemple de syntaxe pour chaque systĂšme.

Syntaxe CI/CD GitLab pour la mise en cache

image: node:latest

cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - .npm/

before_script:
  - npm ci --cache .npm --prefer-offline

test_async:
  script:
    - node ./specs/start.js ./specs/async.spec.js

Syntaxe GitHub Actions pour la mise en cache

jobs:
  test_async:
    runs-on: ubuntu-latest
    steps:
    - name: Cache node modules
      uses: actions/cache@v4
      with:
        path: ~/.npm
        key: v1-npm-deps-${{ hashFiles('**/package-lock.json') }}
        restore-keys: v1-npm-deps-

Artifacts

GitLab CI/CD et GitHub Actions peuvent charger des fichiers et des rĂ©pertoires créés par un travail en tant qu’artefacts. Dans GitHub Actions, les artefacts peuvent ĂȘtre utilisĂ©s pour conserver des donnĂ©es entre plusieurs travaux.

Voici un exemple de syntaxe pour chaque systĂšme.

Syntaxe CI/CD GitLab pour les artefacts

script:
artifacts:
  paths:
    - math-homework.txt

Syntaxe GitHub Actions pour les artefacts

- name: Upload math result for job 1
  uses: actions/upload-artifact@v3
  with:
    name: homework
    path: math-homework.txt

Pour plus d’informations, consultez « Stocker et partager des donnĂ©es avec les artefacts de workflow Â».

Bases de données et conteneurs de service

Les deux systĂšmes vous permettent d’inclure des conteneurs supplĂ©mentaires pour les bases de donnĂ©es, la mise en cache ou d’autres dĂ©pendances.

Dans GitLab CI/CD, un conteneur pour le travail est spécifié avec la clé image, tandis que GitHub Actions utilise la clé container. Dans les deux systÚmes, des conteneurs de service supplémentaires sont spécifiés avec la clé services.

Voici un exemple de syntaxe pour chaque systĂšme.

Syntaxe CI/CD GitLab pour les bases de données et les conteneurs de service

container-job:
  variables:
    POSTGRES_PASSWORD: postgres
    # The hostname used to communicate with the
    # PostgreSQL service container
    POSTGRES_HOST: postgres
    # The default PostgreSQL port
    POSTGRES_PORT: 5432
  image: node:20-bookworm-slim
  services:
    - postgres
  script:
    # Performs a clean installation of all dependencies
    # in the `package.json` file
    - npm ci
    # Runs a script that creates a PostgreSQL client,
    # populates the client with data, and retrieves data
    - node client.js
  tags:
    - docker

Syntaxe GitHub Actions pour les bases de données et les conteneurs de service

jobs:
  container-job:
    runs-on: ubuntu-latest
    container: node:20-bookworm-slim

    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: postgres

    steps:
      - name: Check out repository code
        uses: actions/checkout@v5

      # Performs a clean installation of all dependencies
      # in the `package.json` file
      - name: Install dependencies
        run: npm ci

      - name: Connect to PostgreSQL
        # Runs a script that creates a PostgreSQL client,
        # populates the client with data, and retrieves data
        run: node client.js
        env:
          # The hostname used to communicate with the
          # PostgreSQL service container
          POSTGRES_HOST: postgres
          # The default PostgreSQL port
          POSTGRES_PORT: 5432

Pour plus d’informations, consultez « Communication avec les conteneurs de service Docker Â».