Áttérés a Travisről


Íme egy példa .travis.yml (az elm kurzusból):

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

Ahhoz, hogy ezt gyorsan GitHub Actionsre váltsd, tedd a következőket:

A sablonváltozók meghatározása

változó érték
<track> elm
<image-name> ubuntu-latest
<action to setup tooling> actions/setup-node@v1
<install dependencies> npm ci (a build.sh-ban történik)
<code-extensions> .elm

A setup actiont ezen a keresésen keresztül találtam meg. Az image nevét úgy találtam meg, hogy megnéztem a Travis alapértelmezett disztribúcióját.

A lépések meghatározása

  • bin/fetch-configlet: erre már nincs szükség, ha a configlet.yml workflow-t használod
  • bin/configlet lint: erre már nincs szükség, ha a configlet.yml workflow-t használod
  • bin/build.sh: egyetlen szkript, ami mindent elvégez

A »scriptek« előkészítése

Ez a kurzus a bin mappát használja, ezért a bin mappán belül hozd létre a következő fájlokat:

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

Ha ezeket külön binárisként hozod létre, később optimalizálhatod őket. Most még nem kell semmit beágyaznod.

A sablonok kitöltése

Íme a workflows/ci.yml diffje.

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

A workflows/pr.yml ugyanazokat a változtatásokat tartalmazza, egy figyelemre méltó kivétellel: a bash-fu minden megváltozott fájlt argumentumként ad át a pr-check és pr szkriptnek:

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

  # ...

Most már működnie kell

Ez elegendő az átálláshoz GitHub Actionsre, és a szkriptjeidet később optimalizálhatod is.

  1. A build.sh-ból távolítsd el azokat a lépéseket, amelyeknek csak egyszer kell lefutniuk, és emeld ki őket a ci-check.sh és pre-check.sh fájlokba (tipp: létrehozhatsz egy lint.sh-t is, és azt mindkét »scriptből« meghívhatod)
  2. A pr.sh-hoz és a pr-check.sh-hoz adj olyan optimalizálásokat, amelyek a bemeneti argumentumok segítségével döntik el, mely fájlokat vagy feladatokat kell ellenőrizni.
  3. Adj hozzá további ellenőrzéseket.
  4. Írj dokumentációt arról, hogyan futtathatók az ellenőrzések helyben, és hogy mit próbál elérni mindegyik.