From 1e93d7442010214ba9941afba1c9076b324c77c7 Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Mon, 11 May 2026 15:19:22 +0300 Subject: [PATCH] ci(release): fix git auth + fail-fast when GITLAB_TOKEN missing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit semantic-release провалился с 'HTTP Basic: Access denied' потому что: 1. CI default git remote использует CI_JOB_TOKEN scope — не может push'ить tags/commits в protected refs (main branch). 2. GITLAB_TOKEN ещё не настроен в Settings → CI/CD → Variables. 3. Без explicit git remote rewrite semantic-release/git plugin падает с cryptic 'Authentication failed' вместо понятного 'token missing'. Fixes: - before_script: fail-fast если GITLAB_TOKEN пустой — печатает setup инструкцию (write_repository + api scopes, Masked + Protected flags) и exit 0. Pipeline не краснеет (allow_failure: true). - git remote set-url origin https://gitlab-ci-token:${GITLAB_TOKEN}@... — переопределяет default remote чтобы git push мог работать с Project Access Token'ом. - git config user.email/name — semantic-release commit author. После настройки GITLAB_TOKEN в GitLab UI следующий push в main создаст первый авто-tag (v1.3.0 minimum по conventional commits с момента v1.2.2). --- .gitlab-ci.yml | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e0e4cc..fecbc9b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -406,12 +406,36 @@ release: # GL_TOKEN — @semantic-release/gitlab plugin requires this name specifically. GL_TOKEN: $GITLAB_TOKEN before_script: + # Fail fast если token не настроен. Job всё равно allow_failure: true — + # pipeline не покраснеет, но в logs понятная причина (вместо cryptic + # "Authentication failed"). + - | + if [ -z "$GITLAB_TOKEN" ]; then + echo "═══════════════════════════════════════════════════════════════" + echo "GITLAB_TOKEN is empty — release job will skip." + echo "" + echo "Setup (one-time):" + echo " 1. Settings → Access Tokens → create Project Access Token" + echo " scopes: write_repository + api, role: Maintainer" + echo " 2. Settings → CI/CD → Variables → add GITLAB_TOKEN" + echo " flags: Masked + Protected" + echo "" + echo "См. RELEASE.md в репозитории для подробностей." + echo "═══════════════════════════════════════════════════════════════" + exit 0 + fi - apk add --no-cache git ca-certificates + # Configure git remote с токеном для push. CI default remote — HTTPS с + # CI_JOB_TOKEN scope, который НЕ может push'ить tags/commits. Переопределяем + # на Project Access Token (GITLAB_TOKEN). + - git remote set-url origin "https://gitlab-ci-token:${GITLAB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git" + - git config user.email "${GITLAB_USER_EMAIL:-ci@ordinis.local}" + - git config user.name "semantic-release" - npm install -g --silent pnpm@9.15.4 - cd ordinis-admin-ui - pnpm install --frozen-lockfile --silent script: - npx semantic-release # Не блокирует следующие pipelines если release fail'нул (e.g. нет - # релизных commits). Manual investigation если нужно. + # релизных commits, нет GITLAB_TOKEN, transient network error). allow_failure: true