Задать вопрос
@xterro

Как в GitLab выполнить джоб из внешней системы и где взять и как передать токен для выполнения?

Приветствую, в процессе решения задачи: GitLab Как сделать автоматическую проверку кода при push или merge request с уведомлением разработчика о результате и получением от него обр. связи? сделал pipeline из 3-х шагов, который:
1. Отправляет код на проверку (результат складывается в папочку на runner-e и доступен в artifacts
2. Второй джоб берет файл отчёта и отправляет письмом пользователю
3. Третий джоб стоит в режиме manual и ждёт, когда пользователь сделает обратную связь - нажмёт в письме кнопку. В самом джобе такой цикл ожидания:
echo "Ожидание подтверждения пользователя..."
        while true; do
            status=$(curl -s "http://$APPROVAL_SERVICE_URL:$APPROVAL_SERVICE_PORT/check-approval/$CI_PIPELINE_ID" | 
            grep -o '"status":"[^"]*"' | cut -d'"' -f4)

            echo "Статус: $status"

            if [ -z "$status" ]; then
                echo "Не удалось получить статус, повторяем..."
                sleep 30
                continue
            fi

            case "$status" in
                "approved")
                    echo "Подтверждение получено"
                    break
                    ;;
                "rejected")
                    echo "Отклонение: пайплайн прерван"
                    exit 1
                    ;;
                *)
                    echo "Статус: $status, ждём..."
                    sleep 30
                    ;;
            esac
        sleep 30
        done


Так же реализовал отдельный небольшой сервис, который хранит выбор пользователя, какую кнопку он нажал в письме. У сервиса грубо говоря два основных эндпоинта - accept и reject, если пользователь нажмёт в письме кнопку "Принять", то вызывается accept, если "Отклонить", то reject. И теперь возник вопрос, как программно выполнить последний джоб, который стоит в режиме manual ? Вернее как его выполнить я знаю, вызвать api gitlab-a, типа:
GITLAB_URL/api/v4/projects/PROJECT_ID/jobs/JOB_ID/play Проблема в том, что я не могу выполнить джоб без токена. И вот возникает вопрос, какой токен использовать, как его передать в сервис, как это вообще правильно организовывается? Читал про переменную $CI_JOB_TOKEN, но она появляется только в запущенном джобе, а раз у меня джоб в режиме manual, то и переменной у меня такой нет, она же разная для каждого джоба, правильно? Ещё видел, что как-то можно делать через какой-то триггер, но не понял, как это работает? Объясните, как организовать выполнение джоба из внешней системы и как передавать в неё токен для выполнения?
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    DevOps-инженер с нуля
    15 месяцев
    Далее
  • Академия Эдюсон
    GO-разработчик: тариф PRO
    4 месяца
    Далее
  • ProductStar × РБК
    Профессия: Frontend-разработчик + ИИ
    8 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
CI_JOB_TOKEN не подойдёт — он живёт только внутри запущенного джоба. Нужен Personal Access Token (или Project Access Token) с scope api, создаётся в Settings → Access Tokens проекта.

Схема: токен добавляешь как CI-переменную (masked + protected), второй джоб прокидывает его в approval service вместе с ID третьего джоба. ID джоба достаётся так:
GET /api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs
— там список, фильтруешь нужный по имени. Потом сервис дёргает POST .../jobs/{job_id}/play с хедером PRIVATE-TOKEN: токен.

Триггеры — это для запуска новых пайплайнов, не отдельных джобов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы