Files
parser2/.github/workflows/release.yml
T

117 lines
5.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Release
# Запускается при каждом push в main (обычно — merge PR из dev).
# Если версия в packages/parser2/package.json изменилась (не совпадает с
# существующим git-тегом v<version>) — тогда:
# 1. Публикуем workspace-пакеты в npm
# 2. Создаём git-тег v<version> и пушим его
# 3. Создаём Gitea Release с changelog'ом через Gitea API
# Если версия не менялась — workflow no-op (без ошибки).
#
# Требуемые secrets в настройках репозитория:
# NPM_TOKEN — npm access token с правами publish на @coopenomics/*
# (Gitea Actions не выдаёт OIDC id-token, поэтому npm
# trusted publishing/provenance здесь недоступны —
# используем классический auth через NODE_AUTH_TOKEN)
# GITHUB_TOKEN — выдаётся автоматически Gitea Actions; используется для
# создания релиза через ${GITHUB_SERVER_URL}/api/v1/...
on:
push:
branches: [main]
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: write # tag + Gitea 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 проверки и git log changelog
- 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 }}"
# changelogithub знает только github.com и падает на git.coopenomics.world
# ("Can not parse GitHub repo from url ..."). Создаём релиз напрямую через
# Gitea REST API: GITHUB_SERVER_URL и GITHUB_REPOSITORY проставляются
# раннером, GITHUB_TOKEN имеет права contents:write на тот же репо.
# Changelog — git log между предыдущим v-тегом и текущим.
- name: Create Gitea Release
if: steps.ver.outputs.released == 'true'
run: |
VERSION="${{ steps.ver.outputs.version }}"
PREV=$(git tag --list 'v*' --sort=-v:refname | grep -vx "v${VERSION}" | head -1)
if [ -n "$PREV" ]; then
CHANGELOG=$(git log "${PREV}..v${VERSION}" --pretty=format:'- %s')
else
CHANGELOG=$(git log "v${VERSION}" --pretty=format:'- %s')
fi
BODY=$(jq -n \
--arg tag "v${VERSION}" \
--arg body "$CHANGELOG" \
'{tag_name:$tag, name:$tag, body:$body, draft:false, prerelease:false}')
curl -fsS -X POST \
-H "Authorization: token ${GITHUB_TOKEN}" \
-H "Content-Type: application/json" \
-d "$BODY" \
"${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}