ci: semantic-release automation for tag/changelog (Option D)
Закрывает эту тему окончательно. После merge в main CI анализирует conventional commits с последнего tag'а, бампит package.json + CHANGELOG.md и пушит git tag vX.Y.Z. Tag pipeline далее собирает images и ждёт manual gate на trigger-deploy-prod. Что добавил: - ordinis-admin-ui/.releaserc.json — config (commit-analyzer, release-notes, changelog, npm[no-publish], git, gitlab). branches: ['main']. Маппинг conventional-commit types к bump levels. - ordinis-admin-ui/package.json — devDeps: semantic-release@24.2 + 6 plugins. - .gitlab-ci.yml — new 'release' stage + release job: - needs: trigger-deploy-staging (release ТОЛЬКО после зелёного staging) - image: node:22-alpine + pnpm@9.15.4 - GL_TOKEN из CI variable GITLAB_TOKEN (semantic-release/gitlab требует именно GL_TOKEN env name) - allow_failure: true (нет релизных commits = OK, не блокирует pipeline) - RELEASE.md — operator docs: - One-time setup: создать Project Access Token + GITLAB_TOKEN CI var - Commit conventions table (feat→minor, fix→patch, breaking→major) - Skip release (use chore: type или [skip ci]) - Dry-run command для local validation Prod safety: trigger-deploy-prod остаётся manual (when: manual). Автоматизация ТОЛЬКО tag-создания, не deploy. Tag → CI runs → human кликает Deploy. ACTION REQUIRED от user (one-time): 1. GitLab → Settings → Access Tokens → создать Project Access Token scopes: write_repository + api, role: Maintainer 2. GitLab → Settings → CI/CD → Variables → GITLAB_TOKEN (Masked, Protected) Без этого release job будет fail'ить (но pipeline не покраснеет — allow_failure).
This commit is contained in:
@@ -11,6 +11,7 @@ stages:
|
||||
- build
|
||||
- publish
|
||||
- trigger-deploy
|
||||
- release
|
||||
|
||||
variables:
|
||||
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn"
|
||||
@@ -366,3 +367,51 @@ trigger-deploy-prod:
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
|
||||
when: manual
|
||||
|
||||
# =============================================================
|
||||
# Release automation — semantic-release.
|
||||
# =============================================================
|
||||
# Анализирует conventional commits с последнего tag'а, решает bump (patch/
|
||||
# minor/major), генерирует CHANGELOG.md, bump'ит package.json, создаёт git tag
|
||||
# vX.Y.Z и GitLab Release. Tag pipeline далее автоматически собирает images
|
||||
# и ждёт manual gate на trigger-deploy-prod.
|
||||
#
|
||||
# Запускается ТОЛЬКО на main, ТОЛЬКО после успешного staging deploy.
|
||||
# Если нет релизных commits (только chore/test/ci/docs/style) — exit 0 без
|
||||
# tag'а. Loop prevention: коммит `chore(release): vX.Y.Z [skip ci]` —
|
||||
# `[skip ci]` стандартный GitLab marker, новый pipeline не триггерится.
|
||||
#
|
||||
# Setup ONE-TIME (см. RELEASE.md):
|
||||
# 1. Settings → Access Tokens → create Project Access Token
|
||||
# - role: Maintainer
|
||||
# - scopes: write_repository, api
|
||||
# - expiry: 1 год (renew раз в год)
|
||||
# 2. Settings → CI/CD → Variables → add:
|
||||
# GITLAB_TOKEN = <token> (Masked, Protected)
|
||||
#
|
||||
# Tuning: чтобы НЕ релизить feat: автоматом — добавь в commit message
|
||||
# `[skip release]` и semantic-release пропустит этот commit (см. parserOpts).
|
||||
release:
|
||||
stage: release
|
||||
image: node:22-alpine
|
||||
needs:
|
||||
- job: trigger-deploy-staging
|
||||
artifacts: false
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH == "main"'
|
||||
when: on_success
|
||||
variables:
|
||||
# semantic-release требует full git history для commit analysis.
|
||||
GIT_DEPTH: "0"
|
||||
# GL_TOKEN — @semantic-release/gitlab plugin requires this name specifically.
|
||||
GL_TOKEN: $GITLAB_TOKEN
|
||||
before_script:
|
||||
- apk add --no-cache git ca-certificates
|
||||
- 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 если нужно.
|
||||
allow_failure: true
|
||||
|
||||
Reference in New Issue
Block a user