ci(release): automate app versioning from Git tags
This commit is contained in:
1 parent
7f2876c1ec
commit
391fc877a7
9 files changed
+250
-54
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user