Migration von Travis


Hier ist ein Beispiel für eine .travis.yml (aus dem elm-Track):

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

Um das schnell in GitHub Actions umzuwandeln, gehst du so vor:

Die Vorlagenvariablen ermitteln

Variable Wert
<track> elm
<image-name> ubuntu-latest
<action to setup tooling> actions/setup-node@v1
<install dependencies> npm ci (geschieht in build.sh)
<code-extensions> .elm

Die Setup-Action habe ich über diese Suche gefunden. Den Namen des Images habe ich der Standard-Distribution für Travis entnommen.

Die Schritte ermitteln

  • bin/fetch-configlet: brauchst du nicht mehr, wenn du den configlet.yml-Workflow verwendest
  • bin/configlet lint: brauchst du nicht mehr, wenn du den configlet.yml-Workflow verwendest
  • bin/build.sh: ein einzelnes Skript, das alles erledigt

Die „scripts“ vorbereiten

Dieser Track verwendet den bin-Ordner. Erstelle also im bin-Ordner die folgenden Dateien:

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

Wenn du diese als getrennte Binärdateien anlegst, kannst du später optimieren. Im Moment musst du noch nichts inline einbauen.

Die Vorlagen ausfüllen

Hier ist das Diff für 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 enthält dieselben Änderungen, mit der bemerkenswerten Ausnahme des Bash-Fu, das die Skripte pr-check und pr mit jeder geänderten Datei als Argument aufruft:

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

  # ...

Jetzt sollte es funktionieren

Das reicht aus, um auf GitHub Actions umzusteigen, und du kannst deine Skripte später optimieren.

  1. Entferne aus build.sh die Schritte, die nur einmal laufen sollten, und verschiebe sie in die Dateien ci-check.sh und pre-check.sh (Tipp: Du kannst lint.sh anlegen und aus beiden „Scripts“ aufrufen).
  2. Füge in pr.sh und pr-check.sh Optimierungen hinzu, die anhand der Eingabeargumente bestimmen, welche Dateien oder Übungen geprüft werden.
  3. Füge zusätzliche Prüfungen hinzu.
  4. Dokumentiere, wie du die Prüfungen lokal ausführst und was jede einzelne erreichen soll.