diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ea44d0a9c..08142a25e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -122,12 +122,17 @@ jobs: exit 1; esac - echo -e "project-dir=$PROJECT_DIR" >> $GITHUB_OUTPUT - echo -e "is-rust-project=$IS_RUST_PROJECT" >> $GITHUB_OUTPUT - echo -e "is-js-project=$IS_JS_PROJECT" >> $GITHUB_OUTPUT - echo -e "artifacts-glob=$ARTIFACTS_GLOB" >> $GITHUB_OUTPUT - echo -e "artifact-name=$ARTIFACT_NAME" >> $GITHUB_OUTPUT - echo -e "next-release-tag=${PROJECT}-v${NEXT_VERSION}" >> $GITHUB_OUTPUT + export IS_PRERELEASE=$(node scripts/semver-is-prerelease.mjs $NEXT_VERSION); + echo -e "is-prerelease=$IS_PRERELEASE" >> $GITHUB_OUTPUT; + export PRERELEASE_TAG=$(node scripts/semver-get-prerelease.mjs $NEXT_VERSION); + echo -e "prerelease-tag=$PRERELEASE_TAG" >> $GITHUB_OUTPUT; + + echo -e "project-dir=$PROJECT_DIR" >> $GITHUB_OUTPUT; + echo -e "is-rust-project=$IS_RUST_PROJECT" >> $GITHUB_OUTPUT; + echo -e "is-js-project=$IS_JS_PROJECT" >> $GITHUB_OUTPUT; + echo -e "artifacts-glob=$ARTIFACTS_GLOB" >> $GITHUB_OUTPUT; + echo -e "artifact-name=$ARTIFACT_NAME" >> $GITHUB_OUTPUT; + echo -e "next-release-tag=${PROJECT}-v${NEXT_VERSION}" >> $GITHUB_OUTPUT; pack-crate-release: if: ${{ needs.meta.outputs.is-rust-project == 'true' }} @@ -294,6 +299,11 @@ jobs: - meta - test-npm-release steps: + # NOTE: we need to checkout to pull npmrc + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + sparse-checkout: | + .npmrc - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: artifacts @@ -304,12 +314,18 @@ jobs: shell: bash run: | export PACKAGE_DIR=${{ github.workspace }}/artifacts/${{ needs.meta.outputs.project }}/${{ needs.meta.outputs.artifact-name }} + export OPT_DRY_RUN="--dry-run" if [ "tag" == "${{ github.ref_type }}" ]; then export OPT_DRY_RUN=""; fi - npm publish $OPT_DRY_RUN $PACKAGE_DIR + export OPT_RELEASE_TAG="" + if [ "true" == "${{ needs.project-meta.outputs.is-prerelease }}" ]; then + export OPT_RELEASE_TAG="--tag ${{ needs.project-meta.outputs.prerelease-tag }}"; + fi + + npm publish $OPT_DRY_RUN $OPT_RELEASE_TAG $PACKAGE_DIR create-gh-release: runs-on: ubuntu-24.04 @@ -341,7 +357,8 @@ jobs: run: | git cliff \ --repository=${{ github.workspace }}/.git \ - --tag=${{ needs.meta.outputs.next-release-tag }} > CHANGELOG.current + --latest \ + --tag ${{ needs.meta.outputs.next-release-tag }} > CHANGELOG.current - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: diff --git a/scripts/semver-get-prerelease.mjs b/scripts/semver-get-prerelease.mjs new file mode 100644 index 000000000..4306b1e3e --- /dev/null +++ b/scripts/semver-get-prerelease.mjs @@ -0,0 +1,22 @@ +import { stdout, argv } from "node:process"; + +import semver from "semver"; + +async function main() { + let version = argv[2]; + if (version?.startsWith("v")) { + version = version.slice(1); + } + if (!version || !semver.valid(version)) { + throw new Error("Missing/invalid semver value"); + } + + let p = semver.prerelease(version); + if (!p) { + stdout.write(""); + return; + } + stdout.write(`${p[0]}`); +} + +await main(); diff --git a/scripts/semver-is-prerelease.mjs b/scripts/semver-is-prerelease.mjs new file mode 100644 index 000000000..03baa0e50 --- /dev/null +++ b/scripts/semver-is-prerelease.mjs @@ -0,0 +1,18 @@ +import { stdout, argv } from "node:process"; + +import semver from "semver"; + +async function main() { + let version = argv[2]; + if (version?.startsWith("v")) { + version = version.slice(1); + } + if (!version || !semver.valid(version)) { + throw new Error("Missing/invalid semver value"); + } + + let isPrerelease = semver.prerelease(version) !== null; + stdout.write(`${isPrerelease}`); +} + +await main();