Примечание. В GitHub Enterprise Server в настоящее время не поддерживаются средства выполнения тестов, размещенные в GitHub. Дополнительные сведения о планируемой поддержке в будущем см. в GitHub public roadmap.
Обзор примера
В этой статье на примере рабочего процесса демонстрируется применение некоторых функций GitHub Actions для непрерывной интеграции. Когда этот рабочий процесс активируется, он проверяет код с помощью матрицы сочетаний тестов с npm test
.
На следующей схеме показано общее представление этапов рабочего процесса и их выполнение в задании:
Функции, используемые в этом примере
В примере рабочего процесса показаны следующие возможности GitHub Actions.
Компонент | Реализация |
---|---|
Запуск рабочего процесса вручную из пользовательского интерфейса | workflow_dispatch |
Активация рабочего процесса для автоматического запуска | pull_request |
Выполнение рабочего процесса через регулярные интервалы | schedule |
Настройка разрешений для маркера | permissions |
Управление числом запусков или заданий рабочего процесса в одно и то же время | concurrency |
Выполнение задания в разных запусках в зависимости от репозитория | runs-on |
Использование матрицы для создания различных конфигураций тестирования | matrix |
Кэширование зависимостей | actions/cache |
Выполнение тестов в средстве выполнения | npm test |
Пример рабочего процесса
Следующий рабочий процесс был создан командой разработчиков документации для GitHub. Рабочий процесс выполняет тесты по коду в запросе на вытягивание. Чтобы просмотреть последнюю версию этого файла в github/docs
репозитории, см. раздел .test.yml
# Это определяет имя рабочего процесса, как оно будет отображаться на вкладке "Действия" репозитория GitHub . name: Node.js Tests # The `on` keyword lets you define the events that trigger when the workflow is run. You can define multiple events here. For more information, see "[AUTOTITLE](/actions/using-workflows/triggering-a-workflow#using-events-to-trigger-workflows)." on: # Add the `workflow_dispatch` event if you want to be able to manually run this workflow. For more information, see [`workflow_dispatch`](/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch). workflow_dispatch: # Add the `pull_request` event, so that the workflow runs automatically every time a pull request is created or updated. For more information, see [`pull_request`](/actions/using-workflows/events-that-trigger-workflows#pull_request). pull_request: # Add the `push` event with the `branch` filter, so that the workflow runs automatically every time a commit is pushed to a branch called "main". For more information, see [`push`](/actions/using-workflows/events-that-trigger-workflows#push). push: branches: - main # This modifies the default permissions granted to `GITHUB_TOKEN`. This will vary depending on the needs of your workflow. For more information, see "[AUTOTITLE](/actions/using-jobs/assigning-permissions-to-jobs)." permissions: contents: read pull-requests: read # The `concurrency` key ensures that only a single workflow in the same concurrency group will run at the same time. For more information, see "[AUTOTITLE](/actions/using-jobs/using-concurrency)." # `concurrency.group` generates a concurrency group name from the workflow name and pull request information. The `||` operator is used to define fallback values. # `concurrency.cancel-in-progress` cancels any currently running job or workflow in the same concurrency group. concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true # This groups together all the jobs that run in the workflow file. jobs: # This defines a job with the ID `test` that is stored within the `jobs` key. test: # This configures the job to run on a GitHub-hosted runner or a self-hosted runner, depending on the repository running the workflow. # # In this example, the job will run on a self-hosted runner if the repository is named `docs-internal` and is within the `github` organization. If the repository doesn't match this path, then it will run on an `ubuntu-latest` runner hosted by GitHub. For more information on these options, see "[AUTOTITLE](/actions/using-jobs/choosing-the-runner-for-a-job)." runs-on: ${{ fromJSON('["ubuntu-latest", "self-hosted"]')[github.repository == 'github/docs-internal'] }} # This sets the maximum number of minutes to let the job run before it is automatically canceled. For more information, see [`timeout-minutes`](/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes). timeout-minutes: 60 # This section defines the build matrix for your jobs. strategy: # Setting `fail-fast` to `false` prevents GitHub from cancelling all in-progress jobs if any matrix job fails. fail-fast: false # This creates a matrix named `test-group`, with an array of test groups. These values match the names of test groups that will be run by `npm test`. matrix: test-group: [ content, graphql, meta, rendering, routing, unit, linting, translations, ] # This groups together all the steps that will run as part of the `test` job. Each job in a workflow has its own `steps` section. steps: # The `uses` keyword tells the job to retrieve the action named `actions/checkout`. This is an action that checks out your repository and downloads it to the runner, allowing you to run actions against your code (such as testing tools). You must use the checkout action any time your workflow will use your repository's code. Some extra options are provided to the action using the `with` key. - name: Check out repo uses: actions/checkout@v4 with: lfs: ${{ matrix.test-group == 'content' }} persist-credentials: 'false' # This step runs a command to check out large file storage (LFS) objects from the repository. - name: Checkout LFS objects run: git lfs checkout # This step uses the `trilom/file-changes-action` action to gather the files changed in the pull request, so they can be analyzed in the next step. This example is pinned to a specific version of the action, using the `a6ca26c14274c33b15e6499323aac178af06ad4b` SHA. - name: Gather files changed uses: trilom/file-changes-action@a6ca26c14274c33b15e6499323aac178af06ad4b id: get_diff_files with: output: ' ' # This step runs a shell command that uses an output from the previous step to create a file containing the list of files changed in the pull request. - name: Insight into changed files run: | echo "${{ steps.get_diff_files.outputs.files }}" > get_diff_files.txt # This step uses the `actions/setup-node` action to install the specified version of the `node` software package on the runner, which gives you access to the `npm` command. - name: Setup node uses: actions/setup-node@v4 with: node-version: 16.14.x cache: npm # This step runs the `npm ci` shell command to install the npm software packages for the project. - name: Install dependencies run: npm ci # This step uses the `actions/cache` action to cache the Next.js build, so that the workflow will attempt to retrieve a cache of the build, and not rebuild it from scratch every time. For more information, see "[AUTOTITLE](/actions/using-workflows/caching-dependencies-to-speed-up-workflows)." - name: Cache nextjs build uses: actions/cache@v3 with: path: .next/cache key: ${{ runner.os }}-nextjs-${{ hashFiles('package*.json') }} # This step runs the build script. - name: Run build script run: npm run build # This step runs the tests using `npm test`, and the test matrix provides a different value for `${{ matrix.test-group }}` for each job in the matrix. It uses the `DIFF_FILE` environment variable to know which files have changed, and uses the `CHANGELOG_CACHE_FILE_PATH` environment variable for the changelog cache file. - name: Run tests env: DIFF_FILE: get_diff_files.txt CHANGELOG_CACHE_FILE_PATH: src/fixtures/fixtures/changelog-feed.json run: npm test -- tests/${{ matrix.test-group }}/
name: Node.js Tests
Это определяет имя рабочего процесса, как оно будет отображаться на вкладке "Действия" репозитория GitHub .
on:
The on
keyword lets you define the events that trigger when the workflow is run. You can define multiple events here. For more information, see "Активация рабочего процесса."
workflow_dispatch:
Add the workflow_dispatch
event if you want to be able to manually run this workflow. For more information, see workflow_dispatch
.
pull_request:
Add the pull_request
event, so that the workflow runs automatically every time a pull request is created or updated. For more information, see pull_request
.
push:
branches:
- main
Add the push
event with the branch
filter, so that the workflow runs automatically every time a commit is pushed to a branch called "main". For more information, see push
.
permissions:
contents: read
pull-requests: read
This modifies the default permissions granted to GITHUB_TOKEN
. This will vary depending on the needs of your workflow. For more information, see "Назначение разрешений для заданий."
concurrency:
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
cancel-in-progress: true
The concurrency
key ensures that only a single workflow in the same concurrency group will run at the same time. For more information, see "Использование параллелизма."
concurrency.group
generates a concurrency group name from the workflow name and pull request information. The ||
operator is used to define fallback values.
concurrency.cancel-in-progress
cancels any currently running job or workflow in the same concurrency group.
jobs:
This groups together all the jobs that run in the workflow file.
test:
This defines a job with the ID test
that is stored within the jobs
key.
runs-on: ${{ fromJSON('["ubuntu-latest", "self-hosted"]')[github.repository == 'github/docs-internal'] }}
This configures the job to run on a GitHub-hosted runner or a self-hosted runner, depending on the repository running the workflow.
In this example, the job will run on a self-hosted runner if the repository is named docs-internal
and is within the github
organization. If the repository doesn't match this path, then it will run on an ubuntu-latest
runner hosted by GitHub. For more information on these options, see "Выбор средства выполнения тестов для задания."
timeout-minutes: 60
This sets the maximum number of minutes to let the job run before it is automatically canceled. For more information, see timeout-minutes
.
strategy:
This section defines the build matrix for your jobs.
fail-fast: false
Setting fail-fast
to false
prevents GitHub from cancelling all in-progress jobs if any matrix job fails.
matrix:
test-group:
[
content,
graphql,
meta,
rendering,
routing,
unit,
linting,
translations,
]
This creates a matrix named test-group
, with an array of test groups. These values match the names of test groups that will be run by npm test
.
steps:
This groups together all the steps that will run as part of the test
job. Each job in a workflow has its own steps
section.
- name: Check out repo
uses: actions/checkout@v4
with:
lfs: ${{ matrix.test-group == 'content' }}
persist-credentials: 'false'
The uses
keyword tells the job to retrieve the action named actions/checkout
. This is an action that checks out your repository and downloads it to the runner, allowing you to run actions against your code (such as testing tools). You must use the checkout action any time your workflow will use your repository's code. Some extra options are provided to the action using the with
key.
- name: Checkout LFS objects
run: git lfs checkout
This step runs a command to check out large file storage (LFS) objects from the repository.
- name: Gather files changed
uses: trilom/file-changes-action@a6ca26c14274c33b15e6499323aac178af06ad4b
id: get_diff_files
with:
output: ' '
This step uses the trilom/file-changes-action
action to gather the files changed in the pull request, so they can be analyzed in the next step. This example is pinned to a specific version of the action, using the a6ca26c14274c33b15e6499323aac178af06ad4b
SHA.
- name: Insight into changed files
run: |
echo "${{ steps.get_diff_files.outputs.files }}" > get_diff_files.txt
This step runs a shell command that uses an output from the previous step to create a file containing the list of files changed in the pull request.
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 16.14.x
cache: npm
This step uses the actions/setup-node
action to install the specified version of the node
software package on the runner, which gives you access to the npm
command.
- name: Install dependencies
run: npm ci
This step runs the npm ci
shell command to install the npm software packages for the project.
- name: Cache nextjs build
uses: actions/cache@v3
with:
path: .next/cache
key: ${{ runner.os }}-nextjs-${{ hashFiles('package*.json') }}
This step uses the actions/cache
action to cache the Next.js build, so that the workflow will attempt to retrieve a cache of the build, and not rebuild it from scratch every time. For more information, see "Кэширование зависимостей для ускорения рабочих процессов."
- name: Run build script
run: npm run build
This step runs the build script.
- name: Run tests
env:
DIFF_FILE: get_diff_files.txt
CHANGELOG_CACHE_FILE_PATH: src/fixtures/fixtures/changelog-feed.json
run: npm test -- tests/${{ matrix.test-group }}/
This step runs the tests using npm test
, and the test matrix provides a different value for ${{ matrix.test-group }}
for each job in the matrix. It uses the DIFF_FILE
environment variable to know which files have changed, and uses the CHANGELOG_CACHE_FILE_PATH
environment variable for the changelog cache file.
# Это определяет имя рабочего процесса, как оно будет отображаться на вкладке "Действия" репозитория GitHub .
name: Node.js Tests
# The `on` keyword lets you define the events that trigger when the workflow is run. You can define multiple events here. For more information, see "[AUTOTITLE](/actions/using-workflows/triggering-a-workflow#using-events-to-trigger-workflows)."
on:
# Add the `workflow_dispatch` event if you want to be able to manually run this workflow. For more information, see [`workflow_dispatch`](/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch).
workflow_dispatch:
# Add the `pull_request` event, so that the workflow runs automatically every time a pull request is created or updated. For more information, see [`pull_request`](/actions/using-workflows/events-that-trigger-workflows#pull_request).
pull_request:
# Add the `push` event with the `branch` filter, so that the workflow runs automatically every time a commit is pushed to a branch called "main". For more information, see [`push`](/actions/using-workflows/events-that-trigger-workflows#push).
push:
branches:
- main
# This modifies the default permissions granted to `GITHUB_TOKEN`. This will vary depending on the needs of your workflow. For more information, see "[AUTOTITLE](/actions/using-jobs/assigning-permissions-to-jobs)."
permissions:
contents: read
pull-requests: read
# The `concurrency` key ensures that only a single workflow in the same concurrency group will run at the same time. For more information, see "[AUTOTITLE](/actions/using-jobs/using-concurrency)."
# `concurrency.group` generates a concurrency group name from the workflow name and pull request information. The `||` operator is used to define fallback values.
# `concurrency.cancel-in-progress` cancels any currently running job or workflow in the same concurrency group.
concurrency:
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
cancel-in-progress: true
# This groups together all the jobs that run in the workflow file.
jobs:
# This defines a job with the ID `test` that is stored within the `jobs` key.
test:
# This configures the job to run on a GitHub-hosted runner or a self-hosted runner, depending on the repository running the workflow.
#
# In this example, the job will run on a self-hosted runner if the repository is named `docs-internal` and is within the `github` organization. If the repository doesn't match this path, then it will run on an `ubuntu-latest` runner hosted by GitHub. For more information on these options, see "[AUTOTITLE](/actions/using-jobs/choosing-the-runner-for-a-job)."
runs-on: ${{ fromJSON('["ubuntu-latest", "self-hosted"]')[github.repository == 'github/docs-internal'] }}
# This sets the maximum number of minutes to let the job run before it is automatically canceled. For more information, see [`timeout-minutes`](/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes).
timeout-minutes: 60
# This section defines the build matrix for your jobs.
strategy:
# Setting `fail-fast` to `false` prevents GitHub from cancelling all in-progress jobs if any matrix job fails.
fail-fast: false
# This creates a matrix named `test-group`, with an array of test groups. These values match the names of test groups that will be run by `npm test`.
matrix:
test-group:
[
content,
graphql,
meta,
rendering,
routing,
unit,
linting,
translations,
]
# This groups together all the steps that will run as part of the `test` job. Each job in a workflow has its own `steps` section.
steps:
# The `uses` keyword tells the job to retrieve the action named `actions/checkout`. This is an action that checks out your repository and downloads it to the runner, allowing you to run actions against your code (such as testing tools). You must use the checkout action any time your workflow will use your repository's code. Some extra options are provided to the action using the `with` key.
- name: Check out repo
uses: actions/checkout@v4
with:
lfs: ${{ matrix.test-group == 'content' }}
persist-credentials: 'false'
# This step runs a command to check out large file storage (LFS) objects from the repository.
- name: Checkout LFS objects
run: git lfs checkout
# This step uses the `trilom/file-changes-action` action to gather the files changed in the pull request, so they can be analyzed in the next step. This example is pinned to a specific version of the action, using the `a6ca26c14274c33b15e6499323aac178af06ad4b` SHA.
- name: Gather files changed
uses: trilom/file-changes-action@a6ca26c14274c33b15e6499323aac178af06ad4b
id: get_diff_files
with:
output: ' '
# This step runs a shell command that uses an output from the previous step to create a file containing the list of files changed in the pull request.
- name: Insight into changed files
run: |
echo "${{ steps.get_diff_files.outputs.files }}" > get_diff_files.txt
# This step uses the `actions/setup-node` action to install the specified version of the `node` software package on the runner, which gives you access to the `npm` command.
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 16.14.x
cache: npm
# This step runs the `npm ci` shell command to install the npm software packages for the project.
- name: Install dependencies
run: npm ci
# This step uses the `actions/cache` action to cache the Next.js build, so that the workflow will attempt to retrieve a cache of the build, and not rebuild it from scratch every time. For more information, see "[AUTOTITLE](/actions/using-workflows/caching-dependencies-to-speed-up-workflows)."
- name: Cache nextjs build
uses: actions/cache@v3
with:
path: .next/cache
key: ${{ runner.os }}-nextjs-${{ hashFiles('package*.json') }}
# This step runs the build script.
- name: Run build script
run: npm run build
# This step runs the tests using `npm test`, and the test matrix provides a different value for `${{ matrix.test-group }}` for each job in the matrix. It uses the `DIFF_FILE` environment variable to know which files have changed, and uses the `CHANGELOG_CACHE_FILE_PATH` environment variable for the changelog cache file.
- name: Run tests
env:
DIFF_FILE: get_diff_files.txt
CHANGELOG_CACHE_FILE_PATH: src/fixtures/fixtures/changelog-feed.json
run: npm test -- tests/${{ matrix.test-group }}/
Следующие шаги
- Дополнительные сведения о концепциях GitHub Actions см. в разделе "Общие сведения о GitHub Actions".
- Дополнительные пошаговые инструкции по созданию базового рабочего процесса см. в разделе "Краткое руководство по GitHub Actions".
- Если вы знакомы с основами GitHub Actions, вы можете узнать о рабочих процессах и их функциях в autoTITLE.