Migrar desde Travis


Aquí tienes un ejemplo de .travis.yml (tomado del track elm):

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

Para convertir esto rápidamente a GitHub Actions, sigue estos pasos:

Determina las variables de la plantilla

variable valor
<track> elm
<image-name> ubuntu-latest
<action to setup tooling> actions/setup-node@v1
<install dependencies> npm ci (sucede dentro de build.sh)
<code-extensions> .elm

Encontré la acción de configuración con esta búsqueda. Encontré el nombre de la imagen al consultar la distribución predeterminada de Travis.

Determina los pasos

  • bin/fetch-configlet: ya no lo necesitas cuando usas el flujo de trabajo configlet.yml
  • bin/configlet lint: ya no lo necesitas cuando usas el flujo de trabajo configlet.yml
  • bin/build.sh: un solo script que hace todo

Prepara los «scripts»

Este track usa la carpeta bin, así que dentro de la carpeta bin, crea los siguientes archivos:

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

Crearlos como binarios separados permitirá optimizar más adelante. No hace falta integrar nada en línea por ahora.

Completa las plantillas

Aquí está el diff para 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 tiene los mismos cambios, con la notable excepción del bash-fu que llama a los scripts pr-check y pr con cada archivo cambiado como argumento:

# # .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

  # ...

Ahora debería funcionar

Esto es suficiente para convertir a GitHub Actions, con la posibilidad de optimizar tus scripts.

  1. De build.sh, elimina los pasos que deberían ejecutarse solo una vez y extráelos a los archivos ci-check.sh y pre-check.sh (sugerencia: puedes crear lint.sh y llamarlo desde ambos «scripts»).
  2. A pr.sh y pr-check.sh, agrégales optimizaciones que usen los argumentos de entrada para determinar qué archivos o ejercicios comprobar.
  3. Agrega comprobaciones adicionales.
  4. Agrega documentación sobre cómo ejecutar las comprobaciones localmente y qué intenta lograr cada una.