Migre depuis Travis


Voici un exemple de .travis.yml (tiré du parcours elm) :

sudo: false
language: node_js
node_js:
  - lts/*
script:
  - bin/fetch-configlet
  - bin/configlet lint
  - bin/build.sh

Pour convertir tout cela rapidement en GitHub Actions, voici les étapes à suivre :

Détermine les variables du modèle

variable valeur
<track> elm
<image-name> ubuntu-latest
<action to setup tooling> actions/setup-node@v1
<install dependencies> npm ci (se fait dans build.sh)
<code-extensions> .elm

On a trouvé l'action de configuration via cette recherche. On a trouvé le nom de l'image en consultant la distribution par défaut de Travis.

Détermine les étapes

  • bin/fetch-configlet : plus besoin de ceci quand on utilise le workflow configlet.yml
  • bin/configlet lint : plus besoin de ceci quand on utilise le workflow configlet.yml
  • bin/build.sh : un seul script qui fait tout

Prépare les « scripts »

Ce parcours utilise le dossier bin, donc dans ce dossier bin, crée les fichiers suivants :

# bin/pr
bin/build.sh
# bin/pr-check
echo "No checks yet"
# bin/ci
bin/build.sh
# bin/ci-check
echo "No checks yet"

Créer ces binaires séparés permettra des optimisations plus tard. Pas besoin de tout intégrer directement pour l'instant.

Remplis les modèles

Voici le diff pour workflows/ci.yml.

# # .github/workflows/ci.yml

  # This workflow will do a clean install of node dependencies and run tests across different versions
  #
- # Replace <track> with the track name
- # Replace <image-name> with an image to run the jobs on
- # Replace <action to setup tooling> with a github action to setup tooling on the image
- # Replace <install dependencies> with a cli command to install the dependencies
- # Replace <code-extensions> with file extensions that should trigger the workflow
- #
- # Find Github Actions to setup tooling here:
- # - https://github.com/actions/?q=setup&type=&language=
- # - https://github.com/actions/starter-workflows/tree/main/ci
- # - https://github.com/marketplace?type=actions&query=setup
- #
  # Requires scripts:
- # - scripts/ci-check
- # - scripts/ci
+ # - bin/ci-check
+ # - bin/ci

- name: <track> / main
+ name: elm / main

  on:
    push:
      branches: [main]
    workflow_dispatch:

  jobs:
    precheck:
-     runs-on: <image-name>
+     runs-on: ubuntu-latest

      steps:
        - uses: actions/checkout@v2
-       - name: Use <setup tooling>
-         uses: <action to setup tooling>
+       - name: Use Node LTS
+         uses: actions/setup-node@v1
          with:
-           # here, use the LTS/stable version of the track's tooling
-           # node-version: 12.x
+           node-version: 12.x

        - name: Install project dependencies
-         run: <install dependencies>
+         run: npm ci

-       - name: Run exercism/<track> ci pre-check (checks config, lint code) for all exercises
-         run: scripts/ci-check
+       - name: Run exercism/elm ci pre-check (checks config, lint code) for all exercises
+         run: bin/ci-check

    ci:
-     runs-on: <image-name>
+     runs-on: ubuntu-latest

      strategy:
        matrix:
-         # here, add all SUPPORTED versions only
-         # version: [10.x, 12.x, 14.x]
+         version: [10.x, 12.x, 14.x]

      steps:
        - uses: actions/checkout@v2
-       - name: Use <setup tooling> ${{ matrix.version }}
-         uses: <action to setup tooling>
+       - name: Use Node ${{ matrix.version }}
+         uses: actions/setup-node@v1
          with:
-           # below: see how to inject the version
-           # node-version: ${{ matrix.version }}
+           node-version: ${{ matrix.version }}

        - name: Install project dependencies
-         run: <install dependencies>
+         run: npm ci

-       - name: Run exercism/<track> ci (runs tests) for all exercises
-         run: scripts/ci
+       - name: Run exercism/elm ci (runs tests) for all exercises
+         run: bin/ci

workflows/pr.yml présente les mêmes changements, à l'exception notable du bash-fu qui appelle les scripts pr-check et pr en passant chaque fichier modifié en argument :

# # .github/workflows/pr.yml

# # ...

-       - name: Run exercism/<track> ci pre-check (stub files, config integrity) for changed exercises
+       - name: Run exercism/elm ci pre-check (stub files, config integrity) for changed exercises
          run: |
            PULL_REQUEST_URL=$(jq -r ".pull_request.url" "$GITHUB_EVENT_PATH")
            curl --url $"${PULL_REQUEST_URL}/files" --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' | \
-             jq -c '.[] | select(.status == "added" or .status == "modified") | select(.filename | match("\\.(<code-extensions>|md|json)$")) | .filename' | \
+             jq -c '.[] | select(.status == "added" or .status == "modified") | select(.filename | match("\\.(elm|md|json)$")) | .filename' | \
-             xargs -r scripts/pr-check
+             xargs -r bin/pr-check

  # ...

Ça devrait maintenant fonctionner

Cela suffit pour passer à GitHub Actions, avec la possibilité d'optimiser tes scripts.

  1. Dans build.sh, supprime les étapes qui ne doivent s'exécuter qu'une seule fois et extrais-les vers les fichiers ci-check.sh et pre-check.sh (indice : tu peux créer lint.sh et l'appeler depuis les deux « scripts »)
  2. Dans pr.sh et pr-check.sh, ajoute des optimisations qui utilisent les arguments d'entrée pour déterminer quels fichiers ou exercices vérifier.
  3. Ajoute des vérifications supplémentaires
  4. Ajoute de la documentation sur la façon de lancer les vérifications en local, et sur ce que chacune cherche à accomplir.