From 04c3d62275167465e6760c2d0d0d60c2bf9b4f66 Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Sun, 20 Sep 2026 23:16:44 -0400 Subject: [PATCH 1/2] fix: serialize per-package releases in release.yml Releasing "all" fanned the matrix job out in parallel, so the 2nd and 3rd release-it runs would race to commit/push their version bump to main from the same starting commit and likely fail non-fast-forward. Add max-parallel: 1 to serialize them, plus a workflow-level concurrency group so two manual release runs can't overlap either. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b35468..7dbb1a4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,6 +38,10 @@ on: env: NPM_CONFIG_PROVENANCE: true +concurrency: + group: release + cancel-in-progress: false + jobs: prepare: runs-on: ubuntu-latest @@ -56,6 +60,7 @@ jobs: needs: prepare strategy: fail-fast: false + max-parallel: 1 matrix: package: ${{ fromJson(needs.prepare.outputs.packages) }} runs-on: ubuntu-latest From 7aa14d54bb818ae6f3d349c44c0fe3d2f7b8b39b Mon Sep 17 00:00:00 2001 From: dprevost-perso Date: Mon, 21 Sep 2026 06:11:20 -0400 Subject: [PATCH 2/2] feat: add dry-run and per-package change detection to release workflow Auto-skip unchanged packages when releasing "all"; picking one driver still forces its release regardless of changes. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/release.yml | 43 +++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7dbb1a4..1bc9143 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: driver: - description: "Which driver to release" + description: 'Which driver to release ("all" only releases packages changed since their last tag; picking one forces its release)' required: true type: choice default: "all" @@ -34,6 +34,14 @@ on: options: - "yes" - "no" + dryRun: + description: Simulate the release (no git push, no GitHub release, no npm publish) + required: true + type: choice + default: "no" + options: + - "yes" + - "no" env: NPM_CONFIG_PROVENANCE: true @@ -48,10 +56,37 @@ jobs: outputs: packages: ${{ steps.set.outputs.packages }} steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + ref: 'main' + fetch-depth: 0 + fetch-tags: true - id: set + # driver=all: auto-detect which packages changed since their last release tag + # and only release those (a package with no prior tag is always included). + # A specific driver is an explicit choice, so it's always released ("force"). run: | if [ "${{ inputs.driver }}" = "all" ]; then - echo 'packages=["packages/node-edgedriver","packages/node-geckodriver","packages/node-safaridriver"]' >> "$GITHUB_OUTPUT" + packages=() + for name in edgedriver geckodriver safaridriver; do + dir="packages/node-${name}" + last_tag=$(git tag -l "${name}@*" --sort=-v:refname | head -n1) + if [ -z "$last_tag" ]; then + echo "$name: no previous release tag, including" + packages+=("$dir") + elif ! git diff --quiet "$last_tag"..HEAD -- "$dir"; then + echo "$name: changes since $last_tag, including" + packages+=("$dir") + else + echo "$name: no changes since $last_tag, skipping" + fi + done + if [ ${#packages[@]} -eq 0 ]; then + packages_json="[]" + else + packages_json=$(printf '%s\n' "${packages[@]}" | jq -R . | jq -sc .) + fi + echo "packages=$packages_json" >> "$GITHUB_OUTPUT" else echo 'packages=["packages/node-${{ inputs.driver }}"]' >> "$GITHUB_OUTPUT" fi @@ -94,13 +129,13 @@ jobs: # publishing (requires id-token: write + a trusted publisher configured # for this package on npmjs.com) working-directory: ${{ matrix.package }} - run: npx release-it ${{ inputs.releaseType }} --github.release --ci --npm.skipChecks --no-git.requireCleanWorkingDir --npm.tag=${{ inputs.distTag }} + run: npx release-it ${{ inputs.releaseType }} --github.release --ci --npm.skipChecks --no-git.requireCleanWorkingDir --npm.tag=${{ inputs.distTag }} ${{ inputs.dryRun == 'yes' && '--dry-run' || '' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: ${{ inputs.preRelease == 'no' }} - name: Pre-Release working-directory: ${{ matrix.package }} - run: npx release-it ${{ inputs.releaseType }} --github.release --ci --npm.skipChecks --no-git.requireCleanWorkingDir --preRelease=alpha --github.preRelease --npm.tag=next + run: npx release-it ${{ inputs.releaseType }} --github.release --ci --npm.skipChecks --no-git.requireCleanWorkingDir --preRelease=alpha --github.preRelease --npm.tag=next ${{ inputs.dryRun == 'yes' && '--dry-run' || '' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: ${{ inputs.preRelease == 'yes' }}