مهاجرت از 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"

ساختن این‌ها به‌صورت باینری‌های جداگانه امکان بهینه‌سازی در آینده را فراهم می‌کند. الان نیازی نیست چیزی را درون‌خطی کنید.

پر کردن الگوها

در ادامه diff مربوط به 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-fu اسکریپت‌های 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. مستندسازی اضافه کنید که توضیح دهد چگونه بررسی‌ها را به‌صورت محلی اجرا کنید و هر یک چه هدفی را دنبال می‌کند.