From 0eb47e991879a6ebf0fd7d8baffef38a1c080d1f Mon Sep 17 00:00:00 2001 From: nanxun Date: Tue, 11 Aug 2026 18:03:57 +0800 Subject: [PATCH] ci: increment fnOS package version per build --- Jenkinsfile | 33 ++++++++++++++++++++++++++++++--- scripts/build-fnos-package.sh | 18 +++++++++++++++--- scripts/verify-fnos-package.sh | 7 ++++++- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5586b26..660868e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -84,8 +84,32 @@ pipeline { if (!env.APP_VERSION || !env.SHORT_SHA) { error('Unable to resolve fnOS version or Git commit.') } + env.FNOS_VERSION = sh( + script: ''' + set -euo pipefail + base=$(sed -n 's/^version=//p' fnos/manifest | head -n 1) + major=${base%%.*} + remainder=${base#*.} + minor=${remainder%%.*} + patch=${remainder#*.} + test "$base" = "$major.$minor.$patch" || { + echo "Invalid base version: $base" >&2 + exit 1 + } + case "$major.$minor.$patch" in + *[!0-9.]*|.*|*..*|*.) echo "Invalid base version: $base" >&2; exit 1 ;; + esac + test "$BUILD_NUMBER" -lt 100000 || { + echo 'BUILD_NUMBER must remain below 100000 for fnOS version ordering.' >&2 + exit 1 + } + ci_patch=$((patch * 100000 + BUILD_NUMBER)) + printf '%s.%s.%s\n' "$major" "$minor" "$ci_patch" + ''', + returnStdout: true + ).trim() env.IMMUTABLE_TAG = "${env.APP_VERSION}-b${env.BUILD_NUMBER}-${env.SHORT_SHA}" - env.FPK_BASENAME = "liverecorder-${env.IMMUTABLE_TAG}-x86_64.fpk" + env.FPK_BASENAME = "liverecorder-${env.FNOS_VERSION}-x86_64.fpk" env.FPK_PATH = "${env.WORKSPACE}/artifacts/ci/${env.FPK_BASENAME}" currentBuild.displayName = "#${env.BUILD_NUMBER} ${env.APP_VERSION} ${env.SHORT_SHA}" currentBuild.description = "${env.IMMUTABLE_TAG}" @@ -147,8 +171,9 @@ pipeline { steps { sh ''' set -euo pipefail - FNPACK="$FNPACK_BIN" ./scripts/build-fnos-package.sh "$FPK_PATH" - ./scripts/verify-fnos-package.sh "$FPK_PATH" + PACKAGE_VERSION="$FNOS_VERSION" FNPACK="$FNPACK_BIN" \ + ./scripts/build-fnos-package.sh "$FPK_PATH" + ./scripts/verify-fnos-package.sh "$FPK_PATH" "$FNOS_VERSION" test -s "$FPK_PATH.sha256" ''' } @@ -345,6 +370,8 @@ pipeline { set -euo pipefail printf '%s\n' \ "Commit: $(git rev-parse HEAD)" \ + "Product version: $APP_VERSION" \ + "fnOS package version: $FNOS_VERSION" \ "fnOS: $FPK_BASENAME" \ "Checksum: $(awk '{print $1}' "$FPK_PATH.sha256")" \ "API amd64: $API_IMAGE_REPO:$IMMUTABLE_TAG-amd64" \ diff --git a/scripts/build-fnos-package.sh b/scripts/build-fnos-package.sh index 9aad10a..20065f8 100755 --- a/scripts/build-fnos-package.sh +++ b/scripts/build-fnos-package.sh @@ -2,8 +2,19 @@ set -euo pipefail ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -VERSION=1.2.19 -OUTPUT="${1:-$ROOT_DIR/artifacts/fnos/liverecorder-${VERSION}-x86_64.fpk}" +BASE_VERSION=$(sed -n 's/^version[[:space:]]*=[[:space:]]*//p' "$ROOT_DIR/fnos/manifest" | head -n 1 | tr -d '\r') +PACKAGE_VERSION="${PACKAGE_VERSION:-$BASE_VERSION}" +case "$PACKAGE_VERSION" in + ''|*[!0-9.]*|.*|*..*|*.) + printf 'invalid fnOS package version: %s\n' "$PACKAGE_VERSION" >&2 + exit 1 + ;; +esac +[ "$(printf '%s' "$PACKAGE_VERSION" | awk -F. '{ print NF }')" -eq 3 ] || { + printf 'fnOS package version must contain exactly three numeric components: %s\n' "$PACKAGE_VERSION" >&2 + exit 1 +} +OUTPUT="${1:-$ROOT_DIR/artifacts/fnos/liverecorder-${PACKAGE_VERSION}-x86_64.fpk}" WORKSPACE_CACHE=$(CDPATH= cd -- "$ROOT_DIR/.." && pwd) if [ -n "${DOTNET:-}" ]; then DOTNET_BIN="$DOTNET" @@ -54,6 +65,7 @@ mkdir -p "$STAGE/app/server" "$RUNTIME_ROOT/bin" "$RUNTIME_ROOT/lib" \ "$RUNTIME_ROOT/etc/ssl/certs" \ "$PACKED_ROOT" "$FNPACK_TMP_ROOT" "$EXTRACT_ROOT" cp -a "$ROOT_DIR/fnos/." "$STAGE/" +sed -i -E "s/^version[[:space:]]*=.*/version=${PACKAGE_VERSION}/" "$STAGE/manifest" printf 'Building frontend...\n' if [ "${LIVERECORDER_SKIP_NPM_CI:-0}" != "1" ]; then @@ -232,5 +244,5 @@ mv "$PACKED_ROOT/liverecorder.fpk" "$OUTPUT" ) LIVERECORDER_VERIFY_TMPDIR="${LIVERECORDER_VERIFY_TMPDIR:-$BUILD_TMP_ROOT}" \ - "$ROOT_DIR/scripts/verify-fnos-package.sh" "$OUTPUT" + "$ROOT_DIR/scripts/verify-fnos-package.sh" "$OUTPUT" "$PACKAGE_VERSION" printf 'Built %s\n' "$OUTPUT" diff --git a/scripts/verify-fnos-package.sh b/scripts/verify-fnos-package.sh index 8329d9a..aa204cc 100755 --- a/scripts/verify-fnos-package.sh +++ b/scripts/verify-fnos-package.sh @@ -1,7 +1,8 @@ #!/bin/bash set -euo pipefail -PACKAGE=${1:?usage: verify-fnos-package.sh package.fpk} +PACKAGE=${1:?usage: verify-fnos-package.sh package.fpk [expected-version]} +EXPECTED_VERSION=${2:-} VERIFY_TMP_ROOT="${LIVERECORDER_VERIFY_TMPDIR:-${TMPDIR:-/tmp}}" MAX_APP_UNCOMPRESSED_BYTES=$((512 * 1024 * 1024)) mkdir -p "$VERIFY_TMP_ROOT" @@ -17,6 +18,10 @@ appname=$(manifest_value appname) version=$(manifest_value version) test "$appname" = "liverecorder" || { printf 'unexpected fnOS appname: %s\n' "$appname" >&2; exit 1; } test -n "$version" +if [ -n "$EXPECTED_VERSION" ] && [ "$version" != "$EXPECTED_VERSION" ]; then + printf 'unexpected fnOS version: expected %s, got %s\n' "$EXPECTED_VERSION" "$version" >&2 + exit 1 +fi test "$(manifest_value platform)" = "x86" test -x "$WORK_DIR/cmd/main" test -x "$WORK_DIR/cmd/install_callback"