Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Триггеры, расписания, webhooks
triggers_schedules

Триггеры, расписания, webhooks

Настройка автоматических запусков, cron, webhook-триггеры, manual jobs.

Триггеры, расписания, webhooks

Автоматизация CI/CD требует понимания всех способов запуска пайплайнов. Изучите триггеры, расписания, manual jobs и webhook-интеграции.

#GitHub Actions: Триггеры

#Обзор триггеров

GitHub Actions поддерживает множество триггеров для автоматизации:

on: push: # Push в репозиторий pull_request: # Pull request события schedule: # По расписанию (cron) workflow_dispatch: # Ручной запуск repository_dispatch # Внешние события issue_comment: # Комментарии к issues release: # Релизы workflow_run: # Завершение другого workflow

#Push триггер

on: 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'

#Pull Request триггер

on: pull_request: branches: - main types: - opened - synchronize - reopened paths: - 'src/**'

Типы PR событий:

  • opened — PR создан
  • synchronize — новые коммиты в PR
  • reopened — PR reopened
  • closed — PR закрыт
  • merged — PR замержен
  • labeled — добавлен лейбл
  • unlabeled — удалён лейбл
  • review_requested — запрошен review

#Schedule (Cron)

on: 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).

#Workflow Dispatch (ручной запуск)

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 }}

Использование:

  1. Перейти в Actions tab
  2. Выбрать workflow
  3. Нажать "Run workflow"
  4. Выбрать значения inputs
  5. Запустить

#Repository Dispatch (внешние события)

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"}}'

#Release триггер

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 Run триггер

# Запуск после завершения другого 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: Триггеры

#Обзор триггеров в GitLab

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"

#Push события

test: script: - npm test rules: - if: $CI_PIPELINE_SOURCE == "push" # Или по ветке - if: $CI_COMMIT_BRANCH

#Merge Request события

test: script: - npm test rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event"

#Tag события

deploy: script: - ./deploy.sh rules: - if: $CI_COMMIT_TAG # Или конкретный паттерн - if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/

#Pipeline Schedules (расписания)

В GitLab расписания настраиваются через UI, не в .gitlab-ci.yml:

Настройка в UI:

  1. CI/CD → Schedules
  2. New schedule
  3. Указать:
    • Description
    • Cron выражение
    • Target branch
    • Variables (опционально)

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"

#Web и Manual запуск

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 API

Создание trigger token:

  1. Settings → CI/CD → Triggers
  2. Add trigger
  3. Получить 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"

#Webhooks

#GitHub Webhooks

GitHub отправляет webhook события на указанный URL при различных событиях.

Настройка:

  1. Settings → Webhooks
  2. Add webhook
  3. Указать:
    • Payload URL
    • Content type (application/json)
    • Secret token
    • Events to trigger

Пример обработки 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

GitLab webhooks используются для уведомления, не для запуска pipeline.

Настройка:

  1. Settings → Webhooks
  2. Add webhook
  3. Указать:
    • URL
    • Secret token
    • Trigger events

События:

  • Push events
  • Tag events
  • Issues events
  • Merge request events
  • Wiki page events
  • Pipeline events
  • Job events

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

#GitHub: Полный workflow с триггерами

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.sh

#GitLab: Conditional pipeline

stages: - 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: manual

#GitHub: Nightly build с уведомлениями

name: 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

#GitLab: Scheduled report

# Настроить 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"

Далее: Docker в CI: сборка и тестирование