В этой статье блога мы рассмотрим пять различных методов запуска конвейера 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.