16bd87cca1
Хотфикс release.yml: NPM auth через NODE_AUTH_TOKEN=NPM_TOKEN, снят provenance и id-token: write — Gitea Actions не выдаёт OIDC id-token, поэтому trusted publishing/provenance работать не могут. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
142 lines
5.8 KiB
YAML
142 lines
5.8 KiB
YAML
name: Release
|
||
|
||
# Запускается при каждом push в main (обычно — merge PR из dev).
|
||
# Если версия в packages/parser2/package.json изменилась (не совпадает с
|
||
# существующим git-тегом v<version>) — тогда:
|
||
# 1. Публикуем workspace-пакеты в npm
|
||
# 2. Создаём git-тег v<version> и пушим его
|
||
# 3. Создаём GitHub Release с changelog'ом (changelogithub)
|
||
# 4. Собираем и пушим Docker-образ в docker.io (Docker Hub)
|
||
# Если версия не менялась — workflow no-op (без ошибки).
|
||
#
|
||
# Требуемые secrets в настройках репозитория:
|
||
# NPM_TOKEN — npm access token с правами publish на @coopenomics/*
|
||
# (Gitea Actions не выдаёт OIDC id-token, поэтому npm
|
||
# trusted publishing/provenance здесь недоступны —
|
||
# используем классический auth через NODE_AUTH_TOKEN)
|
||
# DOCKERHUB_USERNAME — Docker Hub логин с доступом к организации dicoop
|
||
# DOCKERHUB_TOKEN — PAT с правами Read,Write из hub.docker.com/settings/security
|
||
# GITHUB_TOKEN — выдаётся автоматически GitHub Actions
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
|
||
concurrency:
|
||
group: release-${{ github.ref }}
|
||
cancel-in-progress: false
|
||
|
||
permissions:
|
||
contents: write # tag + GitHub Release
|
||
|
||
jobs:
|
||
release:
|
||
name: Release
|
||
runs-on: ubuntu-22.04
|
||
outputs:
|
||
released: ${{ steps.ver.outputs.released }}
|
||
version: ${{ steps.ver.outputs.version }}
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 0 # нужно для git tag проверки и changelogithub
|
||
- uses: pnpm/action-setup@v4
|
||
with: { version: '10' }
|
||
- uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
cache: 'pnpm'
|
||
registry-url: 'https://registry.npmjs.org'
|
||
|
||
- run: pnpm install --frozen-lockfile
|
||
|
||
# Читаем версию из packages/parser2/package.json и проверяем
|
||
# что тега v<version> ещё не существует.
|
||
- name: Check version change
|
||
id: ver
|
||
run: |
|
||
VERSION=$(node -p "require('./packages/parser2/package.json').version")
|
||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||
if git rev-parse "v$VERSION" >/dev/null 2>&1; then
|
||
echo "Tag v$VERSION already exists — nothing to release"
|
||
echo "released=false" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "New version detected: v$VERSION"
|
||
echo "released=true" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Build packages
|
||
if: steps.ver.outputs.released == 'true'
|
||
run: |
|
||
pnpm --filter @coopenomics/coopos-ship-reader build
|
||
pnpm --filter @coopenomics/parser2 build
|
||
|
||
# Auth через NODE_AUTH_TOKEN: actions/setup-node по registry-url прописал
|
||
# //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN} в ~/.npmrc, npm/lerna
|
||
# читают токен из env. Provenance не включаем — требует OIDC id-token,
|
||
# которого Gitea Actions не выдаёт (Trusted Publisher тоже не сработает).
|
||
- name: Publish via Lerna (from-package)
|
||
if: steps.ver.outputs.released == 'true'
|
||
run: pnpm exec lerna publish from-package --yes --no-private
|
||
env:
|
||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
|
||
- name: Tag release
|
||
if: steps.ver.outputs.released == 'true'
|
||
run: |
|
||
git config user.name "github-actions[bot]"
|
||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||
git tag "v${{ steps.ver.outputs.version }}"
|
||
git push origin "v${{ steps.ver.outputs.version }}"
|
||
|
||
- name: Create GitHub Release
|
||
if: steps.ver.outputs.released == 'true'
|
||
run: npx changelogithub
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
|
||
docker:
|
||
name: Build & push Docker image
|
||
runs-on: ubuntu-22.04
|
||
needs: release
|
||
if: needs.release.outputs.released == 'true'
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
ref: v${{ needs.release.outputs.version }}
|
||
- uses: pnpm/action-setup@v4
|
||
with: { version: '10' }
|
||
- uses: actions/setup-node@v4
|
||
with: { node-version: '20', cache: 'pnpm' }
|
||
- run: pnpm install --frozen-lockfile
|
||
- run: pnpm --filter @coopenomics/coopos-ship-reader build
|
||
- run: pnpm --filter @coopenomics/parser2 build
|
||
|
||
- uses: docker/setup-buildx-action@v3
|
||
# Docker Hub auth: требует secrets DOCKERHUB_USERNAME + DOCKERHUB_TOKEN
|
||
# (Access Token из hub.docker.com/settings/security с правами Read,Write)
|
||
- uses: docker/login-action@v3
|
||
with:
|
||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||
- name: Docker meta
|
||
id: meta
|
||
uses: docker/metadata-action@v5
|
||
with:
|
||
images: dicoop/parser2
|
||
tags: |
|
||
type=semver,pattern={{version}},value=v${{ needs.release.outputs.version }}
|
||
type=semver,pattern={{major}}.{{minor}},value=v${{ needs.release.outputs.version }}
|
||
type=raw,value=latest
|
||
- uses: docker/build-push-action@v5
|
||
with:
|
||
context: .
|
||
file: Dockerfile
|
||
push: true
|
||
tags: ${{ steps.meta.outputs.tags }}
|
||
labels: ${{ steps.meta.outputs.labels }}
|
||
cache-from: type=gha
|
||
cache-to: type=gha,mode=max
|
||
platforms: linux/amd64,linux/arm64
|