117 lines
5.2 KiB
YAML
117 lines
5.2 KiB
YAML
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 }}
|