Как отправить тег в защищенную ветку с помощью GitLab CI?

У меня есть собственный репозиторий GitLab с защищенной веткой разработки. Я хочу, чтобы наша промежуточная среда всегда была синхронизирована с главой ветки разработки. Таким образом, при каждом успешном слиянии с веткой разработки мы создаем тег в GitLab, который запускает другой конвейер для развертывания в нашей промежуточной среде. Эти теги в настоящее время создаются вручную.

У нас много разных проектов, которые используют одни и те же фрагменты скриптов. Из-за совместимости с другими нашими проектами мне нужен тег, чтобы запустить конвейер для развертывания.

Просто чтобы внести ясность: никому не разрешено переходить непосредственно в ветку разработки. Вместо этого разработчики должны представить свою работу в мерж-реквесте, который включает в себя некоторые проверки/конвейеры обеспечения качества. Это также означает, что принудительное нажатие на ветку запрещено.

В нашем GitLab, размещенном на собственном хостинге, используется http (вместо https).

Я хочу устранить необходимость вручную добавлять тег в репозиторий каждый раз, когда мерж-реквест объединяется с веткой разработки. Это поможет стандартизировать наши теги и гарантировать, что мы никогда больше не забудем отправить тег.

Однако созданный нами конвейер тегов не может отправлять новый тег в ветку разработки и дает сбой. Мы еще не нашли способа автоматически отправлять тег в защищенную ветку. Мы адаптировали наш сценарий конвейера из этого поста:

tagging:
  stage: deploy
  rules:
    - if: $CI_COMMIT_BRANCH == $DEV_BRANCH_NAME
  script:
    - git config --local user.name "${GITLAB_USER_NAME}"
    - git config --local user.email "${GITLAB_USER_EMAIL}"
    - tag = "dev-$CI_COMMIT_SHA"
    - git tag "$tag"
    - git push --tags http://gitlab-ci-token:$CI_JOB_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:$DEV_BRANCH_NAME

в результате чего получается такой вывод конвейера:

$ git config --global user.name "${GITLAB_USER_NAME}"
$ git config --global user.email "${GITLAB_USER_EMAIL}"
$ tag = "dev-$CI_COMMIT_SHA"
$ git tag "$tag"
$ git push --tags http://gitlab-ci-token:$CI_JOB_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:$DEV_BRANCH_NAME
remote: You are not allowed to upload code.
fatal: unable to access 'http://[self_hosted_url]/[path_to_service]/[service].git/': The requested URL returned error: 403
ERROR: Job failed: exit code 128

Сначала мы попробовали использовать оригинальный скрипт, о котором я упоминал выше, но получили сообщение об ошибке remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. // fatal: Authentication failed for [correct url].

Можно ли обойти защиту ветки разработки, чтобы мы могли запустить приведенный выше скрипт, сохраняя при этом требования к мерж-реквестам и защиту ветки от прямых отправок со стороны разработчиков, или можем ли мы изменить приведенный выше скрипт так, чтобы он позволял нам отправлять тег в репо?

Связанная проблема в Gitlab: Разрешить отправку CI_JOB_TOKEN в собственный репозиторий

Gaël J 30.05.2024 21:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
223
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В моей компании мы не используем git, мы просто делаем POST к экземпляру CI_API_V4_URL.

Определение OpenApi здесь , а подробности об API тега здесь

Ответ принят как подходящий

Теги не связаны с ветками. Когда вы отправляете тег, вы не отправляете его в ветку. Поэтому правила защиты ветвей здесь не применяются (хотя, если у вас есть защищенные теги, это применимо). Основная проблема заключается в разрешениях учетных данных, которые вы используете. CI_JOB_TOKEN у вас нет прав на запись в репозиторий, поэтому вы не сможете использовать git для отправки коммитов или тегов. Однако эти токены имеют некоторые ограниченные разрешения API.

По иронии судьбы, вы не можете создавать теги с помощью CI_JOB_TOKEN, однако вы можете создавать релизы (которые, в свою очередь, могут создавать теги). Вы можете использовать API для создания выпуска или использовать ключевое слово Release:. Очевидно, что это имеет основной эффект создания релиза, но также создаст тег git, если он еще не существует.

myjob:
  rules:
    - if $CI_COMMIT_BRANCH == $DEV_BRANCH_NAME
  # ...
  script:
    - echo "noop"
  release:
    tag_name: dev-$CI_COMMIT_SHORT_SHA
    description: dev release for $CI_COMMIT_SHA

Все, что делает ключевое слово Release, — это запускает скрипт в задании, который использует Release-Cli gitlab, который использует API GitLab для создания выпуска. В принципе, вы также можете просто использовать Release API самостоятельно вместо использования ключевого слова release:.

Вы также можете использовать API для создания тега без создания релиза, но в последний раз, когда я проверял, CI_JOB_TOKEN не разрешено использовать эти конечные точки. Итак, если вы хотите создать тег без создания выпуска, вам может потребоваться создать соответствующий токен с авторизованной областью API (например, токен доступа к проекту, токен группового доступа, токен личного доступа или аналогичный) и использовать это в твоей работе.

Другие вопросы по теме