5 способов запустить GitLab CI Pipeline только при создании нового мерж-реквеста

В этой статье блога мы рассмотрим пять различных методов запуска конвейера GitLab CI только при создании нового мерж-реквеста. Используя эти методы, вы можете гарантировать, что ваш конвейер CI работает эффективно и результативно, уделяя особое внимание изменениям, вносимым в каждый мерж-реквест. Давайте погрузимся!

Метод 1: использование правил GitLab CI/CD
Один из самых простых способов запустить конвейер CI только для новых мерж-реквестов — определить конкретные правила в файле .gitlab-ci.yml. Вы можете использовать ключевое слово rules, чтобы указать условия выполнения конвейера. Вот пример:

# .gitlab-ci.yml
workflow:
  rules:
    - exists: true
      changes:
        - "/*.rb"

В этом примере конвейер будет работать только при наличии изменений в файлах Ruby. Если указать условие exists: true, конвейер запускается только при создании нового мерж-реквеста.

Метод 2: использование триггеров GitLab CI.
Триггеры GitLab CI позволяют вручную запускать конвейеры на основе предопределенных событий. Создав специальный триггер специально для новых мерж-реквестов, вы можете быть уверены, что конвейер будет запускаться только при необходимости. Вот пример:

# .gitlab-ci.yml
trigger_pipeline:
  script:
    - echo "Pipeline triggered!"
  rules:
    - exists: true
      changes:
        - "/*.py"

В этом примере конвейер будет запущен вручную путем выполнения задания триггера через GitLab CI/CD API. Комбинируя условие exists: trueс конкретными изменениями файлов, вы можете гарантировать, что конвейер будет работать только для новых мерж-реквестов.

Метод 3: использование веб-перехватчиков GitLab
GitLab предоставляет веб-перехватчики, которые позволяют запускать внешние действия, например запуск конвейера CI, при возникновении определенных событий. Настроив вебхук для запуска конвейера только для новых мерж-реквестов, вы можете легко автоматизировать процесс. Вот фрагмент кода, который поможет вам начать:

# Flask example
from flask import Flask, request
import subprocess
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.get_json()
    if data['object_kind'] == 'merge_request' and data['object_attributes']['action'] == 'open':
        subprocess.run(['gitlab-runner', 'exec', 'my-pipeline'])
    return 'Webhook received!', 200
if __name__ == '__main__':
    app.run()

В этом примере мы используем Flask, веб-инфраструктуру Python, для создания простой конечной точки веб-перехватчика. Когда открывается мерж-реквест (action == 'open'), конвейер запускается с помощью интерфейса командной строки GitLab Runner.

Метод 4: использование GitLab API
Мощный API GitLab можно использовать для программного запуска конвейеров только для новых мерж-реквестов. Выполняя вызовы API для создания конвейера при обнаружении мерж-реквеста, вы можете добиться детального контроля над выполнением конвейера. Вот фрагмент кода, который даст вам представление:

# Bash example using curl
GITLAB_TOKEN="YOUR_ACCESS_TOKEN"
GITLAB_PROJECT="your-namespace/your-project"
GITLAB_MR_ID="123"
curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
  "https://your-gitlab-instance/api/v4/projects/$GITLAB_PROJECT/merge_requests/$GITLAB_MR_ID/pipelines"

В этом примере мы используем API GitLab для создания конвейера для определенного мерж-реквеста на основе его идентификатора.

Метод 5: собственный исполнитель GitLab CI Runner
Если вам нужна большая гибкость и контроль, вы можете создать собственный исполнитель GitLab CI Runner. Расширив существующий исполнитель и реализовав логику для запуска конвейеров только для новых мерж-реквестов, вы можете добиться гибко настраиваемого рабочего процесса выполнения конвейера. Этот метод требует более продвинутых знаний, но предлагает максимальную гибкость.

Реализуя один из этих методов, вы можете гарантировать, что ваши CI-конвейеры GitLab будут запускаться только при создании новых мерж-реквестов. Такой подход помогает оптимизировать выполнение конвейера, сократить количество ненужных сборок и сосредоточить процесс CI/CD на изменениях, вносимых каждым мерж-реквестом. Выберите метод, который лучше всего соответствует вашим требованиям, и наслаждайтесь эффективной автоматизацией конвейера в рабочем процессе DevOps.