2. GitHub Actions: основы

GitHub Actions — встроенная платформа CI/CD в GitHub. Автоматизируй тесты, деплой и всё что хочешь при push, PR или по расписанию.
Как это работает
Заголовок раздела «Как это работает»GitHub repo │ ├── .github/ │ └── workflows/ │ ├── ci.yml ← workflow файл │ └── deploy.yml │ └── ... твой кодПри событии (push, PR и т.д.) GitHub запускает runners — виртуальные машины, которые выполняют твои команды.
Базовая структура workflow
Заголовок раздела «Базовая структура workflow»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Ключевые концепции
Заголовок раздела «Ключевые концепции»Triggers (on:)
Заголовок раздела «Triggers (on:)»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 и Steps
Заголовок раздела «Jobs и Steps»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!"Популярные actions
Заголовок раздела «Популярные actions»# 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Практика: CI для Node.js приложения
Заголовок раздела «Практика: CI для Node.js приложения»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!"}'Работа с secrets
Заголовок раздела «Работа с secrets»steps: - name: Deploy with secrets env: DATABASE_URL: ${{ secrets.DATABASE_URL }} API_KEY: ${{ secrets.API_KEY }} run: npm run deploySecrets добавляются в: Settings → Secrets and variables → Actions
Практика: Полный CI/CD workflow
Заголовок раздела «Практика: Полный CI/CD workflow»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'Бесплатные лимиты GitHub Actions
Заголовок раздела «Бесплатные лимиты GitHub Actions»Public repos: UnlimitedPrivate 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: