From d5e75b7cea061ce9cd24d91f0f704f9a78f93ab3 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 16 Jun 2026 21:49:04 +0000 Subject: [PATCH 1/3] ci: migrate release automation to release-please (Phase 1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements the release-please flow from ADR-0002 and the Phase 1 P0 tag subset from ADR-0003, reworking the in-flight Semantic Release draft (#107) into release-please. - add release-please-config.json (simple release type, v-prefixed tags) - add .release-please-manifest.json seeded at 8.0.0 to continue the existing major line under project semver (vX.Y.Z) - add .github/workflows/release-please.yml — maintains the Release PR and creates the GitHub release + version tag on merge - migrate .github/workflows/release.yml to trigger on the vX.Y.Z tag and publish the Phase 1 tag subset: fully-pinned vX.Y.Z_tf-A.B.C_aws-D.E.F (every combination) plus vX.Y.Z and latest on the latest bundled combination; the manual release trigger is removed Out of scope (Phase 3): edge / floating vX.Y tags, GHCR, the zenika->bgauduch rename and docker/login-action migration. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01YDmRomapTbonHPFwnU61zR --- .github/workflows/release-please.yml | 32 +++++++++++++++++ .github/workflows/release.yml | 52 ++++++++++++++++++++++++---- .release-please-manifest.json | 3 ++ release-please-config.json | 15 ++++++++ 4 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/release-please.yml create mode 100644 .release-please-manifest.json create mode 100644 release-please-config.json diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..6a8ef7e --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,32 @@ +name: release-please + +# Versioning, changelog and GitHub releases (ADR-0002). +# +# On every push to master, release-please maintains a "Release PR" that bumps +# the project version (from Conventional Commits) and updates CHANGELOG.md. +# Merging that Release PR creates the GitHub release and the project version +# tag (vX.Y.Z), which in turn triggers release.yml to build & push the images +# (tag strategy: ADR-0003). +# +# NOTE: the tag must be created with a Personal Access Token (RELEASE_PLEASE_TOKEN), +# not the default GITHUB_TOKEN — tags pushed by GITHUB_TOKEN do not trigger other +# workflows (here: release.yml). See repo secrets / CONTRIBUTING. + +on: + push: + branches: + - master + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-22.04 + steps: + - uses: googleapis/release-please-action@v4 + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + config-file: release-please-config.json + manifest-file: .release-please-manifest.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 494c841..f94ec78 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,9 +1,19 @@ name: release -# trigger on published release +# Build & publish the release images when release-please publishes a project +# version tag (vX.Y.Z). Versioning, changelog and the GitHub release itself are +# handled by release-please (.github/workflows/release-please.yml). The previous +# manual "published release" trigger is removed (ADR-0002). +# +# Tag strategy — Phase 1 P0 subset (ADR-0003): +# - vX.Y.Z_tf-A.B.C_aws-D.E.F immutable, fully-pinned (every combination) +# - vX.Y.Z project version (latest bundled combination) +# - latest latest bundled combination +# (edge, floating vX.Y and GHCR come in Phase 3.) on: - release: - types: [published] + push: + tags: + - "v*.*.*" jobs: load_supported_versions: @@ -37,8 +47,18 @@ jobs: - name: Check out the repo uses: actions/checkout@v3 - - name: Get and save the release tag - run: echo "RELEASE_TAG=${GITHUB_REF##*/}" >> $GITHUB_ENV + - name: Get the release version from the tag + run: echo "RELEASE_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV + + - name: Determine if this is the latest version combination + run: | + LATEST_TF=$(jq -r '.tf_versions | sort | .[-1]' supported_versions.json) + LATEST_AWS=$(jq -r '.awscli_versions | sort | .[-1]' supported_versions.json) + if [ "${{ matrix.tf_versions }}" = "${LATEST_TF}" ] && [ "${{ matrix.awscli_versions }}" = "${LATEST_AWS}" ]; then + echo "IS_LATEST=true" >> $GITHUB_ENV + else + echo "IS_LATEST=false" >> $GITHUB_ENV + fi - name: Login to Docker Hub registry run: echo '${{ secrets.DOCKERHUB_PAT }}' | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin @@ -49,7 +69,22 @@ jobs: - name: Set up Buildx uses: docker/setup-buildx-action@v2 - - name: Build and push container images + - name: Build and push image (pinned combination) + if: env.IS_LATEST != 'true' + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386 + build-args: | + TERRAFORM_VERSION=${{ matrix.tf_versions }} + AWS_CLI_VERSION=${{ matrix.awscli_versions }} + tags: ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }}_tf-${{ matrix.tf_versions }}_aws-${{ matrix.awscli_versions }} + push: true + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build and push image (latest combination) + if: env.IS_LATEST == 'true' uses: docker/build-push-action@v4 with: context: . @@ -57,7 +92,10 @@ jobs: build-args: | TERRAFORM_VERSION=${{ matrix.tf_versions }} AWS_CLI_VERSION=${{ matrix.awscli_versions }} - tags: zenika/terraform-aws-cli:release-${{ env.RELEASE_TAG }}_terraform-${{ matrix.tf_versions }}_awscli-${{ matrix.awscli_versions }} + tags: | + ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }}_tf-${{ matrix.tf_versions }}_aws-${{ matrix.awscli_versions }} + ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }} + ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:latest push: true cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..32ac658 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "8.0.0" +} diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..d643b0b --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "simple", + "package-name": "terraform-aws-cli", + "changelog-path": "CHANGELOG.md", + "include-v-in-tag": true, + "include-component-in-tag": false, + "bump-minor-pre-major": false, + "draft": false, + "prerelease": false + } + } +} From abca5b4b1c9ce2e0a710ca186c454bee2259c02f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 17:43:56 +0000 Subject: [PATCH 2/3] ci: fold release build/push into release-please workflow (Phase 1) Switch to a single release-please.yml workflow: the image build/push matrix runs in the same workflow, gated on the release-please `release_created` output. This drops the separate tag-triggered release.yml and removes the need for a Personal Access Token (tags pushed by GITHUB_TOKEN do not trigger other workflows), fitting the low-friction driver of ADR-0002. - combine build/push (Phase 1 P0 tags from ADR-0003) into release-please.yml - delete .github/workflows/release.yml - README: point the release badge to release-please.yml - roadmap + ADR-0002: amend the mechanism wording (decision unchanged) Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01YDmRomapTbonHPFwnU61zR --- .github/workflows/release-please.yml | 103 ++++++++++++++++-- .github/workflows/release.yml | 101 ----------------- README.md | 2 +- .../0002-contribution-and-release-workflow.md | 14 ++- docs/roadmap.md | 2 +- 5 files changed, 107 insertions(+), 115 deletions(-) delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 6a8ef7e..2d3811b 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -1,16 +1,14 @@ name: release-please -# Versioning, changelog and GitHub releases (ADR-0002). +# Single release workflow (ADR-0002, ADR-0003). # # On every push to master, release-please maintains a "Release PR" that bumps # the project version (from Conventional Commits) and updates CHANGELOG.md. -# Merging that Release PR creates the GitHub release and the project version -# tag (vX.Y.Z), which in turn triggers release.yml to build & push the images -# (tag strategy: ADR-0003). -# -# NOTE: the tag must be created with a Personal Access Token (RELEASE_PLEASE_TOKEN), -# not the default GITHUB_TOKEN — tags pushed by GITHUB_TOKEN do not trigger other -# workflows (here: release.yml). See repo secrets / CONTRIBUTING. +# Merging that Release PR creates the GitHub release + the project version tag +# (vX.Y.Z); the build/push jobs below are gated on that release and publish the +# images. No separate release.yml and no Personal Access Token are needed — the +# build is wired in-workflow on the `release_created` output, so the default +# GITHUB_TOKEN (plus the existing DockerHub secrets) is enough. on: push: @@ -24,9 +22,94 @@ permissions: jobs: release-please: runs-on: ubuntu-22.04 + outputs: + release_created: ${{ steps.release.outputs['.--release_created'] }} + tag_name: ${{ steps.release.outputs['.--tag_name'] }} steps: - - uses: googleapis/release-please-action@v4 + - id: release + uses: googleapis/release-please-action@v4 with: - token: ${{ secrets.RELEASE_PLEASE_TOKEN }} config-file: release-please-config.json manifest-file: .release-please-manifest.json + + load_supported_versions: + needs: release-please + if: needs.release-please.outputs.release_created == 'true' + runs-on: ubuntu-22.04 + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Save supported versions as output + id: set-matrix + run: | + VERSIONS=$(cat ./supported_versions.json | jq -c) + echo "matrix=${VERSIONS}" >> $GITHUB_OUTPUT + + build_push_release: + needs: [release-please, load_supported_versions] + runs-on: ubuntu-22.04 + + strategy: + matrix: ${{ fromJSON(needs.load_supported_versions.outputs.matrix) }} + + env: + ORGANIZATION: "zenika" + IMAGE_NAME: "terraform-aws-cli" + RELEASE_VERSION: ${{ needs.release-please.outputs.tag_name }} + + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Determine if this is the latest version combination + run: | + LATEST_TF=$(jq -r '.tf_versions | sort | .[-1]' supported_versions.json) + LATEST_AWS=$(jq -r '.awscli_versions | sort | .[-1]' supported_versions.json) + if [ "${{ matrix.tf_versions }}" = "${LATEST_TF}" ] && [ "${{ matrix.awscli_versions }}" = "${LATEST_AWS}" ]; then + echo "IS_LATEST=true" >> $GITHUB_ENV + else + echo "IS_LATEST=false" >> $GITHUB_ENV + fi + + - name: Login to Docker Hub registry + run: echo '${{ secrets.DOCKERHUB_PAT }}' | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push image (pinned combination) + if: env.IS_LATEST != 'true' + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386 + build-args: | + TERRAFORM_VERSION=${{ matrix.tf_versions }} + AWS_CLI_VERSION=${{ matrix.awscli_versions }} + tags: ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }}_tf-${{ matrix.tf_versions }}_aws-${{ matrix.awscli_versions }} + push: true + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build and push image (latest combination) + if: env.IS_LATEST == 'true' + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386 + build-args: | + TERRAFORM_VERSION=${{ matrix.tf_versions }} + AWS_CLI_VERSION=${{ matrix.awscli_versions }} + tags: | + ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }}_tf-${{ matrix.tf_versions }}_aws-${{ matrix.awscli_versions }} + ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }} + ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:latest + push: true + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index f94ec78..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: release - -# Build & publish the release images when release-please publishes a project -# version tag (vX.Y.Z). Versioning, changelog and the GitHub release itself are -# handled by release-please (.github/workflows/release-please.yml). The previous -# manual "published release" trigger is removed (ADR-0002). -# -# Tag strategy — Phase 1 P0 subset (ADR-0003): -# - vX.Y.Z_tf-A.B.C_aws-D.E.F immutable, fully-pinned (every combination) -# - vX.Y.Z project version (latest bundled combination) -# - latest latest bundled combination -# (edge, floating vX.Y and GHCR come in Phase 3.) -on: - push: - tags: - - "v*.*.*" - -jobs: - load_supported_versions: - runs-on: ubuntu-22.04 - - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} - - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - - name: Save supported versions as output - id: set-matrix - run: | - VERSIONS=$(cat ./supported_versions.json | jq -c) - echo "matrix=${VERSIONS}" >> $GITHUB_OUTPUT - - build_push_release: - runs-on: ubuntu-22.04 - needs: load_supported_versions - - strategy: - matrix: ${{ fromJSON(needs.load_supported_versions.outputs.matrix) }} - - env: - ORGANIZATION: "zenika" - IMAGE_NAME: "terraform-aws-cli" - - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - - name: Get the release version from the tag - run: echo "RELEASE_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV - - - name: Determine if this is the latest version combination - run: | - LATEST_TF=$(jq -r '.tf_versions | sort | .[-1]' supported_versions.json) - LATEST_AWS=$(jq -r '.awscli_versions | sort | .[-1]' supported_versions.json) - if [ "${{ matrix.tf_versions }}" = "${LATEST_TF}" ] && [ "${{ matrix.awscli_versions }}" = "${LATEST_AWS}" ]; then - echo "IS_LATEST=true" >> $GITHUB_ENV - else - echo "IS_LATEST=false" >> $GITHUB_ENV - fi - - - name: Login to Docker Hub registry - run: echo '${{ secrets.DOCKERHUB_PAT }}' | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Buildx - uses: docker/setup-buildx-action@v2 - - - name: Build and push image (pinned combination) - if: env.IS_LATEST != 'true' - uses: docker/build-push-action@v4 - with: - context: . - platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386 - build-args: | - TERRAFORM_VERSION=${{ matrix.tf_versions }} - AWS_CLI_VERSION=${{ matrix.awscli_versions }} - tags: ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }}_tf-${{ matrix.tf_versions }}_aws-${{ matrix.awscli_versions }} - push: true - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Build and push image (latest combination) - if: env.IS_LATEST == 'true' - uses: docker/build-push-action@v4 - with: - context: . - platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386 - build-args: | - TERRAFORM_VERSION=${{ matrix.tf_versions }} - AWS_CLI_VERSION=${{ matrix.awscli_versions }} - tags: | - ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }}_tf-${{ matrix.tf_versions }}_aws-${{ matrix.awscli_versions }} - ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:${{ env.RELEASE_VERSION }} - ${{ env.ORGANIZATION }}/${{ env.IMAGE_NAME }}:latest - push: true - cache-from: type=gha - cache-to: type=gha,mode=max diff --git a/README.md b/README.md index 68d7af0..0795670 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![lint-dockerfile](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/lint-dockerfile.yml/badge.svg)](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/lint-dockerfile.yml) [![build-test](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/build-test.yml/badge.svg)](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/build-test.yml) [![push-latest](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/push-latest.yml/badge.svg)](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/push-latest.yml) -[![release](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/release.yml/badge.svg)](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/release.yml) +[![release-please](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/release-please.yml/badge.svg)](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/release-please.yml) [![dockerhub-description-update](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/dockerhub-description-update.yml/badge.svg)](https://github.com/zenika-open-source/terraform-aws-cli/actions/workflows/dockerhub-description-update.yml) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) diff --git a/docs/adr/0002-contribution-and-release-workflow.md b/docs/adr/0002-contribution-and-release-workflow.md index e047960..ac1d5ac 100644 --- a/docs/adr/0002-contribution-and-release-workflow.md +++ b/docs/adr/0002-contribution-and-release-workflow.md @@ -33,8 +33,11 @@ Adopted as one interlocking workflow: subject and feeds the changelog. Squash default message = *Pull request title and description* (carries `BREAKING CHANGE:` footers for release-please). - **release-please** drives versioning, changelog and GitHub releases via a - Release PR; `release.yml` triggers on Release-PR merge. The manual release - flow is removed. + Release PR. Merging that Release PR is the release trigger; the image + build/push runs in the **same `release-please.yml` workflow**, gated on the + `release_created` output (no separate `release.yml`, no Personal Access + Token — the default `GITHUB_TOKEN` suffices). The manual release flow is + removed. - Optional opt-in local `.githooks/commit-msg` running commitlint in Docker. - **Renovate only**; `.github/dependabot.yml` is retired. @@ -56,3 +59,10 @@ Tag strategy is decided separately in ADR-0003. > **Amended 2026-06-15/16** — recorded the squash default commit message > (*Pull request title and description*). Clarification, not a reversal. +> +> **Amended 2026-06-17** — the build/push runs inside the single +> `release-please.yml` workflow gated on `release_created`, rather than a +> separate tag-triggered `release.yml`. This avoids a Personal Access Token +> (tags pushed by `GITHUB_TOKEN` do not trigger other workflows) and fits the +> low-friction driver. Mechanism clarification; the decision (release-please, +> Release-PR trigger) is unchanged. diff --git a/docs/roadmap.md b/docs/roadmap.md index fcf873a..cf1fdb3 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -155,7 +155,7 @@ The contribution + release machinery. May split into 1a (governance docs) and - `CONTRIBUTING.md`, `SECURITY.md`, `CODEOWNERS` *(#105)* - `.github/PULL_REQUEST_TEMPLATE.md` (ADR checkbox) + `.github/ISSUE_TEMPLATE/` (`bug.yml`, `bump-version.yml`, `feature.yml`) *(#105)* - `.commitlintrc.json` + `.github/workflows/commitlint.yml` validating each PR commit **and** the PR title; **strict** failure mode *(#101)* -- **release-please** config + workflow; migrate `release.yml` to trigger on Release-PR merge; remove the manual release flow *(#101)* +- **release-please** config + a single `release-please.yml` workflow (versioning/changelog/GitHub release, with the image build/push gated on the Release-PR merge via the `release_created` output); remove the manual release flow *(#101)* - Branch protection applied via the GitHub UI (squash-merge, required review) - Tag strategy applied — P0 subset (`latest`, `vX.Y.Z`, fully-pinned) - **Retire `.github/dependabot.yml`; extend `renovate.json`** (grouping, automerge patches, `chore(deps):` prefix, custom manager for `supported_versions.json`) *(#102, relates #20)* From af65aefea6d961a87340e27f8b8ad0d0b02d6bc1 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 18:07:12 +0000 Subject: [PATCH 3/3] fix: correct release-please root outputs and bound first release Verified against the release-please-action docs: - root-component outputs are NOT path-prefixed; use steps.release.outputs.release_created / tag_name (the prior ".--"-prefixed form would have been empty, so build/push never ran) - add bootstrap-sha (8.0 release commit) so the first managed release only rolls up commits since the last published release instead of the whole history; manifest stays seeded at the current version (8.0.0) Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01YDmRomapTbonHPFwnU61zR --- .github/workflows/release-please.yml | 4 ++-- release-please-config.json | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 2d3811b..7367a4a 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -23,8 +23,8 @@ jobs: release-please: runs-on: ubuntu-22.04 outputs: - release_created: ${{ steps.release.outputs['.--release_created'] }} - tag_name: ${{ steps.release.outputs['.--tag_name'] }} + release_created: ${{ steps.release.outputs.release_created }} + tag_name: ${{ steps.release.outputs.tag_name }} steps: - id: release uses: googleapis/release-please-action@v4 diff --git a/release-please-config.json b/release-please-config.json index d643b0b..f09c98d 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,5 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "bootstrap-sha": "d99846edd4221248f023fc07945d8eb0e342bf01", "packages": { ".": { "release-type": "simple",