Методы слияния в GitLab при успешном завершении конвейера с примерами кода

Чтобы объединить ветку в GitLab в случае успешного завершения конвейера, вы можете использовать разные методы в зависимости от вашего рабочего процесса и предпочтений. Вот несколько подходов с примерами кода:

  1. Использование конфигурации 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добавляет задержку, предоставляя время для ручного просмотра или дополнительных проверок перед объединением.

  2. Использование 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 для проверки состояния конвейера, а затем запуск мерж-реквеста в случае успешного завершения конвейера.

  3. Использование веб-перехватчиков 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.