Skip to main content

Création et test de code Ruby

Vous pouvez crĂ©er un workflow d’intĂ©gration continue (CI) pour gĂ©nĂ©rer et tester votre projet Ruby.

Introduction

Ce guide explique comment crĂ©er un workflow d’intĂ©gration continue (CI) qui gĂ©nĂšre et teste une application Ruby. Si vos tests CI rĂ©ussissent, vous pouvez dĂ©ployer votre code ou publier un gem.

Prérequis

Il est recommandĂ© d’avoir une comprĂ©hension de base de Ruby, du YAML, des options de configuration de workflows et de la crĂ©ation de fichiers de workflow. Pour plus d'informations, consultez les pages suivantes :

Utilisation d’un modùle de workflow Ruby

Pour démarrer rapidement, ajoutez un modÚle de workflow au répertoire .github/workflows de votre référentiel.

GitHub fournit un modĂšle de workflow pour Ruby qui devrait fonctionner pour la plupart des projets Ruby. Les sections suivantes de ce guide donnent des exemples de la maniĂšre dont vous pouvez personnaliser ce modĂšle de workflow.

  1. Sur GitHub, accédez à la page principale du référentiel.

  2. Sous le nom de votre dépÎt, cliquez sur Actions.

    Capture d’écran des onglets du rĂ©fĂ©rentiel « github/docs Â». L’onglet « Actions Â» est mis en surbrillance avec un encadrĂ© orange.

  3. Si vous disposez dĂ©jĂ  d’un workflow dans votre dĂ©pĂŽt, cliquez sur Nouveau workflow.

  4. La page « Choisir un workflow Â» prĂ©sente une sĂ©lection de modĂšles de workflow recommandĂ©s. Recherchez « ruby Â».

  5. Filtrez la sélection des flux de travail en cliquant sur Intégration continue.

  6. Dans le flux de travail « Ruby Â», cliquez sur Configurer.

  7. Modifiez le workflow en fonction des besoins. Par exemple, modifiez les versions de Ruby que vous voulez utiliser.

    Remarque

    • Ce modĂšle de workflow contient une action qui n’est pas certifiĂ©e par GitHub. Elles sont fournies par un tiers et sont rĂ©gies par des conditions d’utilisation du service, une politique de confidentialitĂ© et une documentation de support distinctes.
    • Si vous utilisez des actions de tiers, vous devez utiliser une version spĂ©cifiĂ©e par un commit SHA. Si l’action est rĂ©visĂ©e et que vous voulez utiliser la version la plus rĂ©cente, vous devez mettre Ă  jour le SHA. Vous pouvez spĂ©cifier une version en faisant rĂ©fĂ©rence Ă  une balise ou Ă  une branche, mais l’action peut changer sans avertissement. Pour plus d’informations, consultez « Informations de rĂ©fĂ©rence sur l’utilisation sĂ©curisĂ©e Â».
  8. Cliquez sur Valider les changements.

Le fichier de workflow ruby.yml est ajoutĂ© Ă  l’annuaire .github/workflows de votre rĂ©fĂ©rentiel.

Spécification de la version Ruby

Le moyen le plus simple de spĂ©cifier une version Ruby consiste Ă  utiliser l’action ruby/setup-ruby fournie par Ruby sur GitHub. L’action ajoute toute version Ruby prise en charge Ă  PATH pour chaque exĂ©cution de travail d’un workflow. Pour plus d’informations et pour connaĂźtre les versions Ruby disponibles, consultez ruby/setup-ruby.

L’action ruby/setup-ruby de Ruby est recommandĂ©e pour utiliser Ruby avec GitHub Actions, car elle garantit un comportement cohĂ©rent entre les diffĂ©rents exĂ©cuteurs et les diffĂ©rentes versions de Ruby.

L’action setup-ruby prend une version Ruby en tant qu’entrĂ©e et configure cette version sur l’exĂ©cuteur.

steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
  with:
    ruby-version: '3.1' # Not needed with a .ruby-version file
- run: bundle install
- run: bundle exec rake

Vous pouvez Ă©galement effectuer le check-in d’un fichier .ruby-version Ă  la racine de votre dĂ©pĂŽt pour que setup-ruby utilise la version dĂ©finie dans ce fichier.

Effectuer des tests avec plusieurs versions de Ruby

Vous pouvez ajouter une stratĂ©gie de matrice pour exĂ©cuter votre workflow avec plusieurs versions de Ruby. Par exemple, vous pouvez tester votre code par rapport aux derniĂšres versions correctives des versions 3.1, 3.0 et 2.7.

strategy:
  matrix:
    ruby-version: ['3.1', '3.0', '2.7']

Chaque version de Ruby spĂ©cifiĂ©e dans le tableau ruby-version crĂ©e un travail qui exĂ©cute les mĂȘmes Ă©tapes. Le contexte ${{ matrix.ruby-version }} est utilisĂ© pour accĂ©der Ă  la version du travail actuel. Pour plus d’informations sur les stratĂ©gies de matrice et les contextes, consultez « Workflow syntax for GitHub Actions Â» et « RĂ©fĂ©rence sur les contextes Â».

Le workflow complet mis Ă  jour avec une stratĂ©gie de matrice peut ressembler Ă  ceci :

# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialitĂ© et un support distincts.
# documentation en ligne.

# GitHub recommande d’épingler les actions Ă  un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez Ă©galement rĂ©fĂ©rencer une balise ou une branche, mais l’action peut changer sans avertissement.

name: Ruby CI

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

jobs:
  test:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        ruby-version: ['3.1', '3.0', '2.7']

    steps:
      - uses: actions/checkout@v4
      - name: Set up Ruby ${{ matrix.ruby-version }}
        uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
        with:
          ruby-version: ${{ matrix.ruby-version }}
      - name: Install dependencies
        run: bundle install
      - name: Run tests
        run: bundle exec rake

