diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b993c23..1848917 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,17 +5,16 @@ name: Release # существующим git-тегом v) — тогда: # 1. Публикуем workspace-пакеты в npm # 2. Создаём git-тег v и пушим его -# 3. Создаём GitHub Release с changelog'ом (changelogithub) -# 4. Собираем и пушим Docker-образ в docker.io (Docker Hub) +# 3. Создаём Gitea Release с changelog'ом через Gitea API # Если версия не менялась — workflow no-op (без ошибки). # # Требуемые secrets в настройках репозитория: -# DOCKERHUB_USERNAME — Docker Hub логин с доступом к организации dicoop -# DOCKERHUB_TOKEN — PAT с правами Read,Write из hub.docker.com/settings/security -# GITHUB_TOKEN — выдаётся автоматически GitHub Actions -# -# npm publish работает через trusted publishing (OIDC) — токен не нужен: -# настроен на стороне npm для @coopenomics/parser2 под этот workflow. +# 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: @@ -26,8 +25,7 @@ concurrency: cancel-in-progress: false permissions: - contents: write # tag + GitHub Release - id-token: write # npm trusted publishing (OIDC) + sigstore provenance + contents: write # tag + Gitea Release jobs: release: @@ -39,7 +37,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - fetch-depth: 0 # нужно для git tag проверки и changelogithub + fetch-depth: 0 # нужно для git tag проверки и git log changelog - uses: pnpm/action-setup@v4 with: { version: '10' } - uses: actions/setup-node@v4 @@ -71,15 +69,15 @@ jobs: pnpm --filter @coopenomics/coopos-ship-reader build pnpm --filter @coopenomics/parser2 build - # npm trusted publishing: OIDC через id-token: write, без NPM_TOKEN. - # Настроено на стороне npm: @coopenomics/parser2/access → Trusted Publisher - # → GitHub Actions (repo=coopenomics/parser2, workflow=release.yml). - # Provenance=true — sigstore подпишет каждый publish. + # 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: - NPM_CONFIG_PROVENANCE: true + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Tag release @@ -90,52 +88,29 @@ jobs: git tag "v${{ steps.ver.outputs.version }}" git push origin "v${{ steps.ver.outputs.version }}" - - name: Create GitHub Release + # 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: npx changelogithub + 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 }} - - 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