Настройка автоматических запусков, cron, webhook-триггеры, manual jobs.
Автоматизация CI/CD требует понимания всех способов запуска пайплайнов. Изучите триггеры, расписания, manual jobs и webhook-интеграции.
GitHub Actions поддерживает множество триггеров для автоматизации:
on:
push: # Push в репозиторий
pull_request: # Pull request события
schedule: # По расписанию (cron)
workflow_dispatch: # Ручной запуск
repository_dispatch # Внешние события
issue_comment: # Комментарии к issues
release: # Релизы
workflow_run: # Завершение другого workflowon:
push:
branches:
- main
- 'release/*' # Все ветки release/*
- 'feature/**' # Все ветки feature/**/**
tags:
- 'v*' # Все теги, начинающиеся с v
paths:
- 'src/**' # Только изменения в src/
- '!**.md' # Игнорировать .md файлыПримеры фильтров:
# Только определённые ветки
on:
push:
branches: [main, develop]
# Все ветки кроме main
on:
push:
branches-ignore: [main]
# Только теги
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
# Только изменения в определённых путях
on:
push:
paths:
- 'frontend/**'
- '.github/workflows/frontend.yml'on:
pull_request:
branches:
- main
types:
- opened
- synchronize
- reopened
paths:
- 'src/**'Типы PR событий:
opened — PR созданsynchronize — новые коммиты в PRreopened — PR reopenedclosed — PR закрытmerged — PR замерженlabeled — добавлен лейблunlabeled — удалён лейблreview_requested — запрошен reviewon:
schedule:
# Каждый день в 00:00 UTC
- cron: '0 0 * * *'
# Каждые 15 минут
- cron: '*/15 * * * *'
# Каждый понедельник в 09:00 UTC
- cron: '0 9 * * 1'
# В первый день каждого месяца в 06:00 UTC
- cron: '0 6 1 * *'Cron-синтаксис:
┌───────────── минута (0-59)
│ ┌───────────── час (0-23)
│ │ ┌───────────── день месяца (1-31)
│ │ │ ┌───────────── месяц (1-12)
│ │ │ │ ┌───────────── день недели (0-6, 0=Sunday)
│ │ │ │ │
* * * * *
Примеры cron:
| Выражение | Описание |
|---|---|
0 * * * * | Каждый час |
0 0 * * * | Каждый день в полночь |
0 0 * * 0 | Каждое воскресенье в полночь |
0 0 1 * * | Первое число каждого месяца |
*/10 * * * * | Каждые 10 минут |
0 9-17 * * 1-5 | Каждый час с 9 до 17 по будням |
Важно: Schedule работает только для default branch (обычно main).
name: Manual Deploy
on:
workflow_dispatch:
inputs:
environment:
description: 'Окружение для деплоя'
required: true
default: 'staging'
type: choice
options:
- staging
- production
version:
description: 'Версия для деплоя'
required: false
type: string
debug:
description: 'Включить debug режим'
required: false
default: 'false'
type: boolean
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy
run: |
echo "Environment: ${{ inputs.environment }}"
echo "Version: ${{ inputs.version }}"
echo "Debug: ${{ inputs.debug }}"
env:
DEPLOY_ENV: ${{ inputs.environment }}Использование:
name: External Trigger
on:
repository_dispatch:
types:
- deploy-request
- test-request
jobs:
deploy:
runs-on: ubuntu-latest
if: github.event.action == 'deploy-request'
steps:
- name: Deploy
run: |
echo "Deploying ${{ github.event.client_payload.version }}"
echo "Environment: ${{ github.event.client_payload.environment }}"Отправка события через API:
curl -X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/owner/repo/dispatches \
-d '{"event_type":"deploy-request","client_payload":{"version":"1.0.0","environment":"staging"}}'on:
release:
types:
- published
- prereleased
- released
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Get release info
run: |
echo "Release: ${{ github.event.release.tag_name }}"
echo "Name: ${{ github.event.release.name }}"
echo "Draft: ${{ github.event.release.draft }}"
echo "Prerelease: ${{ github.event.release.prerelease }}"# Запуск после завершения другого workflow
on:
workflow_run:
workflows:
- "Build Pipeline"
types:
- completed
branches:
- main
jobs:
notify:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- name: Send notification
run: echo "Build succeeded!"GitLab CI использует rules и only/except для управления выполнением:
job:
rules:
- if: $CI_PIPELINE_SOURCE == "push"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_PIPELINE_SOURCE == "api"
- if: $CI_PIPELINE_SOURCE == "trigger"test:
script:
- npm test
rules:
- if: $CI_PIPELINE_SOURCE == "push"
# Или по ветке
- if: $CI_COMMIT_BRANCHtest:
script:
- npm test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"deploy:
script:
- ./deploy.sh
rules:
- if: $CI_COMMIT_TAG
# Или конкретный паттерн
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/В GitLab расписания настраиваются через UI, не в .gitlab-ci.yml:
Настройка в UI:
Cron выражения:
| Выражение | Описание |
|---|---|
0 * * * * | Каждый час |
0 0 * * * | Каждый день в полночь |
0 9 * * 1-5 | В 09:00 по будням |
0 0 1 * * | Первое число месяца |
Использование переменных из schedule:
deploy:
script:
- ./deploy.sh $DEPLOY_ENVIRONMENT
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"deploy-staging:
script:
- ./deploy.sh staging
rules:
- if: $CI_PIPELINE_SOURCE == "web"
when: on_success
deploy-production:
script:
- ./deploy.sh production
rules:
- if: $CI_PIPELINE_SOURCE == "web"
when: manualСоздание trigger token:
Запуск через API:
# Для ветки
curl -X POST \
--form token=TRIGGER_TOKEN \
--form ref=main \
https://gitlab.com/api/v4/projects/PROJECT_ID/trigger/pipeline
# С переменными
curl -X POST \
--form token=TRIGGER_TOKEN \
--form ref=main \
--form "variables[ENVIRONMENT]=production" \
--form "variables[VERSION]=1.0.0" \
https://gitlab.com/api/v4/projects/PROJECT_ID/trigger/pipelineИспользование в .gitlab-ci.yml:
deploy:
script:
- ./deploy.sh
rules:
- if: $CI_PIPELINE_SOURCE == "trigger"GitHub отправляет webhook события на указанный URL при различных событиях.
Настройка:
Пример обработки webhook:
name: Webhook Handler
on:
repository_dispatch:
types: [webhook-event]
jobs:
process:
runs-on: ubuntu-latest
steps:
- name: Process webhook
run: |
echo "Action: ${{ github.event.action }}"
echo "Payload: ${{ toJSON(github.event.client_payload) }}"GitLab webhooks используются для уведомления, не для запуска pipeline.
Настройка:
События:
name: Full CI/CD
on:
# Push на основные ветки
push:
branches:
- main
- develop
tags:
- 'v*'
# Pull requests
pull_request:
branches:
- main
# Ежедневный nightly build
schedule:
- cron: '0 2 * * *'
# Ручной запуск
workflow_dispatch:
inputs:
environment:
description: 'Окружение'
required: true
default: 'staging'
type: choice
options:
- staging
- production
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test
deploy:
runs-on: ubuntu-latest
needs: test
# Разные условия для разных триггеров
if: |
github.event_name == 'push' && github.ref == 'refs/heads/main' ||
github.event_name == 'workflow_dispatch' && inputs.environment == 'production' ||
github.event_name == 'release'
steps:
- uses: actions/checkout@v4
- run: ./deploy.shstages:
- test
- deploy
test:
stage: test
script:
- npm test
rules:
# MR - всегда тестировать
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# Push на ветки - тестировать
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH
# Tags - тестировать
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG
# Schedule - тестировать
- if: $CI_PIPELINE_SOURCE == "schedule"
deploy-staging:
stage: deploy
script:
- ./deploy.sh staging
environment:
name: staging
rules:
# Develop branch - автодеплой
- if: $CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "push"
# Manual запуск
- if: $CI_PIPELINE_SOURCE == "web"
when: manual
deploy-production:
stage: deploy
script:
- ./deploy.sh production
environment:
name: production
rules:
# Tags - manual деплой
- if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/
when: manualname: Nightly Build
on:
schedule:
- cron: '0 2 * * *' # Каждый день в 02:00 UTC
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm run build
notify:
runs-on: ubuntu-latest
needs: build
if: always()
steps:
- name: Send Slack notification
run: |
if [ "${{ needs.build.result }}" == "success" ]; then
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Nightly build succeeded!"}' \
${{ secrets.SLACK_WEBHOOK }}
else
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Nightly build failed!"}' \
${{ secrets.SLACK_WEBHOOK }}
fi# Настроить schedule в UI с переменной REPORT_TYPE=weekly
stages:
- generate
generate-report:
stage: generate
script:
- ./generate-report.sh $REPORT_TYPE
artifacts:
paths:
- reports/
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"rules с $CI_PIPELINE_SOURCEif в GitHub, rules в GitLabВопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.