
GitHub Actions: CI/CD
Что такое GitHub Actions
GitHub Actions – это сервис CI/CD, встроенный в GitHub, который позволяет автоматизировать сборку, тестирование и развертывание вашего кода. Он использует файлы workflow, описанные в YAML, которые размещаются в репозитории в каталоге .github/workflows.
Структура workflow
Каждый workflow состоит из:
name
– имя workflowon
– события, которые запускают workflow (push, pull_request, schedule и т.д.)jobs
– набор задач, которые выполняются параллельно или последовательноsteps
– отдельные шаги внутри задачи, каждый из которых может быть скриптом, установкой зависимостей или использованием готового action
Пример CI workflow
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
Пример CD workflow
name: CD
on:
push:
tags:
- 'v*.*.*'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Deploy to server
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci
pm2 restart myapp
Советы по работе с GitHub Actions
- Разделяйте CI и CD – храните их в отдельных файлах workflow, чтобы легче управлять правами доступа.
- Используйте кэш – добавьте
actions/cache@v3
для ускорения сборки. - Секреты – храните ключи и токены в разделе Settings → Secrets → Actions.
- Тестируйте локально – можно использовать
act
для запуска workflow на локальной машине. - Проверяйте лимиты – бесплатные минуты CI/CD ограничены, планируйте ресурсы.
Дополнительные возможности GitHub Actions
1. Reusable workflows
Reusable workflows позволяют вынести общие шаги в отдельный файл и вызывать его из разных репозиториев, что повышает переиспользуемость и упрощает поддержку.
# .github/workflows/reusable-build.yml
name: Reusable Build
on:
workflow_call:
inputs:
node-version:
required: true
type: string
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ inputs.node-version }}
- run: npm ci
- run: npm test
В другом workflow:
jobs:
test:
uses: ./.github/workflows/reusable-build.yml
with:
node-version: '20'
2. Matrix strategy
Matrix strategy позволяет запускать одни и те же задачи с разными параметрами, например, тестировать приложение на нескольких версиях Node.js одновременно.
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14, 16, 18]
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
3. Caching
Caching сохраняет зависимости и артефакты между запусками, уменьшая время сборки и экономя ресурсы.
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
4. Artifacts
Artifacts позволяют сохранять файлы, созданные во время выполнения workflow, чтобы использовать их в последующих шагах или скачивать вручную.
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: build
path: dist/
5. Concurrency
Concurrency управляет одновременным выполнением workflow, предотвращая конфликтные запуски и позволяя отменять старые задачи.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
6. Environments
Environments предоставляют безопасные зоны развертывания с возможностью проверки и утверждения перед публикацией.
environment:
name: production
url: https://example.com
reviewers:
- octocat
Мониторинг и отладка
- Используйте
actions/checkout@v3
сfetch-depth: 0
для доступа к истории. - Добавьте
actions/debugger@v1
для интерактивного отладки. - Включите
workflow_run
для запуска дополнительных проверок после завершения.
Заключение
GitHub Actions предоставляет богатый набор возможностей, позволяющих автоматизировать практически любой процесс разработки. Понимание и правильное применение этих функций поможет вам создавать надёжные и масштабируемые пайплайны.