ci(release): automate app versioning from Git tags

This commit is contained in:
lzt404 committed 2026-08-05 15:37:43 +08:00
1 parent 7f2876c1ec
commit 391fc877a7
9 files changed
+250 -54

No files matched your search

+50 -43
View File
@@ -26,8 +26,43 @@ permissions:
contents: write
jobs:
version:
name: Resolve app version
runs-on: ubuntu-24.04
outputs:
version: ${{ steps.resolve.outputs.version }}
tag: ${{ steps.resolve.outputs.tag }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ github.event_name == 'release' && github.event.release.tag_name || github.ref }}
- name: Read and validate app version
id: resolve
shell: bash
env:
REQUESTED_VERSION: ${{ github.event.release.tag_name || (github.ref_type == 'tag' && github.ref_name) || inputs.release_tag }}
run: |
set -euo pipefail
source_version="$(node scripts/app-version.mjs)"
release_tag="$REQUESTED_VERSION"
if [ -z "$release_tag" ]; then
release_tag="v$source_version"
else
case "$release_tag" in
v*) ;;
*) release_tag="v$release_tag" ;;
esac
fi
version="$(node scripts/app-version.mjs "${release_tag#v}")"
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "tag=$release_tag" >> "$GITHUB_OUTPUT"
validate:
name: Validate source
needs: version
if: github.event_name != 'release' || github.event.release.prerelease == true
runs-on: ubuntu-24.04
timeout-minutes: 30
@@ -41,6 +76,8 @@ jobs:
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- name: Apply release version
run: node scripts/set-app-version.mjs "${{ needs.version.outputs.version }}"
- name: Install Linux dependencies
run: |
sudo apt-get update
@@ -65,7 +102,9 @@ jobs:
build:
name: Build ${{ matrix.os }}-${{ matrix.arch }}
needs: validate
needs:
- version
- validate
strategy:
fail-fast: false
matrix:
@@ -110,50 +149,16 @@ jobs:
with:
bun-version: 1.3.14
- uses: dtolnay/rust-toolchain@stable
- name: Apply release version
run: node scripts/set-app-version.mjs "${{ needs.version.outputs.version }}"
- name: Resolve release package name
id: package
shell: bash
env:
REQUESTED_VERSION: ${{ github.event.release.tag_name || (github.ref_type == 'tag' && github.ref_name) || inputs.release_tag }}
APP_VERSION: ${{ needs.version.outputs.version }}
run: |
source_version="$(node -p 'require("./package.json").version')"
version="$REQUESTED_VERSION"
if [ -z "$version" ]; then
version="v$source_version"
else
case "$version" in
v*) ;;
*) version="v$version" ;;
esac
fi
if ! node -e 'process.exit(/^v(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.test(process.argv[1]) ? 0 : 1)' "$version"; then
echo "Invalid release version: $version" >&2
exit 1
fi
RELEASE_VERSION="${version#v}" node <<'NODE'
const { readFileSync, writeFileSync } = require('node:fs');
const version = process.env.RELEASE_VERSION;
for (const file of ['package.json', 'src-tauri/tauri.conf.json']) {
const manifest = JSON.parse(readFileSync(file, 'utf8'));
manifest.version = version;
writeFileSync(file, `${JSON.stringify(manifest, null, 2)}\n`);
}
const cargoManifest = 'src-tauri/Cargo.toml';
const contents = readFileSync(cargoManifest, 'utf8');
const versionPattern = /^version = "[^"]+"$/m;
if (!versionPattern.test(contents)) {
throw new Error(`Could not find version in ${cargoManifest}`);
}
const updated = contents.replace(versionPattern, `version = "${version}"`);
writeFileSync(cargoManifest, updated);
NODE
echo "stem=EasyCLIProxyAPI-${version}-${{ matrix.display_os }}-${{ matrix.arch }}" >> "$GITHUB_OUTPUT"
echo "version=${version#v}" >> "$GITHUB_OUTPUT"
echo "stem=EasyCLIProxyAPI-v${APP_VERSION}-${{ matrix.display_os }}-${{ matrix.arch }}" >> "$GITHUB_OUTPUT"
echo "version=$APP_VERSION" >> "$GITHUB_OUTPUT"
- name: Install Linux dependencies
if: matrix.os == 'linux'
run: |
@@ -390,7 +395,9 @@ jobs:
(github.event_name == 'release' && github.event.release.prerelease == true)
|| startsWith(github.ref, 'refs/tags/')
|| inputs.release_tag != ''
needs: build
needs:
- version
- build
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
@@ -404,7 +411,7 @@ jobs:
- name: Generate Windows portable update manifest
shell: bash
env:
RELEASE_TAG: ${{ github.event.release.tag_name || (github.ref_type == 'tag' && github.ref_name) || inputs.release_tag }}
RELEASE_TAG: ${{ needs.version.outputs.tag }}
run: >-
node scripts/generate-portable-update-manifest.mjs
--directory artifacts
@@ -416,7 +423,7 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
RELEASE_TAG: ${{ github.event.release.tag_name || (github.ref_type == 'tag' && github.ref_name) || inputs.release_tag }}
RELEASE_TAG: ${{ needs.version.outputs.tag }}
MANUAL_PRERELEASE: ${{ github.event_name == 'release' && github.event.release.prerelease || inputs.prerelease }}
run: |
set -euo pipefail