From fe7f4cc6c4ba8e10eececa3c2b7141d9b89b2e6d Mon Sep 17 00:00:00 2001 From: Max Litruv Boonzaayer Date: Mon, 20 Oct 2025 01:54:09 +1100 Subject: [PATCH] ci: use semver for auto releases --- .github/workflows/windows-build.yml | 22 ++++++++++++++----- scripts/ci/update-version.js | 34 ++++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 812235b..d046bb2 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -32,25 +32,37 @@ jobs: GH_TOKEN: ${{ secrets.GH_TOKEN != '' && secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - $version = node scripts/ci/update-version.js + node scripts/ci/update-version.js $env:GITHUB_OUTPUT if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - "version=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append - name: Build/release Electron app uses: samuelmeuli/action-electron-builder@v1 with: github_token: ${{ secrets.GH_TOKEN != '' && secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} - release: true - args: --win --x64 --publish always + release: false + args: --win --x64 --publish never env: GH_TOKEN: ${{ secrets.GH_TOKEN != '' && secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create GitHub release + uses: softprops/action-gh-release@v1 + with: + tag_name: v${{ steps.version.outputs.tag }} + name: ${{ steps.version.outputs.tag }} + prerelease: false + draft: false + files: | + dist/**/*.exe + dist/**/*.blockmap + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN != '' && secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} + - name: Upload installer artifact if: always() uses: actions/upload-artifact@v4 with: - name: windows-installer-${{ steps.version.outputs.version }} + name: windows-installer-${{ steps.version.outputs.tag }} path: | dist/**/*.exe dist/**/*.blockmap diff --git a/scripts/ci/update-version.js b/scripts/ci/update-version.js index befbfd1..bad107d 100644 --- a/scripts/ci/update-version.js +++ b/scripts/ci/update-version.js @@ -25,7 +25,7 @@ async function fetchReleases() { if (!response.ok) { const message = await response.text(); - console.error(`Failed to fetch releases: ${response.status} ${message}`); + console.warn(`Failed to fetch releases: ${response.status} ${message}`); return []; } @@ -44,7 +44,18 @@ function determineNextVersion(releases) { } } - return `${isoDate}-${String(index).padStart(2, '0')}`; + return index; +} + +function toSemver(date, index) { + const [year, month, day] = date.split('-'); + const base = `${Number(year)}.${Number(month)}.${Number(day)}`; + if (index <= 1) { + return base; + } + + const suffix = String(index).padStart(2, '0'); + return `${base}-a${suffix}`; } function updateJson(filePath, version) { @@ -65,13 +76,24 @@ function updateJson(filePath, version) { (async () => { try { const releases = await fetchReleases(); - const version = determineNextVersion(releases); + const index = determineNextVersion(releases); + const indexString = String(index).padStart(2, '0'); + const tag = `${isoDate}-${indexString}`; + const semver = toSemver(isoDate, index); const root = process.cwd(); - updateJson(path.join(root, 'package.json'), version); - updateJson(path.join(root, 'package-lock.json'), version); + updateJson(path.join(root, 'package.json'), semver); + updateJson(path.join(root, 'package-lock.json'), semver); - console.log(version); + const outputPath = process.argv[2]; + + if (outputPath) { + fs.appendFileSync(outputPath, `semver=${semver}\n`, 'utf8'); + fs.appendFileSync(outputPath, `tag=${tag}\n`, 'utf8'); + } else { + console.log(`SEMVER=${semver}`); + console.log(`TAG=${tag}`); + } } catch (error) { console.error(error instanceof Error ? error.message : String(error)); process.exit(1);