Настройка CI/CD для сайта через GitHub Actions
GitHub Actions встроен прямо в репозиторий — никаких внешних серверов, никаких отдельных аккаунтов. Воркфлоу описываются в YAML и хранятся в .github/workflows/. Для большинства веб-проектов этого достаточно, чтобы закрыть полный цикл: тесты, сборка, деплой.
Структура воркфлоу
Минимальный воркфлоу для сайта на Node.js с деплоем на сервер по SSH:
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm test
build:
needs: test
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
deploy:
needs: build
runs-on: ubuntu-22.04
environment: production
steps:
- uses: actions/download-artifact@v4
with:
name: dist
path: dist/
- name: Deploy via rsync
uses: burnett01/[email protected]
with:
switches: -avzr --delete
path: dist/
remote_path: /var/www/mysite
remote_host: ${{ secrets.DEPLOY_HOST }}
remote_user: deploy
remote_key: ${{ secrets.DEPLOY_KEY }}
Три джоба: тест → сборка → деплой. Если тесты упали — сборка не запустится. Если сборка не артефактирована — деплоить нечего.
Управление секретами
Все чувствительные данные — в Settings → Secrets and variables → Actions. Никакие ключи, пароли, токены не попадают в код.
# Использование секретов
- name: Configure .env
run: |
echo "DATABASE_URL=${{ secrets.DATABASE_URL }}" >> .env
echo "APP_KEY=${{ secrets.APP_KEY }}" >> .env
Для разграничения prod/staging используют Environments (Settings → Environments). Каждое окружение — свой набор секретов и опциональное требование ручного одобрения деплоя:
deploy:
environment:
name: production
url: https://mysite.com
Матричные сборки и кеширование
Если нужно тестировать под несколькими версиями Node.js:
strategy:
matrix:
node-version: [18, 20, 22]
Кеш зависимостей существенно ускоряет прогоны. actions/setup-node с параметром cache: 'npm' кеширует ~/.npm автоматически. Для composer, pip, cargo — аналогичные экшены или actions/cache напрямую:
- uses: actions/cache@v4
with:
path: vendor
key: composer-${{ hashFiles('composer.lock') }}
Типичное время прогона после прогрева кеша: 60–90 секунд против 3–5 минут с нуля.
PHP/Laravel проект
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: pdo_pgsql, redis, opcache
coverage: none
- run: composer install --no-dev --optimize-autoloader
- run: php artisan config:cache
- run: php artisan route:cache
- run: php artisan view:cache
Docker-сборка и пуш в Registry
Если деплой идёт через контейнеры:
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
GitHub Container Registry (ghcr.io) доступен бесплатно, авторизация через GITHUB_TOKEN — встроенный токен, не нужно создавать отдельно.
Деплой на разные платформы
| Платформа | Экшен / метод |
|---|---|
| VPS по SSH | appleboy/ssh-action или rsync |
| AWS S3 + CloudFront | aws-actions/configure-aws-credentials |
| Vercel | amondnet/vercel-action |
| Kubernetes | azure/k8s-deploy или kubectl напрямую |
| Docker Swarm | SSH + docker stack deploy |
Уведомления
- name: Notify Telegram on failure
if: failure()
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_CHAT_ID }}
token: ${{ secrets.TELEGRAM_TOKEN }}
message: "❌ Deploy failed: ${{ github.repository }} @ ${{ github.sha }}"
if: failure() — условие запускается только при сбое. if: always() — всегда, независимо от результата.
Ограничения бесплатного плана
Публичные репозитории — бесплатно без ограничений. Приватные: 2 000 минут/месяц на бесплатном плане, 3 000 на Pro. Один прогон занимает 2–5 минут — хватает на 400–1 000 деплоев в месяц. При превышении можно подключить self-hosted runner на своём сервере.
Сроки настройки
Базовый воркфлоу (тест + деплой по SSH) — 1–2 дня: написание YAML, настройка секретов, отладка первых прогонов. Полный pipeline с матрицей окружений, Docker, уведомлениями, ручными одобрениями — 3–5 дней.







