Чтобы объединить ветку в GitLab в случае успешного завершения конвейера, вы можете использовать разные методы в зависимости от вашего рабочего процесса и предпочтений. Вот несколько подходов с примерами кода:
-
Использование конфигурации CI/CD GitLab:
stages: - build - test - deploy deploy: stage: deploy script: - echo "Deploying..." only: - master merge: stage: deploy script: - echo "Merging..." only: - master rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_REF_NAME == "master" when: delayed start_in: 5 minutes
В этом примере задание
merge
будет запущено после успешного завершения конвейера для запроса на слияние, нацеленного на веткуmaster
. Параметрstart_in
добавляет задержку, предоставляя время для ручного просмотра или дополнительных проверок перед объединением. -
Использование REST API GitLab:
#!/bin/bash # Get the latest pipeline status STATUS=$(curl --header "PRIVATE-TOKEN: <your_access_token>" \ "https://gitlab.example.com/api/v4/projects/<project_id>/pipelines?ref=<branch_name>&sort=desc&per_page=1" | jq -r '.[0].status') # Check if the pipeline succeeded if [ "$STATUS" = "success" ]; then # Merge the branch using the GitLab API curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \ "https://gitlab.example.com/api/v4/projects/<project_id>/merge_requests/<merge_request_id>/merge" else echo "Pipeline did not succeed. Skipping merge." fi
Этот подход предполагает выполнение вызовов API для проверки состояния конвейера, а затем запуск мерж-реквеста в случае успешного завершения конвейера.
-
Использование веб-перехватчиков GitLab:
Настройте веб-перехватчик в GitLab для запуска пользовательского скрипта или конечной точки при успешном завершении конвейера. Затем сценарий или конечная точка смогут выполнить операцию слияния.Вот пример использования сервера Python Flask для обработки веб-перехватчика:
from flask import Flask, request import subprocess app = Flask(__name__) @app.route('/merge', methods=['POST']) def merge_on_pipeline_success(): pipeline_data = request.get_json() if pipeline_data['object_attributes']['status'] == 'success': subprocess.run(['git', 'merge', 'master']) return 'OK' if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
В этом примере сервер прослушивает запросы POST на конечной точке
/merge
. При срабатывании веб-перехватчика он проверяет, является ли статус конвейера «успех», и выполняет операцию слияния с помощью командыgit merge
.