Перейти к содержимому

2. GitHub Actions: основы

Иллюстрация к уроку

GitHub Actions — встроенная платформа CI/CD в GitHub. Автоматизируй тесты, деплой и всё что хочешь при push, PR или по расписанию.

GitHub repo
├── .github/
│ └── workflows/
│ ├── ci.yml ← workflow файл
│ └── deploy.yml
└── ... твой код

При событии (push, PR и т.д.) GitHub запускает runners — виртуальные машины, которые выполняют твои команды.

.github/workflows/ci.yml
name: CI Pipeline
on: # когда запускать
push:
branches: [main]
pull_request:
branches: [main]
jobs: # что делать
test:
runs-on: ubuntu-latest # на какой ОС
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
on:
push: # при пуше
branches: [main, develop]
pull_request: # при PR
branches: [main]
schedule: # по расписанию (cron)
- cron: '0 9 * * 1-5' # каждый рабочий день в 9:00
workflow_dispatch: # ручной запуск
release: # при создании релиза
types: [published]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run lint
test:
runs-on: ubuntu-latest
needs: lint # запускается ПОСЛЕ lint
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
deploy:
runs-on: ubuntu-latest
needs: [lint, test] # ждёт обоих
if: github.ref == 'refs/heads/main'
steps:
- run: echo "Deploying!"
# Checkout репозиторий
- uses: actions/checkout@v4
# Setup Node.js
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
# Setup Python
- uses: actions/setup-python@v5
with:
python-version: '3.12'
# Кэширование
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
# Upload артефакты
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
# Download артефакты
- uses: actions/download-artifact@v4
with:
name: build-output
.github/workflows/ci.yml
name: Node.js CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
name: Test on Node ${{ matrix.node-version }}
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x, 22.x]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install deps
run: npm ci
- name: Lint
run: npm run lint
- name: Test
run: npm test -- --coverage
- name: Upload coverage
uses: actions/upload-artifact@v4
with:
name: coverage-${{ matrix.node-version }}
path: coverage/
steps:
- name: Show context info
run: |
echo "Repo: ${{ github.repository }}"
echo "Branch: ${{ github.ref_name }}"
echo "Commit: ${{ github.sha }}"
echo "Actor: ${{ github.actor }}"
echo "Event: ${{ github.event_name }}"
echo "Runner OS: ${{ runner.os }}"
steps:
- name: Deploy to production
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: npm run deploy:prod
- name: Deploy to staging
if: github.ref == 'refs/heads/develop'
run: npm run deploy:staging
- name: Notify on failure
if: failure()
run: curl -X POST ${{ secrets.SLACK_WEBHOOK }} -d '{"text":"Build failed!"}'
steps:
- name: Deploy with secrets
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
run: npm run deploy

Secrets добавляются в: Settings → Secrets and variables → Actions

.github/workflows/deploy.yml
name: Deploy to Production
on:
push:
branches: [main]
jobs:
ci:
name: CI Checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm run build
- name: Save build
uses: actions/upload-artifact@v4
with:
name: build
path: .next/
deploy:
name: Deploy
runs-on: ubuntu-latest
needs: ci
environment: production # требует апрув в Settings
steps:
- uses: actions/checkout@v4
- name: Download build
uses: actions/download-artifact@v4
with:
name: build
path: .next/
- name: Deploy to Vercel
uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args: '--prod'
Public repos: Unlimited
Private repos: 2,000 минут/месяц (бесплатный план)
50,000 минут/месяц (Pro)
Runners:
ubuntu-latest — 1x множитель
windows-latest — 2x множитель
macos-latest — 10x множитель
  • Workflows хранятся в .github/workflows/*.yml
  • on: определяет триггеры запуска
  • jobs: содержат steps: с командами
  • needs: задаёт зависимости между jobs
  • Secrets хранятся в настройках репозитория
  • uses: подключает готовые actions из маркетплейса
  • if: позволяет условно выполнять шаги
  • Matrix strategy запускает job для разных конфигураций

Визуальный конструктор GitHub Actions workflow: