diff --git a/.claude/skills/merge-train-infra/SKILL.md b/.claude/skills/merge-train-infra/SKILL.md index 1ef318c23add..de7ed784ad12 100644 --- a/.claude/skills/merge-train-infra/SKILL.md +++ b/.claude/skills/merge-train-infra/SKILL.md @@ -13,7 +13,7 @@ The merge-train system is fully automated via GitHub Actions in `.github/workflo 1. **PR Creation** (`merge-train-create-pr.yml`): Triggered on push to `merge-train/*` branches. Creates a PR targeting `next` with the `ci-no-squash` label (and `ci-full-no-test-cache` for spartan). Skips merge commits and commits already in `next`. -2. **Body Updates** (`merge-train-update-pr-body.yml`): Triggered on push to `merge-train/**`. Updates the PR body with meaningful commits (those containing PR references like `(#1234)`). The body uses `BEGIN_COMMIT_OVERRIDE` / `END_COMMIT_OVERRIDE` markers for release-please. +2. **Body Updates** (`merge-train-update-pr-body.yml`): Triggered on push to `merge-train/**`. Updates the PR body with meaningful commits (those containing PR references like `(#1234)`). The body wraps the commit list in `BEGIN_COMMIT_OVERRIDE` / `END_COMMIT_OVERRIDE` markers. 3. **Next Integration** (`merge-train-next-to-branches.yml`): Triggered on push to `next`. Merges `next` into each active merge-train branch via `scripts/merge-train/merge-next.sh`. Uses `continue-on-error: true` so a conflict in one branch does not block others. Skips branches whose PR already has auto-merge enabled. diff --git a/.claude/skills/updating-changelog/SKILL.md b/.claude/skills/updating-changelog/SKILL.md index 1af52b765da4..4da05463fb4a 100644 --- a/.claude/skills/updating-changelog/SKILL.md +++ b/.claude/skills/updating-changelog/SKILL.md @@ -1,6 +1,6 @@ --- name: updating-changelog -description: Updates changelog documentation for contract developers and node operators by analyzing branch changes relative to 'next'. Use when preparing a PR, updating migration notes, documenting breaking changes, or when asked to update changelog/release notes. +description: Updates changelog documentation for contract developers and node operators by analyzing branch changes relative to the appropriate base branch or release tag. Use when preparing a PR, updating migration notes, documenting breaking changes, or when asked to update changelog/release notes. --- # Updating Changelog @@ -9,7 +9,7 @@ description: Updates changelog documentation for contract developers and node op ### 1. Determine Target Files -Read `.release-please-manifest.json` to get the version (e.g., `{"." : "4.0.0"}` → edit `v4.md`). +Read the root `VERSION` file to get the version (e.g., `4.0.0` → edit `v4.md`). If the major-version operator changelog does not exist yet, create it from the current changelog conventions and add it to `docs/docs-operate/operators/reference/changelog/index.md`. **Target files:** @@ -18,7 +18,13 @@ Read `.release-please-manifest.json` to get the version (e.g., `{"." : "4.0.0"}` ### 2. Analyze Branch Changes -Run `git diff next...HEAD --stat` for overview, then `git diff next...HEAD` for details. +Choose the diff base before generating entries: + +- For a PR, use the PR target branch. +- For `v4-next`, release branches, and backports, use that branch's upstream/base rather than `next`. +- For release notes, diff the previous release tag against the new release tag. + +Run `git diff ...HEAD --stat` for overview, then `git diff ...HEAD` for details. **Categorize changes:** diff --git a/.github/release-please-master.json b/.github/release-please-master.json deleted file mode 100644 index 007d5f6760cb..000000000000 --- a/.github/release-please-master.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "release-type": "simple", - "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": true, - "group-pull-request-title-pattern": "chore(master): Release ${version}", - "pull-request-header": ":robot: I have created a new Aztec Packages release", - "versioning": "default", - "include-component-in-tag": false, - "changelog-sections": [ - { "type": "feat", "section": "Features", "hidden": false }, - { "type": "fix", "section": "Bug Fixes", "hidden": false }, - { "type": "chore", "section": "Miscellaneous", "hidden": false }, - { "type": "test", "section": "Miscellaneous", "hidden": false }, - { "type": "refactor", "section": "Miscellaneous", "hidden": false }, - { "type": "docs", "section": "Documentation", "hidden": false } - ], - "packages": { - ".": { - "release-type": "simple" - } - } -} diff --git a/.github/release-please-v2.json b/.github/release-please-v2.json deleted file mode 100644 index 8e4e978e07f2..000000000000 --- a/.github/release-please-v2.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "release-type": "simple", - "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": true, - "group-pull-request-title-pattern": "chore(v2): Release ${version}", - "pull-request-header": "Pending Aztec Packages v2 release", - "versioning": "always-bump-patch", - "include-component-in-tag": false, - "release-search-depth": 50, - "commit-search-depth": 150, - "sequential-calls": true, - "changelog-sections": [ - { "type": "feat", "section": "Features", "hidden": false }, - { "type": "fix", "section": "Bug Fixes", "hidden": false }, - { "type": "chore", "section": "Miscellaneous", "hidden": false }, - { "type": "test", "section": "Miscellaneous", "hidden": false }, - { "type": "refactor", "section": "Miscellaneous", "hidden": false }, - { "type": "docs", "section": "Documentation", "hidden": false } - ], - "packages": { - ".": { - "release-type": "simple" - } - } -} diff --git a/.github/release-please-v3.json b/.github/release-please-v3.json deleted file mode 100644 index a932b6082085..000000000000 --- a/.github/release-please-v3.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "release-type": "simple", - "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": true, - "group-pull-request-title-pattern": "chore(v3): Release ${version}", - "pull-request-header": "Pending Aztec Packages v3 release", - "versioning": "always-bump-patch", - "include-component-in-tag": false, - "release-search-depth": 50, - "commit-search-depth": 150, - "sequential-calls": true, - "changelog-sections": [ - { "type": "feat", "section": "Features", "hidden": false }, - { "type": "fix", "section": "Bug Fixes", "hidden": false }, - { "type": "chore", "section": "Miscellaneous", "hidden": false }, - { "type": "test", "section": "Miscellaneous", "hidden": false }, - { "type": "refactor", "section": "Miscellaneous", "hidden": false }, - { "type": "docs", "section": "Documentation", "hidden": false } - ], - "packages": { - ".": { - "release-type": "simple" - } - } -} diff --git a/.github/release-please-v4.json b/.github/release-please-v4.json deleted file mode 100644 index af042c8872a5..000000000000 --- a/.github/release-please-v4.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "release-type": "simple", - "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": true, - "group-pull-request-title-pattern": "chore(v4): Release ${version}", - "pull-request-header": "Pending Aztec Packages v4 release", - "versioning": "always-bump-patch", - "include-component-in-tag": false, - "release-search-depth": 50, - "commit-search-depth": 150, - "bootstrap-sha": "60d353cded21d7ebeed9bc64b5ae87ebba5f9a38", - "sequential-calls": true, - "changelog-sections": [ - { "type": "feat", "section": "Features", "hidden": false }, - { "type": "fix", "section": "Bug Fixes", "hidden": false }, - { "type": "chore", "section": "Miscellaneous", "hidden": true }, - { "type": "test", "section": "Miscellaneous", "hidden": true }, - { "type": "refactor", "section": "Miscellaneous", "hidden": true }, - { "type": "docs", "section": "Documentation", "hidden": false } - ], - "packages": { - ".": { - "release-type": "simple" - } - } -} diff --git a/.github/workflows/create-release-branch.yml b/.github/workflows/create-release-branch.yml index 725e124ce57b..62e702167378 100644 --- a/.github/workflows/create-release-branch.yml +++ b/.github/workflows/create-release-branch.yml @@ -1,7 +1,7 @@ name: Create Release Branch -# Take the current version from the release-please-manifest.json file on `next`, -# and create a release branch for it. Then update the release-please-manifest.json file on `next` to the next version. +# Take the current version from the VERSION file on `next`, +# and create a release branch for it. Then update the VERSION file on `next` to the next version. on: workflow_dispatch: @@ -34,8 +34,8 @@ jobs: - name: Create release branch run: | - # Get the version from the release-please-manifest.json file - CURRENT_VERSION=$(jq -r '."."' .release-please-manifest.json) + # Get the version from the VERSION file + CURRENT_VERSION=$(cat VERSION) # grab major version CURRENT_MAJOR_VERSION="${CURRENT_VERSION%%.*}" @@ -57,10 +57,10 @@ jobs: NEXT_MAJOR_VERSION=$((CURRENT_MAJOR_VERSION + 1)) NEXT_VERSION="${NEXT_MAJOR_VERSION}.0.0" - # update release-please-manifest.json on `next` branch + # update VERSION on `next` branch git fetch origin next git checkout -B next origin/next - jq --arg version "$NEXT_VERSION" '.["."] = $version' .release-please-manifest.json > temp.json && mv temp.json .release-please-manifest.json - git add .release-please-manifest.json - git commit -m "chore(release): update release-please-manifest.json to $NEXT_VERSION" + echo "$NEXT_VERSION" > VERSION + git add VERSION + git commit -m "chore(release): update VERSION to $NEXT_VERSION" git push origin next diff --git a/.github/workflows/deploy-next-net.yml b/.github/workflows/deploy-next-net.yml index 677a75e95e8e..f393d7554c36 100644 --- a/.github/workflows/deploy-next-net.yml +++ b/.github/workflows/deploy-next-net.yml @@ -42,7 +42,21 @@ jobs: SEMVER=$(echo "$TAG" | sed 's/-amd64$//' | sed 's/-spartan\.[0-9]\{8\}//') else # Scheduled nightly run - get latest spartan nightly tag - current_version=$(jq -r '."."' .release-please-manifest.json) + git fetch origin +next:refs/remotes/origin/next --depth=1 || true + current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true) + if [[ -z "$current_version" ]]; then + current_version=$( + git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' | + awk -F/ '{print $3}' | + sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' | + sort -V | + tail -n1 + ) + fi + if [[ -z "$current_version" ]]; then + echo "Unable to infer current next version from VERSION or nightly tags" + exit 1 + fi echo "Current version: $current_version" # Format the tag as: -spartan.-amd64 diff --git a/.github/workflows/deploy-staging-public.yml b/.github/workflows/deploy-staging-public.yml index e26a2538b650..0545549ad44c 100644 --- a/.github/workflows/deploy-staging-public.yml +++ b/.github/workflows/deploy-staging-public.yml @@ -4,6 +4,8 @@ on: push: branches: - v4 + tags: + - 'v4.*' workflow_dispatch: {} concurrency: @@ -29,6 +31,19 @@ jobs: - name: Poll for semver tag at HEAD id: poll-tag run: | + if [[ "${GITHUB_REF_TYPE:-}" == "tag" ]]; then + TAG="$GITHUB_REF_NAME" + if ! ci3/semver check "$TAG"; then + echo "Error: Tag $TAG is not a valid semver tag" + exit 1 + fi + echo "Found pushed tag: $TAG" + SEMVER="${TAG#v}" + echo "tag=$TAG" >> $GITHUB_OUTPUT + echo "semver=$SEMVER" >> $GITHUB_OUTPUT + exit 0 + fi + HEAD_SHA=$(git rev-parse HEAD) MAX_ATTEMPTS=60 echo "Looking for any semver tag at HEAD ($HEAD_SHA)" diff --git a/.github/workflows/nightly-release-tag.yml b/.github/workflows/nightly-release-tag.yml index a02c47aa2915..bd96dfec2e58 100644 --- a/.github/workflows/nightly-release-tag.yml +++ b/.github/workflows/nightly-release-tag.yml @@ -26,7 +26,7 @@ jobs: run: | git config --global user.email "tech@aztecprotocol.com" git config --global user.name "AztecBot" - current_version=$(jq -r '."."' .release-please-manifest.json) + current_version=$(cat VERSION) echo "Current version: $current_version" nightly_tag="v${current_version}-nightly.$(date -u +%Y%m%d)" echo "Nightly tag: $nightly_tag" @@ -46,7 +46,21 @@ jobs: run: | git config --global user.email "tech@aztecprotocol.com" git config --global user.name "AztecBot" - current_version=$(jq -r '."."' .release-please-manifest.json) + git fetch origin +next:refs/remotes/origin/next --depth=1 || true + current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true) + if [[ -z "$current_version" ]]; then + current_version=$( + git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' | + awk -F/ '{print $3}' | + sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' | + sort -V | + tail -n1 + ) + fi + if [[ -z "$current_version" ]]; then + echo "Unable to infer current next version from VERSION or nightly tags" + exit 1 + fi echo "Current version: $current_version" nightly_tag="v${current_version}-spartan.$(date -u +%Y%m%d)" echo "Spartan nightly tag: $nightly_tag" diff --git a/.github/workflows/nightly-spartan-bench.yml b/.github/workflows/nightly-spartan-bench.yml index e331be8f8ec5..9dc203c744f6 100644 --- a/.github/workflows/nightly-spartan-bench.yml +++ b/.github/workflows/nightly-spartan-bench.yml @@ -29,7 +29,21 @@ jobs: if [[ -n "${{ inputs.nightly_tag }}" ]]; then nightly_tag="${{ inputs.nightly_tag }}" else - current_version=$(jq -r '."."' .release-please-manifest.json) + git fetch origin +next:refs/remotes/origin/next --depth=1 || true + current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true) + if [[ -z "$current_version" ]]; then + current_version=$( + git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' | + awk -F/ '{print $3}' | + sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' | + sort -V | + tail -n1 + ) + fi + if [[ -z "$current_version" ]]; then + echo "Unable to infer current next version from VERSION or nightly tags" + exit 1 + fi nightly_tag="${current_version}-spartan.$(date -u +%Y%m%d)" fi echo "nightly_tag=$nightly_tag" >> $GITHUB_OUTPUT @@ -134,7 +148,21 @@ jobs: if [[ -n "${{ inputs.nightly_tag }}" ]]; then nightly_tag="${{ inputs.nightly_tag }}" else - current_version=$(jq -r '."."' .release-please-manifest.json) + git fetch origin +next:refs/remotes/origin/next --depth=1 || true + current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true) + if [[ -z "$current_version" ]]; then + current_version=$( + git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' | + awk -F/ '{print $3}' | + sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' | + sort -V | + tail -n1 + ) + fi + if [[ -z "$current_version" ]]; then + echo "Unable to infer current next version from VERSION or nightly tags" + exit 1 + fi nightly_tag="${current_version}-spartan.$(date -u +%Y%m%d)" fi echo "nightly_tag=$nightly_tag" >> $GITHUB_OUTPUT diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml deleted file mode 100644 index dd14e3153737..000000000000 --- a/.github/workflows/release-please.yml +++ /dev/null @@ -1,306 +0,0 @@ -name: release-please - -on: - push: - branches: - - "v[0-9]*" - - master - -permissions: - contents: write - pull-requests: write -env: - BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - -jobs: - release-please: - name: Create Release - runs-on: ubuntu-latest - outputs: - release-pr: ${{ steps.release.outputs.pr }} - release-version: ${{ steps.release.outputs.tag_name }} - steps: - - name: Run Release Please - id: release - uses: googleapis/release-please-action@7d28262f14160787a44a6be36146a18e6f575a3f - with: - token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - config-file: .github/release-please-${{ github.ref_name }}.json - target-branch: ${{ github.ref_name }} - - dedupe-release-notes: - name: Deduplicate release notes - needs: [release-please] - if: ${{ needs.release-please.outputs.release-pr }} - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - steps: - - name: Check if release notes branch exists - id: check-branch - env: - GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - run: | - NOTES_BRANCH="${{ fromJSON(needs.release-please.outputs.release-pr).headBranchName }}--release-notes" - if git ls-remote --exit-code "https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git" "refs/heads/$NOTES_BRANCH" >/dev/null 2>&1; then - echo "exists=true" >> $GITHUB_OUTPUT - echo "branch=$NOTES_BRANCH" >> $GITHUB_OUTPUT - else - echo "exists=false" >> $GITHUB_OUTPUT - echo "Release notes branch $NOTES_BRANCH does not exist, skipping deduplication" - fi - - - name: Checkout release notes branch - if: steps.check-branch.outputs.exists == 'true' - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - with: - ref: ${{ steps.check-branch.outputs.branch }} - fetch-depth: 1 - token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - - - name: Fetch dedupe script from target branch - if: steps.check-branch.outputs.exists == 'true' - run: | - git fetch origin ${{ github.ref_name }} --depth=1 - git show origin/${{ github.ref_name }}:scripts/dedupe_release_notes.py > /tmp/dedupe_release_notes.py - - - name: Configure Git - if: steps.check-branch.outputs.exists == 'true' - run: | - git config --global user.name AztecBot - git config --global user.email tech@aztecprotocol.com - - - name: Deduplicate release notes - if: steps.check-branch.outputs.exists == 'true' - run: | - if [ -f release-notes.md ]; then - python3 /tmp/dedupe_release_notes.py release-notes.md - git add release-notes.md - if ! git diff --cached --quiet; then - git commit -m "chore: deduplicate release notes" - git push - fi - fi - - - name: Update PR body with deduped notes - if: steps.check-branch.outputs.exists == 'true' - env: - GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - run: | - if [ -f release-notes.md ]; then - PR_NUMBER=${{ fromJSON(needs.release-please.outputs.release-pr).number }} - NOTES_SIZE=$(wc -c < release-notes.md) - if [ "$NOTES_SIZE" -lt 60000 ]; then - gh pr edit "$PR_NUMBER" --body "$(cat release-notes.md)" - fi - fi - - update-docs: - name: Update docs - env: - GITHUB_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - needs: [release-please] - if: ${{ needs.release-please.outputs.release-pr }} - runs-on: ubuntu-latest - - steps: - - name: Checkout release branch - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - with: - ref: ${{ fromJSON(needs.release-please.outputs.release-pr).headBranchName }} - token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - - - name: Setup dependencies - run: | - sudo apt install -y --no-install-recommends doxygen - corepack enable - - - name: Configure Git - run: | - git config --global user.name AztecBot - git config --global user.email tech@aztecprotocol.com - - - name: Install Noir toolchain - uses: noir-lang/noirup@v0.1.4 - with: - toolchain: nightly - - - name: Query new version - id: version - run: | - # Extract version from .release-please-manifest.json - AZTEC_VERSION=$(jq -r '."."' .release-please-manifest.json) - - # Add v prefix - AZTEC_VERSION="v$AZTEC_VERSION" - - echo "semver=$AZTEC_VERSION" >> $GITHUB_OUTPUT - - - name: Generate Aztec.nr API documentation - working-directory: ./docs - run: | - ./scripts/aztec_nr_docs_generation/generate_aztec_nr_docs.sh ${{ steps.version.outputs.semver }} - echo "Generated Aztec.nr API docs for: ${{ steps.version.outputs.semver }}" - - - name: Build bb (uses cache if available) - working-directory: ./barretenberg/cpp - run: | - ./bootstrap.sh build_native - echo "BB_PATH=$(pwd)/build/bin" >> $GITHUB_ENV - - - name: Build noir packages - run: | - # Initialize noir submodule (required for yarn-project portal dependencies) - git submodule update --init --recursive noir/noir-repo - # Build noir JS packages (creates noir/packages/ directory needed by yarn-project) - cd noir - ./bootstrap.sh install_deps - ./bootstrap.sh build_packages - - - name: Build aztec CLI - id: build-cli - continue-on-error: true - working-directory: ./yarn-project - run: | - ./bootstrap.sh - echo "AZTEC_CLI_PATH=$(pwd)/aztec/dest/bin" >> $GITHUB_ENV - - - name: Generate TypeScript API documentation - if: steps.build-cli.outcome == 'success' - working-directory: ./docs - run: | - # Generate TypeScript API docs for this version (requires yarn-project to be built) - ./scripts/typescript_api_generation/generate_ts_api_docs.sh ${{ steps.version.outputs.semver }} - echo "Generated TypeScript API docs for: ${{ steps.version.outputs.semver }}" - - - name: Generate Aztec CLI documentation - id: aztec-cli-docs - if: steps.build-cli.outcome == 'success' - working-directory: ./docs - continue-on-error: true - run: | - # Add locally built binaries to PATH - export PATH="${BB_PATH}:${PATH}" - - # Create wrapper for aztec CLI that runs the local build - mkdir -p /tmp/cli-bin - cat > /tmp/cli-bin/aztec << 'EOF' - #!/bin/bash - node "$AZTEC_CLI_PATH/index.js" "$@" - EOF - chmod +x /tmp/cli-bin/aztec - - # Copy aztec-up from repo (it's a standalone bash script) - cp "$GITHUB_WORKSPACE/aztec-up/bin/aztec-up" /tmp/cli-bin/aztec-up - chmod +x /tmp/cli-bin/aztec-up - - export PATH="/tmp/cli-bin:${PATH}" - - # Generate Aztec CLI docs using locally built binaries - ./scripts/cli_reference_generation/generate_all_cli_docs.sh --force current - echo "Generated Aztec CLI documentation for: ${{ steps.version.outputs.semver }}" - - - name: Generate BB CLI documentation - id: bb-cli-docs - working-directory: ./barretenberg/docs - continue-on-error: true - run: | - # Add locally built bb to PATH - export PATH="${BB_PATH}:${PATH}" - - # Generate BB CLI docs - ./scripts/generate_bb_cli_docs.sh --force current - echo "Generated BB CLI documentation for: ${{ steps.version.outputs.semver }}" - - - name: Comment on PR if CLI docs generation failed - if: steps.build-cli.outcome == 'failure' || steps.aztec-cli-docs.outcome == 'failure' || steps.bb-cli-docs.outcome == 'failure' - env: - GH_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} - run: | - FAILED_DOCS="" - if [[ "${{ steps.build-cli.outcome }}" == "failure" ]]; then - FAILED_DOCS="yarn-project build (cache miss)" - fi - if [[ "${{ steps.aztec-cli-docs.outcome }}" == "failure" ]]; then - if [[ -n "$FAILED_DOCS" ]]; then - FAILED_DOCS="$FAILED_DOCS, Aztec CLI" - else - FAILED_DOCS="Aztec CLI" - fi - fi - if [[ "${{ steps.bb-cli-docs.outcome }}" == "failure" ]]; then - if [[ -n "$FAILED_DOCS" ]]; then - FAILED_DOCS="$FAILED_DOCS, BB CLI" - else - FAILED_DOCS="BB CLI" - fi - fi - - gh pr comment ${{ fromJSON(needs.release-please.outputs.release-pr).number }} --body "$(cat < versions.json - yarn - COMMIT_TAG=$COMMIT_TAG yarn build - COMMIT_TAG=$COMMIT_TAG yarn docusaurus docs:version ${{ steps.version.outputs.semver }} - - - name: Update Barretenberg Docs versions.json with new version - working-directory: ./barretenberg/docs/scripts - run: | - ./update_versions.sh - - - name: Commit new Barretenberg Docs version - run: | - git add . - git commit -m "chore(docs): cut new barretenberg docs version for tag ${{ steps.version.outputs.semver }}" - git push diff --git a/.github/workflows/weekly-proving-bench.yml b/.github/workflows/weekly-proving-bench.yml index f9f561f6d88e..d042c033006c 100644 --- a/.github/workflows/weekly-proving-bench.yml +++ b/.github/workflows/weekly-proving-bench.yml @@ -29,7 +29,21 @@ jobs: if [[ -n "${{ inputs.nightly_tag }}" ]]; then nightly_tag="${{ inputs.nightly_tag }}" else - current_version=$(jq -r '."."' .release-please-manifest.json) + git fetch origin +next:refs/remotes/origin/next --depth=1 || true + current_version=$(git show origin/next:VERSION 2>/dev/null | tr -d '[:space:]' || true) + if [[ -z "$current_version" ]]; then + current_version=$( + git ls-remote --tags --refs origin 'v[0-9]*-nightly.*' | + awk -F/ '{print $3}' | + sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+)-nightly\..*$/\1/p' | + sort -V | + tail -n1 + ) + fi + if [[ -z "$current_version" ]]; then + echo "Unable to infer current next version from VERSION or nightly tags" + exit 1 + fi nightly_tag="${current_version}-spartan.$(date -u +%Y%m%d)" fi echo "nightly_tag=$nightly_tag" >> $GITHUB_OUTPUT diff --git a/.release-please-manifest.json b/.release-please-manifest.json deleted file mode 100644 index 83f9eb80419d..000000000000 --- a/.release-please-manifest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - ".": "4.3.0" -} diff --git a/README.md b/README.md index 1a82f2949659..557ab75d2296 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Logging goes through the [Logger](yarn-project/foundation/src/log/) module in Ty ## Releases -Releases are driven by [release-please](https://github.com/googleapis/release-please), which maintains a 'Release PR' containing an updated CHANGELOG.md since the last release. Triggering a new release is simply a case of merging this PR to master. A [github workflow](./.github/workflows/release-please.yml) will create the tagged release triggering ./bootstrap.sh release to build and deploy the version at that tag. +Releases are driven by git tags. The current version is tracked in the root `VERSION` file. Pushing a semver tag (e.g. `v1.2.3`, or a nightly tag created by the [nightly release workflow](./.github/workflows/nightly-release-tag.yml)) triggers `./bootstrap.sh release` to build and deploy the version at that tag. ## Contribute diff --git a/VERSION b/VERSION new file mode 100644 index 000000000000..fdc6698807a9 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +4.4.0 diff --git a/barretenberg/docs/docusaurus.config.ts b/barretenberg/docs/docusaurus.config.ts index 7fc7bf7e4253..cd35f2d3483d 100644 --- a/barretenberg/docs/docusaurus.config.ts +++ b/barretenberg/docs/docusaurus.config.ts @@ -262,17 +262,6 @@ const config: Config = { className: "code-block-error-line", line: "this-will-error", }, - // This could be used to have release-please modify the current version in code blocks. - // However doing so requires to manually add each md file to release-please-config.json/extra-files - // which is easy to forget an error prone, so instead we rely on the AztecPackagesVersion() function. - { - line: "x-release-please-version", - block: { - start: "x-release-please-start-version", - end: "x-release-please-end", - }, - className: "not-allowed-to-be-empty", - }, ], }, } satisfies Preset.ThemeConfig, diff --git a/bootstrap.sh b/bootstrap.sh index ddb0cc70dacb..5238ef7dce98 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -480,7 +480,7 @@ function release_github { function release { # Our releases are controlled by the REF_NAME environment variable, which should be a valid semver (but can have a leading v). - # We ensure there is a github release for our REF_NAME, if not on latest (in which case release-please creates it). + # We ensure there is a github release for our REF_NAME. # We derive a dist tag from our prerelease portion of our REF_NAME semver. It is latest if no prerelease. # Our steps: # barretenberg/cpp => upload binaries to github release @@ -496,7 +496,6 @@ function release { set -x # Ensure we have a github release for our REF_NAME. - # This is in case were are not going through release-please. release_github projects=( @@ -803,7 +802,7 @@ case "$cmd" in compat_min_version="4.2.0" # Get current major version. - current_version=$(jq -r '."."' .release-please-manifest.json) + current_version=$(cat VERSION) major=$(semver major "$current_version") if [ "$major" != "$compat_major" ]; then echo "Compat e2e tests only apply to v${compat_major}. Current major: v${major}. Skipping." diff --git a/ci3/source_refname b/ci3/source_refname index 797f94fef854..e72a90eef9b5 100644 --- a/ci3/source_refname +++ b/ci3/source_refname @@ -51,5 +51,5 @@ if [ -z "${COMMIT_AUTHOR:-}" ]; then fi if [ -z "${CURRENT_VERSION:-}" ]; then - export CURRENT_VERSION=$(jq -r '."."' $root/.release-please-manifest.json) + export CURRENT_VERSION=$(cat $root/VERSION) fi diff --git a/docs/README.md b/docs/README.md index 158de3509dee..6730abf4f024 100644 --- a/docs/README.md +++ b/docs/README.md @@ -51,7 +51,7 @@ The way docs builds work is the following: - CI runs on merge to next (the default branch), builds the dependencies needed to build the docs, then deploys on the main docs website - [The main CI workflow](../.github/workflows/ci3.yml) runs on pull requests and builds the dependencies and the docs, giving you a preview to check that everything is correct. You can also trigger docs CI specifically with the `ci-docs` label on a PR. -- [The nightly docs workflow](../.github/workflows/nightly-docs-release.yml) runs daily to create versioned documentation for nightly releases, automatically cutting a new version of the docs for the latest nightly tag +- Release tags do not cut versioned docs automatically. For public releases, run the `/release-docs` or `/release-network-docs` process so API docs, CLI docs, versioned snapshots, and version config files are updated intentionally. The preprocessing macros use environment variables to determine version numbers. For nightly builds, set `NIGHTLY_TAG` (or `COMMIT_TAG` for backwards compatibility): @@ -215,7 +215,7 @@ yarn generate:aztec-nr-api v1.0.0 - When `aztec-nr` source code changes (new functions, updated comments, etc.) - The `next` version docs should be committed to the repo -- Versioned docs (e.g., `v1.0.0`) are automatically generated by CI when releases are cut +- Versioned docs (e.g., `v1.0.0`) are generated by the release docs process when releases are cut The generated docs are stored in `static/aztec-nr-api//` and linked from the [Aztec.nr API Reference](/developers/docs/aztec-nr/api) page. @@ -266,7 +266,7 @@ yarn generate:typescript-api v3.0.0-devnet.6 - When TypeScript package APIs change (new exports, updated JSDoc comments, etc.) - The `next` version docs should be committed to the repo -- Versioned docs are automatically generated by CI during release workflows +- Versioned docs are generated by the release docs process during releases The generated docs are linked from the [TypeScript API Reference](/developers/docs/aztec-js/typescript_api_reference) page. @@ -377,7 +377,7 @@ You can embed code snippets into a `.md`/`.mdx` file from code which lives elsew ### `#include_aztec_version` -This macro will be replaced inline with the current Aztec packages tag. This value is sourced from `.release-please-manifest.json` on the project root. +This legacy macro will be replaced inline with the current Aztec packages tag from `COMMIT_TAG`. Alternatively, you can also use the `AztecPackagesVersion()` js function, which you need to import explicitly: @@ -491,7 +491,7 @@ To view the protocol specs, you can run `yarn dev`. When viewing the protocol sp ## Adding Migration Notes -When making breaking changes to Aztec, add migration notes to help users upgrade. Migration notes are organized by version and component in `docs/migration_notes.md`. +When making breaking changes to Aztec, add migration notes to help users upgrade. Migration notes are organized by version and component in `docs/docs-developers/docs/resources/migration_notes.md`. ### Structure diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index fc942476cb53..fcf4234c2175 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -529,17 +529,6 @@ const config = { className: "code-block-error-line", line: "this-will-error", }, - // This could be used to have release-please modify the current version in code blocks. - // However doing so requires to manually add each md file to release-please-config.json/extra-files - // which is easy to forget an error prone, so instead we rely on the AztecPackagesVersion() function. - { - line: "x-release-please-version", - block: { - start: "x-release-please-start-version", - end: "x-release-please-end", - }, - className: "not-allowed-to-be-empty", - }, ], }, }), diff --git a/docs/scripts/cli_reference_generation/CLI_DOCS_README.md b/docs/scripts/cli_reference_generation/CLI_DOCS_README.md index 6b9e8fc5a078..3f20db4f1479 100644 --- a/docs/scripts/cli_reference_generation/CLI_DOCS_README.md +++ b/docs/scripts/cli_reference_generation/CLI_DOCS_README.md @@ -399,7 +399,7 @@ The documentation system uses a **unified script architecture** to reduce code d To add support for a new CLI (e.g., `aztec-prover`): 1. Add configuration entry to `cli_docs_config.json` (single source of truth) 2. If the CLI needs special handling (e.g., version-independent), update `generate_cli_docs.sh` -3. Update CI workflows (`.github/workflows/nightly-docs-release.yml` and `release-please.yml`) if the CLI needs to be made available during CI builds +3. Update the release docs process and docs CI setup if the CLI needs to be made available during docs builds ## License diff --git a/playground/src/utils/constants.ts b/playground/src/utils/constants.ts index 105500c33596..4676376d75f6 100644 --- a/playground/src/utils/constants.ts +++ b/playground/src/utils/constants.ts @@ -1,6 +1,6 @@ -import releasePleaseManifest from '../../../.release-please-manifest.json'; +import versionFile from '../../../VERSION?raw'; -export const VERSION = releasePleaseManifest['.']; +export const VERSION = versionFile.trim(); export const ContractDescriptions = { PrivateVoting: diff --git a/playground/update-artifacts.sh b/playground/update-artifacts.sh index f80b41e2a80a..565c9c3b0a61 100755 --- a/playground/update-artifacts.sh +++ b/playground/update-artifacts.sh @@ -1,4 +1,4 @@ -VERSION=$(cat ../.release-please-manifest.json | jq -r '."."') +VERSION=$(cat ../VERSION) echo "Adding latest artifact for version $VERSION" diff --git a/release-image/Dockerfile b/release-image/Dockerfile index 4cd9d90a4407..3d7a6b952ef7 100644 --- a/release-image/Dockerfile +++ b/release-image/Dockerfile @@ -17,7 +17,7 @@ WORKDIR "/usr/src/yarn-project" # Ensure the correct version shows in aztec --version ARG VERSION -RUN echo '{".": "'$VERSION'"}' > /usr/src/.release-please-manifest.json +RUN echo "$VERSION" > /usr/src/VERSION # Stamp the version into stdlib/package.json, which getPackageVersion() reads at runtime. RUN jq --arg v "$VERSION" '.version = $v' /usr/src/yarn-project/stdlib/package.json > /tmp/p.json \ && mv /tmp/p.json /usr/src/yarn-project/stdlib/package.json diff --git a/release-image/Dockerfile.dockerignore b/release-image/Dockerfile.dockerignore index 5a3681947eea..88e7b209091c 100644 --- a/release-image/Dockerfile.dockerignore +++ b/release-image/Dockerfile.dockerignore @@ -1,6 +1,6 @@ # We include just what's needed to run the aztec cli (none of the aztec.sh extensions). * -!/.release-please-manifest.json +!/VERSION !/barretenberg/cpp/build/bin/bb-avm !/barretenberg/ts/dest/ !/barretenberg/ts/build/ diff --git a/spartan/aztec-node/scripts/setup-otel-resource.sh b/spartan/aztec-node/scripts/setup-otel-resource.sh index 0861363a303d..adca32151ef7 100644 --- a/spartan/aztec-node/scripts/setup-otel-resource.sh +++ b/spartan/aztec-node/scripts/setup-otel-resource.sh @@ -3,14 +3,14 @@ set -ex -VERSION_FILE="/usr/src/.release-please-manifest.json" +VERSION_FILE="/usr/src/VERSION" declare -A attrs_map attrs_map["service.version"]="0.0.0"; if [[ -f "$VERSION_FILE" ]]; then # there's a single version of the whole monocontainer - attrs_map["service.version"]=$(jq -r '.["."]' "$VERSION_FILE") + attrs_map["service.version"]=$(cat "$VERSION_FILE") fi export OTEL_SERVICE_NAME="${OTEL_SERVICE_NAME:-unknown_service}" diff --git a/spartan/scripts/create_devnet.ts b/spartan/scripts/create_devnet.ts index 3972b5a97246..31a917389b47 100755 --- a/spartan/scripts/create_devnet.ts +++ b/spartan/scripts/create_devnet.ts @@ -7,7 +7,7 @@ * * The script: * 1. Validates the nightly tag format (vX.Y.Z-nightly.YYYYMMDD) - * 2. Reads the major version from .release-please-manifest.json + * 2. Reads the major version from the VERSION file * 3. Finds the next devnet iteration number * 4. Creates a branch with a .devnet-version file * 5. Pushes the branch @@ -43,11 +43,8 @@ if (!/^v\d+\.\d+\.\d+-nightly\.\d{8}$/.test(nightlyTag)) { // 2. Configure git identity in CI configureGitIdentityInCI(); -// 3. Read major version from manifest -const manifest = JSON.parse( - readFileSync(".release-please-manifest.json", "utf-8"), -); -const version: string = manifest["."]; +// 3. Read major version from the VERSION file +const version: string = readFileSync("VERSION", "utf-8").trim(); const majorVersion = version.split(".")[0]; console.log(`Major version: ${majorVersion}`); diff --git a/spartan/testnet-runbook.md b/spartan/testnet-runbook.md index 55760e513c8e..44eb1f265e59 100644 --- a/spartan/testnet-runbook.md +++ b/spartan/testnet-runbook.md @@ -12,7 +12,7 @@ The engineering team's public testnet responsibilities begin after code-freeze. 2. Create a named release branch (eg: `release/sassy-salamander`) from the desired `master` release (eg:`v0.64.0`). 3. Complete all QA testing against `release/sassy-salamander`. 4. For tests that do not pass, create a hotfix into the `release/sassy-salamander` release branch. -5. After testing is complete, initiate a `release-please` CI workflow from `release/sassy-salamander` to publish release artifacts. +5. After testing is complete, push a semver release tag from `release/sassy-salamander` to trigger the release CI workflow and publish release artifacts. ### Release Notes and Artifact Builds diff --git a/yarn-project/BRANCHING.md b/yarn-project/BRANCHING.md index e289f0839ece..f7fddca25f2c 100644 --- a/yarn-project/BRANCHING.md +++ b/yarn-project/BRANCHING.md @@ -16,9 +16,9 @@ `next` is the primary development branch. All new work should go into `next` by default. -The current version of a branch can be found in `.release-please-manifest.json`. As of this writing, the version of `next` is `3.0.0`. +The current version of a branch can be found in the root `VERSION` file. -Each day at 02:00 UTC, `.github/workflows/nightly-release-tag.yml` runs, which creates a tag like `v3.0.0-nightly.20250919`. +Each day at 02:00 UTC, `.github/workflows/nightly-release-tag.yml` runs, which creates a tag like `v$(cat VERSION)-nightly.20250919`. The creation of a tag starting with `v` causes `.github/workflows/ci3.yml` to run. @@ -37,9 +37,9 @@ It requires a commit SHA which SHOULD be one from a particular nightly run. This creates a new branch for whatever the current version in `next` is, then bumps the version on `next`. -For example, if this were run now, it would create a branch `v3`, and then bump the version in `.release-please-manifest.json` on `next` to be `4.0.0`. +For example, if `VERSION` is `5.0.0`, it creates branch `v5`, then bumps the root `VERSION` file on `next` to `6.0.0`. -Every push to a release branch causes a new tag to be created via the auto-tag job in .github/workflows/release-please.yml. So as soon as `v3` is created, there will be a tag that is `v3.0.0-rc.1`. +Release-candidate tags (e.g. `v5.0.0-rc.1`) are pushed against the release branch to publish artifacts. Pick the next `rc.N` by checking existing tags for the same version, and tag the exact release-branch commit that should be tested. Each `rc` tag causes ci3.yml to run, and creates releases because it runs `bootstrap.sh ci-nightly`. @@ -60,9 +60,9 @@ It deploys the following networks: - staging-public, which is used to test changes before releasing to testnet - staging-ignition, which is use to test changes before releasing to mainnet -Release-please has been configured on `v2`. When the release-please PR is merged, it creates a clean tag at the next minor version. +A clean release tag at the next minor version (e.g. `v2.0.4`) is pushed against `v2` to publish a release. -For example, at the time of writing, we are at `v2.0.3-rc.4`. When the release please PR is merged, it will create a tag `v2.0.4`. +For example, at the time of writing, we are at `v2.0.3-rc.4`. Pushing the `v2.0.4` tag creates the next release. This will cause ci3.yml to run a release, and then deploy-staging-networks.yml to run and deploy the two networks mentioned above as well as `testnet`. @@ -72,7 +72,7 @@ If you are fixing a bug in production, send it into `v2` first. If you are doing something in `next` we would like in production, you can use the `backport-to-v2` label. -If your change produces new rollup contract addresses or VKs (and so would require a governance upgrade on testnet/mainnet), manually bump the minor version in `.release-please-manifest.json`; e.g., we would presently go to `2.1.0`. We're investigating ways to automate this. +If your change produces new rollup contract addresses or VKs (and so would require a governance upgrade on testnet/mainnet), manually bump the minor version in the root `VERSION` file before tagging the release. ### v3 (planned) @@ -80,12 +80,18 @@ Will be cut when we are ready to start testing release candidates for the alpha ## manual releases -One can side-step Release Please automation by updating the version number in the root `.release-please-manifest.json`, committing, tagging the repository with e.g. `v1.2.3`, checking out the tag, and running: +One can cut a release manually by updating the version number in the root `VERSION` file, committing, tagging the repository with e.g. `v1.2.3`, checking out the tag, and running: ``` ./bootstrap.sh release ``` +Before pushing a final public release tag, update release-facing docs explicitly: + +- Run `/updating-changelog` and update migration notes plus the operator changelog for the branch/version being released. +- Run `/release-docs` for developer + network docs, or `/release-network-docs` for network-only releases. +- Ensure GitHub release notes are written or generated for the pushed tag; there is no longer an automated release PR that maintains them. + ## release image Aztec is released as a _single_ mono-container. That is, everything we need to ship should end up in `aztecprotocol/aztec` and published to Dockerhub with version tags. diff --git a/yarn-project/pxe/scripts/generate_package_info.js b/yarn-project/pxe/scripts/generate_package_info.js index 206317bdfe86..9931d047eb00 100644 --- a/yarn-project/pxe/scripts/generate_package_info.js +++ b/yarn-project/pxe/scripts/generate_package_info.js @@ -5,8 +5,7 @@ import { fileURLToPath } from 'url'; const currentDir = dirname(fileURLToPath(import.meta.url)); const { name } = JSON.parse(readFileSync(join(currentDir, '../package.json'))); -const versionManifest = JSON.parse(readFileSync(join(currentDir, '../../../.release-please-manifest.json'))); -const version = versionManifest['.']; +const version = readFileSync(join(currentDir, '../../../VERSION'), 'utf-8').trim(); writeFileSync( join(currentDir, '../src/config/package_info.ts'), diff --git a/yarn-project/telemetry-client/src/otel_resource.ts b/yarn-project/telemetry-client/src/otel_resource.ts index 177b13815d3f..c712b5d0e75c 100644 --- a/yarn-project/telemetry-client/src/otel_resource.ts +++ b/yarn-project/telemetry-client/src/otel_resource.ts @@ -1,3 +1,4 @@ +import { getPackageVersion } from '@aztec/stdlib/update-checker'; import { type DetectorSync, type IResource, @@ -8,20 +9,13 @@ import { serviceInstanceIdDetectorSync, } from '@opentelemetry/resources'; import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; -import { readFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; import { AZTEC_NODE_ROLE, AZTEC_REGISTRY_ADDRESS, AZTEC_ROLLUP_ADDRESS, AZTEC_ROLLUP_VERSION } from './attributes.js'; -/** Reads the Aztec client version from the release manifest. */ +/** Reads the Aztec client version from the package-local version source. */ function getAztecVersion(): string | undefined { try { - const releasePleasePath = resolve( - dirname(fileURLToPath(import.meta.url)), - '../../../.release-please-manifest.json', - ); - return JSON.parse(readFileSync(releasePleasePath, 'utf-8'))['.']; + return getPackageVersion(); } catch { return undefined; }