Skip to content

Commit

Permalink
Test version validation
Browse files Browse the repository at this point in the history
  • Loading branch information
rbuckton committed Oct 24, 2022
1 parent 3d0a54a commit b6ea145
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 36 deletions.
107 changes: 71 additions & 36 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@ on:
description: Version number to publish
required: true
type: string
default: 1.0.0-dev.0
default: 1.1.0-alpha
dist_tag:
description: npm dist-tag
required: true
type: choice
default: dev
default: "<auto>"
options:
- latest
- "<auto>"
- next
- nightly
- dev
- beta
- rc
- latest
force_publish:
description: force publish all packages
required: false
Expand All @@ -39,6 +40,9 @@ jobs:
version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.validate.outputs.version }}
dist_tag: ${{ steps.validate.outputs.dist_tag }}
prerelease: ${{ steps.validate.outputs.prerelease }}
changed_files: ${{ steps.detect_changes.outputs.changed_files }}
changed_packages: ${{ steps.detect_changes.outputs.changed_packages }}
steps:
Expand All @@ -50,10 +54,20 @@ jobs:
node-version: 16
registry-url: 'https://registry.npmjs.org'
cache: 'yarn'

- name: validate
id: validate
env:
VERSION_SPEC: ${{ inputs.version }}
DIST_TAG: ${{ inputs.dist_tag }}
PRERELEASE: ${{ inputs.prerelease }}
run: |
node scripts/validate-version.js
- name: yarn install
run: yarn install --ignore-scripts --non-interactive
- name: lerna version
run: lerna version ${{ inputs.version }} --no-git-tag-version --no-push --yes $([ ${{inputs.force_publish }} == true ] && echo "--force-publish")
run: lerna version ${{ steps.validate.outputs.version }} --no-git-tag-version --no-push --yes $([ ${{inputs.force_publish }} == true ] && echo "--force-publish")
- name: upload version artifacts
uses: actions/upload-artifact@v3
with:
Expand All @@ -64,15 +78,22 @@ jobs:
package.json
lerna.json
yarn.lock
- name: detect changes
id: detect_changes
run: |
CHANGED_FILES=$(git status --porcelain -- package.json lerna.json yarn.lock internal/*/package*.json packages/*/package*.json | cut -c 4-);
CHANGED_FILES_JSON=$(CHANGED_FILES=$CHANGED_FILES node -e 'process.stdout.write(JSON.stringify(process.env.CHANGED_FILES.split(/\n/g).filter(Boolean)))')
CHANGED_FILES_JSON=$(
git status --porcelain -- package.json lerna.json yarn.lock internal/*/package*.json packages/*/package*.json |
cut -c 4- |
node -e 'process.stdout.write(JSON.stringify(fs.readFileSync(0, "utf8").split(/\n/g).filter(Boolean)))'
);
echo "changed_files=$CHANGED_FILES_JSON" >> $GITHUB_OUTPUT;
CHANGED_PACKAGES=$(git status --porcelain -- internal/*/package.json packages/*/package.json | cut -c 4-);
CHANGED_PACKAGES_JSON=$(CHANGED_PACKAGES=$CHANGED_PACKAGES node -e 'process.stdout.write(JSON.stringify(process.env.CHANGED_PACKAGES.split(/\n/g).filter(Boolean).reduce((obj, path) => ({ ...obj, [path]: true }), {})))');
CHANGED_PACKAGES_JSON=$(
git status --porcelain -- internal/*/package.json packages/*/package.json |
cut -c 4- |
node -e 'process.stdout.write(JSON.stringify(fs.readFileSync(0, "utf8").split(/\n/g).filter(Boolean).reduce((obj, path) => ({ ...obj, [path]: true }), {})))'
);
echo "changed_packages=$CHANGED_PACKAGES_JSON" >> $GITHUB_OUTPUT;
native:
Expand Down Expand Up @@ -171,16 +192,19 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0

- uses: actions/setup-node@v3
with:
node-version: 16
registry-url: 'https://registry.npmjs.org'
cache: 'yarn'

- name: version
uses: actions/download-artifact@v3
with:
name: version-artifacts
path: ${{ github.workspace }}

