diff --git a/.github/workflows/create-version.yml b/.github/workflows/create-version.yml new file mode 100644 index 0000000..f8241f1 --- /dev/null +++ b/.github/workflows/create-version.yml @@ -0,0 +1,53 @@ +name: Create New Version +run-name: Creating new ${{ github.event.inputs.version }} ${{ github.event.inputs.channel }} version + +on: + workflow_dispatch: + inputs: + version: + description: Version + type: choice + options: + - major + - minor + - patch + default: minor + channel: + description: Channel + type: choice + options: + - release + - beta + default: release + +env: + CI: true + +permissions: + contents: write + +jobs: + version: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.BCC_BOT_ACCESS_TOKEN }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + registry-url: 'https://registry.npmjs.org' + + - name: Set commit author to bcc-bot + run: | + git config --global user.name "bcc-bot" + git config --global user.email "84040471+bcc-bot@users.noreply.github.com" + + - name: Version new ${{ github.event.inputs.version }} version + run: npm run create-version -- ${{ github.event.inputs.version }} ${{ github.event.inputs.channel }} + + - name: Push + run: git push --follow-tags \ No newline at end of file diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 0000000..8f6fd3d --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,38 @@ +name: "Prepare release" + +on: + workflow_dispatch: + push: + tags: + - 'v*' + +env: + CI: true + +permissions: + contents: read + +jobs: + build: + permissions: + contents: write # for softprops/action-gh-release to create GitHub release + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - run: git fetch --tags -f + + - name: Resolve version + id: vars + run: | + echo "TAG_NAME=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + draft: true + name: "schema-sync ${{ env.TAG_NAME }}" + tag_name: ${{ env.TAG_NAME }} + generate_release_notes: true \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f3a7201 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,41 @@ +name: Release + +on: + release: + types: [published] + +permissions: + contents: read + +env: + CI: true + +jobs: + build: + if: contains(github.event.release.name, 'schema-sync') + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + registry-url: 'https://registry.npmjs.org' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build Extension + run: npm build + + - name: Set release channel + run: | + echo "RELEASE_CHANNEL=$(npm run release-channel --silent)" >> $GITHUB_ENV + + - name: Publish Extension + run: npm publish --tag ${{ env.RELEASE_CHANNEL }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/package.json b/package.json index 1d0d122..378d2fd 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "dev": "directus-extension build -w --no-minify", "link": "directus-extension link", "pre-test": "tsc -p tsconfig.test.json", - "test": "npm run pre-test && node --test dist-test/" + "test": "npm run pre-test && node --test dist-test/", + "create-version": "node ./scripts/version.cjs" }, "devDependencies": { "@directus/extensions-sdk": "10.1.11", diff --git a/scripts/version.cjs b/scripts/version.cjs new file mode 100644 index 0000000..3f2e4a7 --- /dev/null +++ b/scripts/version.cjs @@ -0,0 +1,39 @@ +const { exec } = require("node:child_process"); +const { exit } = require("node:process"); +const currentVersion = require("../package.json").version; + +let increment = process.argv[2]; +let channel = process.argv[3] ?? "release"; + +if (!increment) { + console.log("No version increment given! Exiting..."); + exit(); +} + +let update = `pre${increment}`; +if (currentVersion.includes(channel)) { + update = "prerelease"; +} + +const versionParts = /(\d+\.\d+\.\d+)-(.*)\.\d+/g.exec(currentVersion); + +// If there is a prerelease tag in the name but the channel is for public release, +// just strip the prerelease tag from the name +if (versionParts && channel == "release") { + increment = versionParts[1]; +} + +const command = `npm version ${ + channel == "release" ? increment : `${update} --preid ${channel}` +} --no-git-tag-version`; + +// Version package +exec(command, (error, newVersion) => { + if (error) console.error(error); + const tagVersion = newVersion.replace("\n", ""); + exec( + `git add . && git commit -m "schema-sync ${tagVersion}" && git tag -am ${tagVersion} "${tagVersion}"` + ); + + console.log(`Tagged new version ${tagVersion}`) +}); \ No newline at end of file