GitHub Actions: От простых примеров workflow до автоматизации CI/CD

GitHub Actions: От простых примеров workflow до автоматизации CI/CD

GitHub Actions — это мощный инструмент для автоматизации рабочих процессов прямо в вашем репозитории. Вместо ручного запуска тестов, сборки или деплоя, вы описываете workflow в YAML-файле, и GitHub делает всё за вас. Это как личный робот-помощник для разработчика, который работает по вашему расписанию или событию. Давайте разберемся, как это работает на практике, с конкретными примерами.

Что такое workflow и как его создать?

Workflow (рабочий процесс) — это автоматизированный процесс, который вы описываете в файле .github/workflows/имя_файла.yml. Он состоит из одного или нескольких заданий (jobs), которые, в свою очередь, содержат шаги (steps). Workflow может запускаться по событию (push, pull request), по расписанию (cron) или вручную.

Каждый workflow файл должен содержать как минимум три ключевых элемента: name (название), on (триггеры запуска) и jobs (задания).

Практические примеры workflow

Пример 1: Запуск тестов при каждом push

Самый распространенный сценарий — автоматический запуск тестового набора для проверки кода. Вот базовый пример для Node.js проекта:

name: Node.js CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm ci
      - run: npm test

Этот workflow будет запускаться при каждом push в любую ветку и при создании pull request. Он проверяет код, устанавливает Node.js, зависимости и запускает тесты.

Пример 2: Сборка и публикация Docker-образа

Автоматизируем сборку Docker-образа и его публикацию в GitHub Container Registry при теге (релизе):

name: Build and Push Docker Image

on:
  push:
    tags:
      - 'v*'

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v3
      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:latest

Секреты (secrets) — ключевой элемент безопасности. Никогда не храните пароли, токены или ключи прямо в коде workflow. Используйте настройки Secrets в репозитории.

Пример 3: Автоматический деплой на сервер

Допустим, у вас есть статический сайт, и вы хотите автоматически развертывать его на свой сервер по SSH после успешной сборки:

name: Deploy to Server

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build project
        run: |
          npm ci
          npm run build
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /var/www/my-site
            git pull origin main
            npm ci --production
            pm2 restart my-app

Продвинутые возможности

  • Матрицы сборок (matrix): Запуск workflow на нескольких версиях ОС, языка или конфигурации одновременно.
  • Кеширование зависимостей: Ускорение workflow за счет кеширования (например, actions/cache для npm или pip).
  • Артефакты: Сохранение результатов сборки (бинарные файлы, логи) для последующего скачивания.
  • Зависимости между заданиями (needs): Определение порядка выполнения jobs.
  • Ручной запуск (workflow_dispatch): Возможность запустить workflow вручную через интерфейс GitHub с вводом параметров.

Лучшие практики

  1. Начинайте с простых workflow и постепенно усложняйте.
  2. Используйте официальные и проверенные actions из Marketplace.
  3. Всегда ограничивайте триггеры (on), чтобы workflow не запускался без необходимости.
  4. Разделяйте сложные workflow на несколько заданий для лучшей читаемости и параллельного выполнения.
  5. Используйте if условия для контроля выполнения шагов.

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

Сколько стоит GitHub Actions?

Для публичных репозиториев и приватных репозиториев на бесплатном тарифе GitHub предоставляет 2000 минут выполнения в месяц (на Linux). Для приватных репозиториев на Pro и Team тарифах — 3000 минут.

Где хранятся секреты (secrets) и как их добавить?

Секреты хранятся в зашифрованном виде в настройках вашего репозитория или организации (Settings -> Secrets and variables -> Actions). Добавить их можно только через веб-интерфейс, они недоступны для чтения после сохранения.

Можно ли запускать workflow по расписанию?

Да, используя синтаксис cron в триггере schedule. Например: on: schedule: - cron: '0 2 * * *' (запуск каждый день в 2:00 UTC).

Как отладить упавший workflow?

Вся детальная информация о выполнении каждого шага доступна в логах на вкладке Actions вашего репозитория. Можно также использовать действие actions/toolkit для логирования.

Можно ли использовать self-hosted runners (свои серверы)?

Да, вы можете настроить свои собственные машины (runner) для выполнения workflow. Это полезно для специфического оборудования или требований безопасности.