diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b8159b6bb..8f57dc674 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -88,8 +88,55 @@ jobs: semver_string: ${{ github.ref_name }} semver_pattern: '^release/(.*)$' - - name: update nextBump (release) + - name: Check version-policy version (release) if: startsWith(github.ref_name, 'release/') + id: release_version_policy + env: + RELEASE_VERSION: ${{ steps.semver_release.outputs.full }} + run: | + node <<'NODE' + const fs = require('fs'); + const policies = JSON.parse(fs.readFileSync('common/config/rush/version-policies.json', 'utf8')); + const policyVersion = policies[0] && policies[0].version; + const releaseVersion = process.env.RELEASE_VERSION; + + const parseVersion = version => String(version).split('-')[0].split('.').map(Number); + const compareVersion = (a, b) => { + const av = parseVersion(a); + const bv = parseVersion(b); + for (let i = 0; i < Math.max(av.length, bv.length); i++) { + const diff = (av[i] || 0) - (bv[i] || 0); + if (diff !== 0) { + return diff; + } + } + return 0; + }; + + if (!releaseVersion || !policyVersion) { + console.error('Missing release version or version-policy version.', { releaseVersion, policyVersion }); + process.exit(1); + } + + const result = compareVersion(releaseVersion, policyVersion); + if (result < 0) { + console.error( + `Release version ${releaseVersion} is lower than version-policy version ${policyVersion}.` + ); + process.exit(1); + } + + const shouldSkip = result === 0 ? 'true' : 'false'; + fs.appendFileSync(process.env.GITHUB_OUTPUT, `skip_next_bump=${shouldSkip}\n`); + console.log( + result === 0 + ? `Release version ${releaseVersion} equals version-policy version ${policyVersion}, skip nextBump update.` + : `Release version ${releaseVersion} is greater than version-policy version ${policyVersion}, update nextBump.` + ); + NODE + + - name: update nextBump (release) + if: startsWith(github.ref_name, 'release/') && steps.release_version_policy.outputs.skip_next_bump != 'true' uses: xile611/set-next-bump-of-rush@main with: release_version: ${{ steps.semver_release.outputs.full }} @@ -309,8 +356,23 @@ jobs: echo "Build packages: ${package_names[*]}" node common/scripts/install-run-rush.js build "${build_args[@]}" - - name: Publish to npm (release) + - name: Check npm version (release) if: startsWith(github.ref_name, 'release/') + id: npm_version_release + env: + PACKAGE_VERSION: ${{ steps.semver_release.outputs.main }} + run: | + set -euo pipefail + if npm view "@visactor/vtable@$PACKAGE_VERSION" version --registry=https://registry.npmjs.org >/dev/null 2>&1; then + echo "Version $PACKAGE_VERSION already exists on npm, skip publish." + echo "skip_publish=true" >> "$GITHUB_OUTPUT" + else + echo "Version $PACKAGE_VERSION does not exist on npm, continue publish." + echo "skip_publish=false" >> "$GITHUB_OUTPUT" + fi + + - name: Publish to npm (release) + if: startsWith(github.ref_name, 'release/') && steps.npm_version_release.outputs.skip_publish != 'true' run: node common/scripts/install-run-rush.js publish --publish --include-all --tag latest - name: Update shrinkwrap