- name: install
run: |
yarn install --ignore-scripts --frozen-lockfile --non-interactive
Expand All @@ -189,13 +213,16 @@ jobs:
pushd node_modules/wasm-opt
node bin/index.js
popd
- name: link
run: lerna link

- name: build
run: |
gulp clean
yarn run prebuild
gulp build
- name: test
run: |
yarn run test --selectProjects "collections-hash ts-worker"
Expand All @@ -204,57 +231,65 @@ jobs:
yarn run test --selectProjects "async-iter-fn async-iter-fromsync async-iter-query iter-fn iter-lookup iter-query"
yarn run test --selectProjects "threading-autoresetevent threading-conditionvariable threading-manualresetevent threading-mutex threading-sleep"
yarn run test --selectProjects "decorators disposable equatable equatable-shim fn fn-partial indexed-object lazy ref reflect-metadata-compat struct-type"
- name: test (esm output)
run: |
yarn run test-esm --selectProjects "async-autoresetevent async-barrier async-conditionvariable async-countdown async-deferred async-manualresetevent async-mutex async-queue async-readerwriterlock async-semaphore async-stack canceltoken"
yarn run test-esm --selectProjects "collections-hash collection-core collection-core-shim collections-hashmap collections-hashset collections-multimap collections-sortedmap collections-sortedset"
yarn run test-esm --selectProjects "async-iter-fn async-iter-fromsync async-iter-query iter-fn iter-lookup iter-query"
yarn run test-esm --selectProjects "threading-autoresetevent threading-conditionvariable threading-manualresetevent threading-mutex threading-sleep"
yarn run test-esm --selectProjects "decorators disposable equatable equatable-shim fn fn-partial indexed-object lazy ref reflect-metadata-compat struct-type"
- name: verify
run: |
gulp verify
node node_modules/workspaces-foreach run prepack
- name: docs
uses: actions/download-artifact@v3
with:
name: docs-artifacts
path: docs

- name: commit and tag version
run: |
git config user.name "GitHub Actions Bot"
git config user.email "<>"
git add -- ${{ join(fromJson(needs.version.outputs.changed_files), ' ') }}
git add -- docs
git commit -m "v${{ inputs.version }}"
git tag -f "v${{ inputs.version }}" -m "v${{ inputs.version }}"
git push --follow-tags --no-verify --atomic origin ${{ github.ref_name }}
# - name: commit and tag version
# run: |
# git config user.name "GitHub Actions Bot"
# git config user.email "<>"
# git add -- ${{ join(fromJson(needs.version.outputs.changed_files), ' ') }}
# git add -- docs
# git commit -m "v${{ needs.version.outputs.version }}"
# git tag -f "v${{ needs.version.outputs.version }}" -m "v${{ needs.version.outputs.version }}"
# git push --follow-tags --no-verify --atomic origin ${{ github.ref_name }}

- name: download native artifacts
uses: actions/download-artifact@v3
with:
name: native-artifacts
path: ${{ github.workspace }}