Installation de dépendances avec Bundler

L’action setup-ruby installe automatiquement Bundler. La version est dĂ©terminĂ©e par votre fichier gemfile.lock. Si aucune version n’est prĂ©sente dans votre lockfile, la derniĂšre version compatible sera installĂ©e.

steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
  with:
    ruby-version: '3.1'
- run: bundle install

Mise en cache des dépendances

Les actions setup-ruby fournissent une méthode pour gérer automatiquement la mise en cache de vos gemmes entre les exécutions.

Pour activer la mise en cache, définissez les éléments suivants.

steps:
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
  with:
    bundler-cache: true

Cela configurera Bundler de maniÚre à installer vos gems sur vendor/cache. Pour chaque exécution réussie de votre workflow, ce dossier sera mis en cache par GitHub Actions, puis re-téléchargé pour les exécutions de workflows suivantes. Un hachage de votre gemfile.lock et la version de Ruby sont utilisés comme clé de cache. Si vous installez de nouveaux gems ou modifiez une version, le cache ne sera plus valide et Bundler effectuera une nouvelle installation.

Mise en cache sans setup-ruby

Pour mieux contrĂŽler la mise en cache, vous pouvez utiliser l’action actions/cache directement. Pour plus d’informations, consultez « RĂ©fĂ©rence sur la mise en cache des dĂ©pendances Â».

steps:
- uses: actions/cache@v4
  with:
    path: vendor/bundle
    key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
    restore-keys: |
      ${{ runner.os }}-gems-
- name: Bundle install
  run: |
    bundle config path vendor/bundle
    bundle install --jobs 4 --retry 3

Si vous utilisez une build de matrice, vous devez inclure les variables de matrice dans votre clĂ© de cache. Par exemple, si vous avez une stratĂ©gie de matrice pour diffĂ©rentes versions de Ruby (matrix.ruby-version) et diffĂ©rents systĂšmes d’exploitation (matrix.os), vos Ă©tapes de workflows peuvent ressembler Ă  ceci :

steps:
- uses: actions/cache@v4
  with:
    path: vendor/bundle
    key: bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
    restore-keys: |
      bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby-version }}-
- name: Bundle install
  run: |
    bundle config path vendor/bundle
    bundle install --jobs 4 --retry 3

Tester votre code avec la matrice

L’exemple de matrice suivant teste toutes les versions stables et versions principales de MRI, JRuby et TruffleRuby sur Ubuntu et macOS.

# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialitĂ© et un support distincts.
# documentation en ligne.

# GitHub recommande d’épingler les actions Ă  un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez Ă©galement rĂ©fĂ©rencer une balise ou une branche, mais l’action peut changer sans avertissement.

name: Matrix Testing

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

jobs:
  test:
    runs-on: ${{ matrix.os }}-latest
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu, macos]
        ruby: [2.5, 2.6, 2.7, head, debug, jruby, jruby-head, truffleruby, truffleruby-head]
    continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
    steps:
      - uses: actions/checkout@v4
      - uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
        with:
          ruby-version: ${{ matrix.ruby }}
      - run: bundle install
      - run: bundle exec rake

Linting de votre code

L’exemple suivant installe rubocop, et l’utilise pour effectuer le linting de tous les fichiers. Pour plus d’informations, consultez RuboCop. Vous pouvez configurer Rubocop pour dĂ©cider des rĂšgles de linting.

# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialitĂ© et un support distincts.
# documentation en ligne.

# GitHub recommande d’épingler les actions Ă  un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez Ă©galement rĂ©fĂ©rencer une balise ou une branche, mais l’action peut changer sans avertissement.

name: Linting

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
        with:
          ruby-version: '2.6'
      - run: bundle install
      - name: Rubocop
        run: rubocop -f github

La spĂ©cification -f github signifie que la sortie RuboCop sera dans le format d’annotation GitHub. Toutes les erreurs de linting seront affichĂ©es en ligne dans l’onglet Fichiers modifiĂ©s de la demande de traction qui les a introduites.

Publication de gems

Vous pouvez configurer votre workflow pour publier votre package Ruby dans n’importe quel registre de packages lorsque vos tests d’intĂ©gration continue rĂ©ussissent.

Vous pouvez stocker tous les jetons d’accĂšs ou informations d’identification nĂ©cessaires pour publier votre package Ă  l’aide de secrets de dĂ©pĂŽt. L’exemple suivant crĂ©e et publie un package sur GitHub Package Registry et RubyGems.

# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialitĂ© et un support distincts.
# documentation en ligne.

# GitHub recommande d’épingler les actions Ă  un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez Ă©galement rĂ©fĂ©rencer une balise ou une branche, mais l’action peut changer sans avertissement.

name: Ruby Gem

on:
  # Manually publish
  workflow_dispatch:
  # Alternatively, publish whenever changes are merged to the `main` branch.
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    name: Build + Publish
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read

    steps:
      - uses: actions/checkout@v4
      - name: Set up Ruby 2.6
        uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
        with:
          ruby-version: '2.6'
      - run: bundle install

      - name: Publish to GPR
        run: |
          mkdir -p $HOME/.gem
          touch $HOME/.gem/credentials
          chmod 0600 $HOME/.gem/credentials
          printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
          gem build *.gemspec
          gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
        env:
          GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
          OWNER: ${{ github.repository_owner }}

      - name: Publish to RubyGems
        run: |
          mkdir -p $HOME/.gem
          touch $HOME/.gem/credentials
          chmod 0600 $HOME/.gem/credentials
          printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
          gem build *.gemspec
          gem push *.gem
        env:
          GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"