diff --git a/.github/workflows/publish-new.yml b/.github/workflows/publish-new.yml index 3da8defa2..7b2fbc6e3 100644 --- a/.github/workflows/publish-new.yml +++ b/.github/workflows/publish-new.yml @@ -1,8 +1,23 @@ -name: Publish new version of public packages +name: Publish new version of public packages from main HEAD # This bumps the version, updates the changelogs, publishes a GitHub release, and publishes the packages to npm. # Package publishing is manually triggered on github actions dashboard -on: workflow_dispatch +on: + workflow_dispatch: + inputs: + bump_type: + type: choice + description: Version Bump Type + required: true + default: 'minor' + options: + - minor + - major + - override + version_override: + type: string + description: Version Override + required: false jobs: deploy: @@ -12,6 +27,13 @@ jobs: runs-on: ubuntu-latest-16-cores-open steps: + - name: Check inputs + run: | + if [ ${{ inputs.bump_type }} != 'override' ] && [ ${{ inputs.version_override }} != '' ]; then + yarn tsx ./scripts/publish-new.ts --bump ${{ inputs.version_override }} + else + yarn tsx ./scripts/publish-new.ts --bump ${{ inputs.bump_type }} + fi - name: Generate GH token id: generate_token uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 @@ -35,7 +57,11 @@ jobs: run: | git config --global user.name 'huppy-bot[bot]' git config --global user.email '128400622+huppy-bot[bot]@users.noreply.github.com' - yarn tsx ./scripts/publish-new.ts + if [ ${{ inputs.bump_type }} == 'override' ]; then + yarn tsx ./scripts/publish-new.ts --bump ${{ inputs.version_override }} + else + yarn tsx ./scripts/publish-new.ts --bump ${{ inputs.bump_type }} + fi env: GH_TOKEN: ${{ steps.generate_token.outputs.token }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/scripts/package.json b/scripts/package.json index 99607058f..ccaecde84 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -54,7 +54,9 @@ "lint": "yarn run -T tsx lint.ts" }, "dependencies": { + "@types/minimist": "^1.2.5", "ignore": "^5.2.4", + "minimist": "^1.2.8", "tar": "^6.2.0" } } diff --git a/scripts/publish-new.ts b/scripts/publish-new.ts index e648f70a0..30b1f5dcd 100644 --- a/scripts/publish-new.ts +++ b/scripts/publish-new.ts @@ -1,37 +1,41 @@ import { Auto } from '@auto-it/core' import fetch from 'cross-fetch' +import minimist from 'minimist' import { assert } from 'node:console' -import { parse } from 'semver' +import { SemVer, parse } from 'semver' import { exec } from './lib/exec' import { REPO_ROOT } from './lib/file' import { nicelog } from './lib/nicelog' import { getLatestVersion, publish, setAllVersions } from './lib/publishing' import { getAllWorkspacePackages } from './lib/workspace' -async function main() { - const huppyToken = process.env.HUPPY_TOKEN - assert(huppyToken && typeof huppyToken === 'string', 'HUPPY_ACCESS_KEY env var must be set') +type ReleaseType = + | { + bump: 'major' | 'minor' + } + | { + bump: 'override' + version: SemVer + } - const auto = new Auto({ - plugins: ['npm'], - baseBranch: 'main', - owner: 'tldraw', - repo: 'tldraw', - verbose: true, - disableTsNode: true, - }) - - // module was called directly - const currentBranch = (await exec('git', ['rev-parse', '--abbrev-ref', 'HEAD'])).toString().trim() - if (currentBranch !== 'main') { - throw new Error('Must be on main branch to publish') +function getReleaseType(): ReleaseType { + const arg = minimist(process.argv.slice(2))['bump'] + if (!arg) { + throw new Error('Must provide a --bump argument') } + if (arg === 'major' || arg === 'minor') { + return { bump: arg } + } + const parsed = parse(arg) + if (parsed) { + return { bump: 'override', version: parsed } + } + throw new Error('Invalid bump argument ' + JSON.stringify(arg)) +} - await auto.loadConfig() - const bump = await auto.getVersion() - if (!bump) { - nicelog('nothing to do') - return +function getNextVersion(releaseType: ReleaseType): string { + if (releaseType.bump === 'override') { + return releaseType.version.format() } const latestVersion = parse(getLatestVersion())! @@ -48,7 +52,25 @@ async function main() { ? `${latestVersion.major}.${latestVersion.minor}.${latestVersion.patch}-${prereleaseTag}.${ Number(prereleaseNumber) + 1 }` - : latestVersion.inc(bump).format() + : latestVersion.inc(releaseType.bump).format() + + return nextVersion +} + +async function main() { + const huppyToken = process.env.HUPPY_TOKEN + assert(huppyToken && typeof huppyToken === 'string', 'HUPPY_ACCESS_KEY env var must be set') + + // check we're on the main branch on HEAD + const currentBranch = (await exec('git', ['rev-parse', '--abbrev-ref', 'HEAD'])).toString().trim() + if (currentBranch !== 'main') { + throw new Error('Must be on main branch to publish') + } + + const releaseType = getReleaseType() + const nextVersion = getNextVersion(releaseType) + + console.log('Releasing version', nextVersion) setAllVersions(nextVersion) @@ -66,12 +88,26 @@ async function main() { REPO_ROOT + '/packages/*/src/**/version.ts', ]) + const auto = new Auto({ + plugins: ['npm'], + baseBranch: 'main', + owner: 'tldraw', + repo: 'tldraw', + verbose: true, + disableTsNode: true, + }) + + await auto.loadConfig() + // this creates a new commit await auto.changelog({ useVersion: nextVersion, title: `v${nextVersion}`, }) + // Gonna test this in a quick and dirty 'dry-run' mode + return + // create and push a new tag await exec('git', ['tag', '-f', `v${nextVersion}`]) await exec('git', ['push', '--follow-tags']) diff --git a/yarn.lock b/yarn.lock index c519eab51..2cecdf0c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7327,6 +7327,7 @@ __metadata: "@aws-sdk/client-s3": "npm:^3.440.0" "@aws-sdk/lib-storage": "npm:^3.440.0" "@types/is-ci": "npm:^3.0.0" + "@types/minimist": "npm:^1.2.5" "@types/node": "npm:~20.11" "@types/tar": "npm:^6.1.7" "@typescript-eslint/utils": "npm:^5.59.0" @@ -7340,6 +7341,7 @@ __metadata: is-ci: "npm:^3.0.1" kleur: "npm:^4.1.5" lazyrepo: "npm:0.0.0-alpha.27" + minimist: "npm:^1.2.8" prettier: "npm:^3.0.3" recast: "npm:^0.22.0" rimraf: "npm:^4.4.0" @@ -8018,6 +8020,13 @@ __metadata: languageName: node linkType: hard +"@types/minimist@npm:^1.2.5": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 + languageName: node + linkType: hard + "@types/ms@npm:*": version: 0.7.34 resolution: "@types/ms@npm:0.7.34" @@ -18852,7 +18861,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f