Skip to content

Как настроить CI/CD в GitHub Actions

Коротко:

GitHub Actions — встроенный CI/CD в GitHub (free 2000 min/мес для private repos, unlimited для public). Workflow = YAML файл в .github/workflows/. Triggers: push, pull_request, schedule (cron), manual. Runners: ubuntu-latest, macos-latest, windows-latest. Deploy через SSH + rsync, docker push, Vercel/Netlify integrations. Secrets хранятся в repo settings.

Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.

Пошаговая настройка

  1. Создайте .github/workflows/ci.yml
  2. Определите trigger: on: push: branches: [main]
  3. Define jobs с runs-on + steps (checkout, setup-node, npm install, test)
  4. Для deploy: secrets (SSH_KEY, DEPLOY_HOST) в repo Settings → Secrets
  5. Deploy step: appleboy/ssh-action или rsync + SSH
  6. Commit + push — workflow запускается автоматически
  7. Results: Actions tab в GitHub, logs per step, artifacts

Рабочие примеры

СценарийКонфиг
Simple Node.js CIname: CI on: push: { branches: [main] } pull_request: jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: '20' } - run: npm ci - run: npm test
Deploy via SSHdeploy: needs: test runs-on: ubuntu-latest steps: - uses: appleboy/ssh-action@v1 with: host: ${{ secrets.DEPLOY_HOST }} username: deploy key: ${{ secrets.SSH_PRIVATE_KEY }} script: cd /var/www && git pull && npm install --production && pm2 reload all
Matrix build (multi Node version)strategy: matrix: node: [18, 20, 22] steps: - uses: actions/setup-node@v4 with: { node-version: ${{ matrix.node }} }
Docker build + push- uses: docker/build-push-action@v5 with: push: true tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
Scheduled workflow (cron)on: schedule: - cron: '0 2 * * *' # daily at 2 AM UTC

Типичные ошибки

  • Secrets printed in logs — используйте ::add-mask:: или sensitive steps с if: env check
  • Free tier — 2000 min для private repos. Build 10 min × 200 runs = limit
  • Cache важно: actions/cache@v4 с proper key — иначе npm install каждый раз 1 мин
  • Ubuntu runners обновляются — test на конкретной version (ubuntu-22.04, not ubuntu-latest для prod)
  • Deploy step запускается на каждый push — add if: github.ref == 'refs/heads/main'

Больше по теме

Часто задаваемые вопросы

Free tier достаточно?

Для solo проекта — да. Team 5+ — иногда нужен Teams $4/user/мес или self-hosted runners.

Self-hosted runners — зачем?

Для private network access, unlimited minutes, GPU/ARM runners. Downside — maintenance + security (compromised runner = RCE в GitHub workflow).

Secrets vs env vars?

Secrets — encrypted, not visible в logs. Env vars — plain, visible. Для tokens/passwords — всегда secrets.

GitHub Actions vs Jenkins/GitLab CI?

GitHub Actions: free для GH repos, огромная marketplace actions, YAML. Jenkins: self-host, flexible но maintenance. GitLab CI: tight GitLab integration. Для GitHub — Actions default.