From 3c25806efebcb7fd05ba1466486585f258001e37 Mon Sep 17 00:00:00 2001 From: Naor Peled Date: Sat, 9 Aug 2025 21:27:38 +0300 Subject: [PATCH] ci(publish): add manual trigger and retry logic for npm publish --- .github/workflows/publish.yml | 43 +++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b9dee4f..1e16464 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,6 +4,13 @@ on: # This job runs when a new release is published release: types: [published] + # Manual trigger with version input + workflow_dispatch: + inputs: + version: + description: "Version to release (e.g., 2.12.1)" + required: true + type: string jobs: release: @@ -13,16 +20,44 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 12.16.3 + registry-url: "https://registry.npmjs.org" - uses: actions/cache@v4 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }} - # Store the name of the release - # See https://stackoverflow.com/questions/58177786/get-the-current-pushed-tag-in-github-actions - - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + # Store the release version (from release tag or manual input) + - name: Set release version + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "RELEASE_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV + echo "Manual release triggered for version: ${{ github.event.inputs.version }}" + else + echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + echo "Release triggered from tag: ${GITHUB_REF#refs/*/}" + fi - run: npm ci - run: npm version $RELEASE_VERSION --no-git-tag-version - run: npm run build - - run: npm publish --access public + - name: Publish to npm with retry + run: | + max_attempts=5 + attempt=1 + while [ $attempt -le $max_attempts ]; do + echo "Attempt $attempt of $max_attempts..." + if npm publish --access public; then + echo "Successfully published!" + break + else + if [ $attempt -eq $max_attempts ]; then + echo "Failed to publish after $max_attempts attempts" + exit 1 + fi + echo "Publish failed, waiting before retry..." + sleep_time=$((attempt * 30)) + echo "Waiting ${sleep_time} seconds before retry..." + sleep $sleep_time + attempt=$((attempt + 1)) + fi + done env: NODE_AUTH_TOKEN: ${{ secrets.BOWSER_NPM_PUBLISH_TOKEN }}