- name: collect native artifacts
run: |
NATIVE_ARTIFACTS=$(find packages/* internal/* -path '*/*/build/stage/*/*.tar.gz');
NATIVE_ARTIFACTS_JSON=$(NATIVE_ARTIFACTS=$NATIVE_ARTIFACTS node -e 'process.stdout.write(JSON.stringify(process.env.NATIVE_ARTIFACTS.split(/\n/g).filter(Boolean)))');
NATIVE_ARTIFACTS_JSON=$(
find packages/* internal/* -path '*/*/build/stage/*/*.tar.gz' |
node -e 'process.stdout.write(JSON.stringify(fs.readFileSync(0, "utf8").split(/\n/g).filter(Boolean)))'
);
echo "NATIVE_ARTIFACTS<<EOF" >> $GITHUB_ENV
echo $NATIVE_ARTIFACTS_JSON >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: create release
uses: ncipollo/release-action@v1
with:
tag: "v${{ inputs.version }}"
commit: ${{ github.sha }}
draft: ${{ inputs.draft }}
prerelease: ${{ inputs.prerelease }}
artifacts: ${{ join(fromJson(env.NATIVE_ARTIFACTS)) }}
allowUpdates: true
- name: publish
if: ${{ !inputs.draft }}
run: |
lerna publish from-git --yes --no-verify-access --dist-tag ${{ inputs.dist_tag }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
# - name: create release
# uses: ncipollo/release-action@v1
# with:
# tag: "v${{ needs.version.outputs.version }}"
# commit: ${{ github.sha }}
# draft: ${{ inputs.draft }}
# prerelease: ${{ needs.version.outputs.prerelease != 'false' }}
# artifacts: ${{ join(fromJson(env.NATIVE_ARTIFACTS)) }}
# allowUpdates: true

# - name: publish
# if: ${{ !inputs.draft }}
# run: |
# lerna publish from-git --yes --no-verify-access --dist-tag ${{ needs.version.outputs.dist_tag }}
# env:
# NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
66 changes: 66 additions & 0 deletions scripts/validate-version.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
const fs = require("fs");

let version = process.env.VERSION_SPEC;
let dist_tag = process.env.DIST_TAG;
let prerelease = process.env.PRERELEASE;

if (!version) { console.error("ERR! $VERSION_SPEC not set"); process.exit(1); }
if (!dist_tag) { console.error("ERR! $DIST_TAG not set"); process.exit(1); }
if (!prerelease) { console.error("ERR! $PRERELEASE not set"); process.exit(1); } else { prerelease = prerelease !== "false"; }

const match = /^(?<major>\d+)\.(?<minor>\d+)\.(?<revision>\d+)(?<pre_part>-(?<valid_pre>(?<pre_tags>(?<pre_tag>alpha|beta|rc)(?:\.[a-zA-Z-][a-zA-Z0-9-]*)*)(?<pre_number>\.(?:0|[1-9]\d*))?)?(?<invalid_pre>[a-zA-Z0-9.-]*))?(?<build_part>\+(?<valid_build>(?<build>[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*))?(?<invalid_build>[a-zA-Z0-9.-]*))?$/.exec(version)?.groups;
if (!match) { console.error(`ERR! invalid version: ${version}`); process.exit(1); }
if (match.invalid_pre && !match.valid_pre) { console.error(`ERR! Unsupported prerelease tag. Expected 'alpha', 'beta', or 'rc' but got '${match.invalid_pre}' instead.`); process.exit(1); }
if (match.invalid_pre) { console.error(`ERR! Unsupported prerelease tag: '${match.pre_part}'.`); process.exit(1); }
if (match.invalid_build) { console.error(`ERR! Unsupported build tag: '${match.build_part}'.`); process.exit(1); }
if (prerelease && !match.pre_tag) { console.error("ERR! version must have a prerelease tag if 'inputs.prerelease' is true."); process.exit(1); }
if (!prerelease && match.pre_tag) { console.error("ERR! version must not have a prerelease tag if 'inputs.prerelease' is false."); process.exit(1); }

switch (dist_tag) {
case "next":
case "beta":
case "rc":
case "latest":
break;
case "<auto>":
switch (match.pre_tag) {
case "alpha": dist_tag = "next"; break;
case "beta": dist_tag = "beta"; break;
case "rc": dist_tag = "rc"; break;
default: dist_tag = prerelease ? "latest" : "next"; break;
}
break;
default:
console.error(`ERR! unrecognized dist_tag: '${dist_tag}'.`);
process.exit(1);
break;
}

// reconstruct version
version = `${match.major}.${match.minor}.${match.revision}`;
if (match.pre_tags) {
version += `-${match.pre_tags}`;
if (match.pre_number) {
version += `.${match.pre_number}`;
}
else {
version += `.${new Date().toISOString().replace(/[T:.-]/g, "").slice(0, 12)}`;
}
}
if (match.build) {
version += `+${match.build}`;
}

setOutput(`version`, version);
setOutput(`dist_tag`, dist_tag);
setOutput(`prerelease`, prerelease);
process.exit(0);

function setOutput(key, value) {
if (process.env.GITHUB_OUTPUT) {
fs.appendFileSync(process.env.GITHUB_OUTPUT, `${key}=${value}\n`, { encoding: "utf8" });
}
else {
process.stdout.write(`::set-output name=${key}::${value}\n`);
}
}

0 comments on commit b6ea145

Please sign in to comment.