diff --git a/.gitea/README.md b/.gitea/README.md index 914643a..db15721 100644 --- a/.gitea/README.md +++ b/.gitea/README.md @@ -1,65 +1,53 @@ # Gitea Actions -Workflow-файлы в [workflows/](workflows/): +Workflow: [workflows/ci.yaml](workflows/ci.yaml). -| Workflow | Триггер | Назначение | -|----------|---------|------------| -| [ci.yaml](workflows/ci.yaml) | push/PR в `main`/`master` | openapi, web, go, bird2, commitlint (PR) | -| [release.yaml](workflows/release.yaml) | после успешного CI (push в main) | semantic-release → tag, CHANGELOG, Gitea Release | -| [publish.yaml](workflows/publish.yaml) | push тега `v*` | docker buildx bake → Container Registry | +| Job | PR | push в main | +|-----|-----|-------------| +| changes, openapi, web, go, bird2 | quality gates | quality gates | +| commitlint | да | — | +| **release** | — | semantic-release + docker push (один run) | -Подробнее о версионировании: [docs/releasing.md](../docs/releasing.md). +Подробнее: [docs/releasing.md](../docs/releasing.md). ## CI (quality gates) -Job **changes** вычисляет флаги по путям в diff (`openapi`, `go`, `web`, `bird_conf`, …). Изменение `.gitea/workflows/*` поднимает полный прогон. +Job **changes** вычисляет флаги по путям в diff. Изменение `.gitea/workflows/*` поднимает полный прогон. -На **pull request** дополнительно запускается **commitlint** (Conventional Commits). +На **pull request** — **commitlint** (Conventional Commits). -Требования к runner: +Runner: `ubuntu-latest`, **bird2** из apt, Docker для job **release**. -- Метка `ubuntu-latest`. -- Job `bird2` ставит **bird2** из репозитория Ubuntu и вызывает `bird -c … -p`. -- Job **publish** требует Docker и доступ к Container Registry. +## Release (job в ci.yaml) -## Release (semantic-release) +После успешных quality gates на **push в main** job **release**: -После успешного CI на push в `main`/`master` workflow **Release** запускает `npx semantic-release` (корневой `package.json`, [.releaserc.json](../.releaserc.json)). +1. `npx semantic-release` — тег `vX.Y.Z` на **текущий commit** (без дополнительного commit в main). +2. Gitea Release + `CHANGELOG.md` как attachment (не в git). +3. `docker buildx bake default --push` с `VERSION=X.Y.Z` — в том же job. -Результат при releasable-коммитах: - -- git tag `vX.Y.Z`; -- commit `CHANGELOG.md` с `[skip ci]`; -- Gitea Release с release notes. +Если releasable-коммитов нет — semantic-release no-op, образы не публикуются. ### Секреты -Один PAT — **`ACTIONS_PAT`**: push/t/tags, releases, запись в Container Registry. Если не задан — fallback на **`gitea.token`** (нужны права на releases и packages в Gitea). - -`GITEA_URL`: `https://git.shts.su` (задано в workflow). - -## Publish (образы) - -Запускается только при **push git-тега** `vX.Y.Z` (не при каждом push в main). - -Собираются все образы из `deploy/docker/*` (`docker buildx bake default --push`). Semver из тега передаётся в Go-бинарники (`VERSION`, `GIT_SHA`, `BUILD_TIME`). - -Registry: **`git.shts.su`**. Login: `${{ gitea.actor }}` / `${{ secrets.ACTIONS_PAT || gitea.token }}` (тот же **`ACTIONS_PAT`**, что и для release). +**`ACTIONS_PAT`**: push tags, releases, Container Registry. Fallback: **`gitea.token`**. ### Теги образов ```text -git.shts.su//<имя>:<тег> +git.shts.su//<имя>:latest +git.shts.su//<имя>:v1.2.3 +git.shts.su//<имя>:1.2.3 +git.shts.su//<имя>: +git.shts.su//<имя>:sha- ``` -Имена: `evobgp-api`, `evobgp-all`, `evobgp-scheduler`, `evobgp-ingest`, `evobgp-render`, `evobgp-deploy`, `evobgp-node`, `evobgp-web`, `evobgp-web-all`, `evobgp-agent`, `evobgp-bird2`. - -Теги при релизе `v1.2.3`: `latest`, `v1.2.3`, короткий SHA, `sha-`. +Имена образов: `evobgp-api`, `evobgp-all`, `evobgp-scheduler`, `evobgp-ingest`, `evobgp-render`, `evobgp-deploy`, `evobgp-node`, `evobgp-web`, `evobgp-web-all`, `evobgp-agent`, `evobgp-bird2`. Пример: ```bash -docker pull git.shts.su/myuser/evobgp-api:v1.2.3 +docker pull git.shts.su/myuser/evobgp-api:1.2.3 ``` -Подробности — [docs/quickstart.md](../docs/quickstart.md), [deploy/docker/README.md](../deploy/docker/README.md). +См. [deploy/docker/README.md](../deploy/docker/README.md), [docs/quickstart.md](../docs/quickstart.md). diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 7e5ef2c..c1b5fa5 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -225,3 +225,88 @@ jobs: set -euxo pipefail npm ci npx commitlint --from "${{ github.event.pull_request.base.sha }}" --to "${{ github.event.pull_request.head.sha }}" + + # --------------------------------------------------------------------------- + # Один push в main: semantic-release (тег на текущий commit, без доп. commit) + docker push. + # --------------------------------------------------------------------------- + release: + needs: [changes, openapi, web, go, bird2] + if: >- + always() && + github.event_name == 'push' && + (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') && + needs.changes.result == 'success' && + (needs.openapi.result == 'success' || needs.openapi.result == 'skipped') && + (needs.web.result == 'success' || needs.web.result == 'skipped') && + (needs.go.result == 'success' || needs.go.result == 'skipped') && + (needs.bird2.result == 'success' || needs.bird2.result == 'skipped') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.ACTIONS_PAT || gitea.token }} + persist-credentials: true + - uses: actions/setup-node@v4 + with: + node-version: "22" + cache: npm + cache-dependency-path: package-lock.json + - name: Install release tooling + run: npm ci + - name: Semantic release + run: npx semantic-release + env: + GITEA_URL: https://git.shts.su + GITEA_TOKEN: ${{ secrets.ACTIONS_PAT || gitea.token }} + - name: Detect new release + id: rel + run: | + set -euo pipefail + if [ -f .release-version ]; then + echo "version=$(tr -d '[:space:]' < .release-version)" >> "$GITHUB_OUTPUT" + echo "released=true" >> "$GITHUB_OUTPUT" + else + echo "released=false" >> "$GITHUB_OUTPUT" + echo "No releasable commits — skipping image publish" + fi + - name: Set up Docker Buildx + if: steps.rel.outputs.released == 'true' + uses: docker/setup-buildx-action@v3 + - name: Prepare image metadata + if: steps.rel.outputs.released == 'true' + id: meta + run: | + set -euo pipefail + echo "version=${{ steps.rel.outputs.version }}" >> "$GITHUB_OUTPUT" + owner_lc="$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" + echo "owner_lc=$owner_lc" >> "$GITHUB_OUTPUT" + short_sha="$(echo '${{ github.sha }}' | cut -c1-7)" + echo "short_sha=$short_sha" >> "$GITHUB_OUTPUT" + echo "build_time=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT" + - name: Log in to Gitea Registry + if: steps.rel.outputs.released == 'true' + uses: docker/login-action@v3 + with: + registry: git.shts.su + username: ${{ gitea.actor }} + password: ${{ secrets.ACTIONS_PAT || gitea.token }} + - name: Build and push images (bake) + if: steps.rel.outputs.released == 'true' + env: + REGISTRY: git.shts.su/${{ steps.meta.outputs.owner_lc }} + IMAGE_TAG: latest + VERSION: ${{ steps.meta.outputs.version }} + SHORT_SHA: ${{ steps.meta.outputs.short_sha }} + SHA_FULL: ${{ github.sha }} + BUILD_TIME: ${{ steps.meta.outputs.build_time }} + CACHE_REF_GO: git.shts.su/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:go-buildcache + CACHE_REF_WEB: git.shts.su/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:web-buildcache + BUILDX_BAKE_ENTITLEMENTS_FS: "0" + run: | + set -euxo pipefail + cd "${{ github.workspace }}/deploy/docker" + sh write-bake-override.sh + docker buildx bake --allow=fs.read="${{ github.workspace }}" \ + -f docker-bake.hcl -f docker-bake.override.hcl default --push + diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml deleted file mode 100644 index edf3b4b..0000000 --- a/.gitea/workflows/publish.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: Publish - -on: - push: - tags: ["v*"] - -jobs: - publish-images: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Prepare image metadata - id: meta - run: | - set -euo pipefail - ref="${GITHUB_REF_NAME:-}" - version="${ref#v}" - echo "version=$version" >> "$GITHUB_OUTPUT" - owner_lc="$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" - echo "owner_lc=$owner_lc" >> "$GITHUB_OUTPUT" - short_sha="$(echo '${{ github.sha }}' | cut -c1-7)" - echo "short_sha=$short_sha" >> "$GITHUB_OUTPUT" - echo "build_time=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT" - - name: Log in to Gitea Registry - uses: docker/login-action@v3 - with: - registry: git.shts.su - username: ${{ gitea.actor }} - password: ${{ secrets.ACTIONS_PAT || gitea.token }} - - name: Build and push images (bake) - env: - REGISTRY: git.shts.su/${{ steps.meta.outputs.owner_lc }} - IMAGE_TAG: latest - VERSION: ${{ steps.meta.outputs.version }} - SHORT_SHA: ${{ steps.meta.outputs.short_sha }} - SHA_FULL: ${{ github.sha }} - BUILD_TIME: ${{ steps.meta.outputs.build_time }} - CACHE_REF_GO: git.shts.su/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:go-buildcache - CACHE_REF_WEB: git.shts.su/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:web-buildcache - BUILDX_BAKE_ENTITLEMENTS_FS: "0" - run: | - set -euxo pipefail - cd "${{ github.workspace }}/deploy/docker" - sh write-bake-override.sh - docker buildx bake --allow=fs.read="${{ github.workspace }}" \ - -f docker-bake.hcl -f docker-bake.override.hcl default --push diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml deleted file mode 100644 index 788bbca..0000000 --- a/.gitea/workflows/release.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: Release - -on: - workflow_run: - workflows: [CI] - types: [completed] - branches: [main, master] - -jobs: - release: - if: >- - github.event.workflow_run.conclusion == 'success' && - github.event.workflow_run.event == 'push' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.workflow_run.head_sha }} - fetch-depth: 0 - token: ${{ secrets.ACTIONS_PAT || gitea.token }} - persist-credentials: true - - uses: actions/setup-node@v4 - with: - node-version: "22" - cache: npm - cache-dependency-path: package-lock.json - - name: Install release tooling - run: npm ci - - name: Semantic release - run: npx semantic-release - env: - GITEA_URL: https://git.shts.su - GITEA_TOKEN: ${{ secrets.ACTIONS_PAT || gitea.token }} diff --git a/.gitignore b/.gitignore index cb3150d..018255f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,10 @@ node_modules/ # Generated by deploy/docker/write-bake-override.sh (CI/local bake) deploy/docker/docker-bake.override.hcl +# CI-only markers (not committed) +.release-version +CHANGELOG.md + # OS .DS_Store Thumbs.db diff --git a/.releaserc.json b/.releaserc.json index dd933cb..7b30cd1 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -27,10 +27,9 @@ } ], [ - "@semantic-release/git", + "@semantic-release/exec", { - "assets": ["CHANGELOG.md"], - "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + "successCmd": "echo ${nextRelease.version} > .release-version" } ], [ diff --git a/README.md b/README.md index 4c3d483..2365543 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,6 @@ docker compose --profile reference up -d - [docs/releasing.md](docs/releasing.md) — пайплайн, commit conventions, секреты CI - API: `GET /version` и `GET /v1/version` (поле `version`) -- Docker-образы публикуются по git-тегу `vX.Y.Z` (workflow **Publish**) +- Docker-образы: теги `latest`, `vX.Y.Z`, `X.Y.Z` — в **том же CI run**, что и релиз (job `release`) Лицензия и условия использования — по политике владельца репозитория. diff --git a/deploy/docker/README.md b/deploy/docker/README.md index fb6fb4e..388925c 100644 --- a/deploy/docker/README.md +++ b/deploy/docker/README.md @@ -4,7 +4,7 @@ Сборка образов — **`docker buildx bake`** (`deploy/docker/docker-bake.hcl`), не отдельные `docker build`. -**Publish:** push git-тега `vX.Y.Z` запускает [.gitea/workflows/publish.yaml](../.gitea/workflows/publish.yaml) — образы с semver-тегом, `latest`, `sha-*`. Переменная `VERSION` из тега попадает в Go-бинарники через `-ldflags`. +**Publish:** push в `main` после quality gates — job **release** в [.gitea/workflows/ci.yaml](../.gitea/workflows/ci.yaml): semantic-release + bake с `VERSION` из релиза. Локально BuildKit также кэширует `/go/pkg/mod` и `~/.cache/go-build` через `RUN --mount=type=cache`. diff --git a/deploy/docker/docker-bake.hcl b/deploy/docker/docker-bake.hcl index e9e2f43..90a0aa1 100644 --- a/deploy/docker/docker-bake.hcl +++ b/deploy/docker/docker-bake.hcl @@ -149,7 +149,10 @@ function "image-tags" { "${REGISTRY}/${name}:${IMAGE_TAG}", "${REGISTRY}/${name}:${SHORT_SHA}", ], - notequal(VERSION, "dev") && notequal(VERSION, "") ? ["${REGISTRY}/${name}:v${VERSION}"] : [] + notequal(VERSION, "dev") && notequal(VERSION, "") ? [ + "${REGISTRY}/${name}:v${VERSION}", + "${REGISTRY}/${name}:${VERSION}", + ] : [] ) } diff --git a/docs/releasing.md b/docs/releasing.md index 6693c1d..da9ca1c 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -15,39 +15,35 @@ EvoBGP использует [Conventional Commits](https://www.conventionalcommi Подробные правила сообщений коммитов: [.cursor/rules/conventional-commits.mdc](../.cursor/rules/conventional-commits.mdc). -## CI-пайплайн +## CI-пайплайн (один push в main) ```text push/merge в main - → CI (openapi, web, go, bird2, commitlint на PR) - → Release (semantic-release после успешного CI) - → git tag vX.Y.Z - → CHANGELOG.md + commit [skip ci] - → Gitea Release с notes - → Publish (push тега v*) - → docker buildx bake с VERSION из тега - → образы: latest, vX.Y.Z, sha-*, короткий SHA + → CI: openapi, web, go, bird2 (параллельно) + → job release (в том же workflow, после quality gates): + → semantic-release: git tag vX.Y.Z на текущий commit (без доп. commit) + → Gitea Release + CHANGELOG.md как attachment + → docker buildx bake с VERSION=X.Y.Z + → образы: latest, vX.Y.Z, X.Y.Z, sha-*, короткий SHA ``` -Workflow-файлы: +Pull request: только quality gates + commitlint; релиз и образы **не** публикуются. -- [.gitea/workflows/ci.yaml](../.gitea/workflows/ci.yaml) — quality gates -- [.gitea/workflows/release.yaml](../.gitea/workflows/release.yaml) — semantic-release -- [.gitea/workflows/publish.yaml](../.gitea/workflows/publish.yaml) — публикация образов +Workflow: [.gitea/workflows/ci.yaml](../.gitea/workflows/ci.yaml) (job **release**). -Конфиг semantic-release: [.releaserc.json](../.releaserc.json). +Конфиг semantic-release: [.releaserc.json](../.releaserc.json) — без `@semantic-release/git` (CHANGELOG не коммитится в репозиторий). ## Секреты Gitea -Один PAT в репозитории — **`ACTIONS_PAT`** (Settings → Actions → Secrets). Используется для semantic-release, push тегов/CHANGELOG и docker login в registry. +Один PAT — **`ACTIONS_PAT`** (Settings → Actions → Secrets). | Право PAT | Зачем | |-----------|--------| -| push / write repository | commit `CHANGELOG.md`, push тегов | -| releases | Gitea Release через semantic-release | -| packages (Container Registry) | workflow **Publish** | +| push tags | git tag `vX.Y.Z` на commit merge | +| releases | Gitea Release + notes | +| packages (Container Registry) | push образов | -Если `ACTIONS_PAT` не задан, workflow пробует **`gitea.token`** job-токен (нужны права на releases и packages в настройках Gitea). +Fallback: **`gitea.token`** (нужны права на releases и packages). ## Источник правды для версии в runtime @@ -56,28 +52,21 @@ Semver из git-тега пробрасывается в Go-бинарники - локально (`go run`) — `version: "dev"` - в образе после релиза — совпадает с тегом (например `1.2.3`) -API: - -- `GET /version` -- `GET /v1/version` - -Ответ включает `version`, `git_sha`, `build_time`; поле `api_version` — deprecated alias. +API: `GET /version`, `GET /v1/version` — поля `version`, `git_sha`, `build_time`. Web UI показывает версию из API (footer sidebar, страница «Мониторинг»). ## CHANGELOG -Файл [`CHANGELOG.md`](../CHANGELOG.md) создаётся и обновляется semantic-release. Копия прикрепляется к Gitea Release. +Release notes — в Gitea Release; файл `CHANGELOG.md` генерируется в CI и прикрепляется как asset, **не** попадает в git history. ## Проверка после релиза -1. В Gitea: тег `vX.Y.Z` и Release с notes. -2. Container Registry: образы с тегом `vX.Y.Z`. -3. `curl http://localhost:8080/version` → `"version":"X.Y.Z"`. -4. Footer Web UI → `vX.Y.Z`. +1. Один run workflow **CI** на push в main: job **release** зелёный. +2. Gitea: тег `vX.Y.Z` на том же commit, что и merge; Release с notes. +3. Container Registry: `evobgp-api:vX.Y.Z`, `evobgp-api:X.Y.Z`, `evobgp-api:latest`. +4. `curl http://localhost:8080/version` → `"version":"X.Y.Z"`. ## Первый релиз (bootstrap) -Merge PR в `main` с conventional commit типа `feat(release): ...` (не `chore` — иначе релиз не создастся). Ожидаемый результат: **v1.0.0**. - -После merge убедитесь, что workflow **Release** завершился успешно и workflow **Publish** собрал образы по тегу. +Merge в `main` с `feat(release): ...` → **v1.0.0** в том же CI run. diff --git a/package-lock.json b/package-lock.json index aa50614..b91977c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@markwylde/semantic-release-gitea": "^2.2.0", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", - "@semantic-release/git": "^10.0.1", + "@semantic-release/exec": "^7.0.0", "@semantic-release/release-notes-generator": "^14.0.3", "semantic-release": "^25.0.2" } @@ -761,40 +761,28 @@ "node": ">=18" } }, - "node_modules/@semantic-release/git": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", - "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", + "node_modules/@semantic-release/exec": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-7.1.0.tgz", + "integrity": "sha512-4ycZ2atgEUutspPZ2hxO6z8JoQt4+y/kkHvfZ1cZxgl9WKJId1xPj+UadwInj+gMn2Gsv+fLnbrZ4s+6tK2TFQ==", "dev": true, "license": "MIT", "dependencies": { - "@semantic-release/error": "^3.0.0", + "@semantic-release/error": "^4.0.0", "aggregate-error": "^3.0.0", "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" + "execa": "^9.0.0", + "lodash-es": "^4.17.21", + "parse-json": "^8.0.0" }, "engines": { - "node": ">=14.17" + "node": ">=20.8.1" }, "peerDependencies": { - "semantic-release": ">=18.0.0" + "semantic-release": ">=24.1.0" } }, - "node_modules/@semantic-release/git/node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/git/node_modules/aggregate-error": { + "node_modules/@semantic-release/exec/node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", @@ -808,7 +796,7 @@ "node": ">=8" } }, - "node_modules/@semantic-release/git/node_modules/clean-stack": { + "node_modules/@semantic-release/exec/node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", @@ -818,7 +806,61 @@ "node": ">=6" } }, - "node_modules/@semantic-release/git/node_modules/indent-string": { + "node_modules/@semantic-release/exec/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@semantic-release/exec/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/exec/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@semantic-release/exec/node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", @@ -828,6 +870,106 @@ "node": ">=8" } }, + "node_modules/@semantic-release/exec/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/exec/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/exec/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/exec/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/exec/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@semantic-release/exec/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/exec/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/github": { "version": "12.0.8", "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.8.tgz", @@ -2335,30 +2477,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/fast-content-type-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", @@ -2970,16 +3088,6 @@ "node": ">= 20" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -3171,19 +3279,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-text-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", @@ -3683,16 +3778,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", @@ -3961,19 +4046,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/@gar/promise-retry": { "version": "1.0.3", "dev": true, @@ -5736,22 +5808,6 @@ "node": ">=0.10.0" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-cancelable": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", @@ -5852,16 +5908,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/p-timeout": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", @@ -6850,13 +6896,6 @@ "node": ">=8" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, "node_modules/signale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", @@ -7121,16 +7160,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", diff --git a/package.json b/package.json index 75d4330..124d12e 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "@markwylde/semantic-release-gitea": "^2.2.0", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", - "@semantic-release/git": "^10.0.1", + "@semantic-release/exec": "^7.0.0", "@semantic-release/release-notes-generator": "^14.0.3", "semantic-release": "^25.0.2" }