الانتقال من Travis


إليك مثالًا لملف .travis.yml (مأخوذ من مسار elm):

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

لتحويل هذا بسرعة إلى GitHub Actions، اتبع الخطوات التالية:

تحديد متغيّرات القالب

المتغيّر القيمة
<track> elm
<image-name> ubuntu-latest
<action to setup tooling> actions/setup-node@v1
<install dependencies> npm ci (يحدث داخل build.sh)
<code-extensions> .elm

عثرتُ على إجراء الإعداد عبر هذا البحث. وعثرتُ على اسم الصورة من خلال النظر إلى التوزيعة الافتراضية في Travis.

تحديد الخطوات

  • bin/fetch-configlet: لم تعد بحاجة إليه عند استخدام سير العمل configlet.yml
  • bin/configlet lint: لم تعد بحاجة إليه عند استخدام سير العمل configlet.yml
  • bin/build.sh: سكربت واحد يفعل كل شيء

تحضير «السكربتات»

يستخدم هذا المسار مجلد bin، لذا أنشئ داخل مجلد bin الملفات التالية:

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

إنشاء هذه كملفات تنفيذية منفصلة سيسمح بالتحسين لاحقًا. لا حاجة لدمج أي شيء الآن.

تعبئة القوالب

إليك الفرق المتعلق بملف 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 على التغييرات نفسها، باستثناء ملحوظ هو حيلة bash التي تستدعي سكربتي pr-check وpr مع كل ملف متغيّر كوسيط:

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

  # ...

الآن يجب أن يعمل

هذا كافٍ للتحويل إلى GitHub Actions، مع إمكانية تحسين سكربتاتك.

  1. من build.sh، احذف الخطوات التي يجب أن تُنفَّذ مرة واحدة فقط، واستخرجها إلى ملفي ci-check.sh وpre-check.sh (تلميح: يمكنك إنشاء lint.sh واستدعاؤه من السكربتين معًا)
  2. إلى pr.sh وpr-check.sh، أضف تحسينات تستخدم الوسائط المُدخَلة لتحديد الملفات أو التمارين التي يجب فحصها.
  3. أضف فحوصات إضافية
  4. أضف توثيقًا لكيفية تشغيل الفحوصات محليًا، وما الذي يحاول كل فحص تحقيقه.