diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 83ec129..7c79743 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -2,6 +2,8 @@ name: Publish Server Image on: push: + branches: + - '**' tags: - 'v*.*.*' @@ -29,22 +31,29 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=sha,format=short + - name: Determine version and tags + id: info + run: | + IMAGE="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}" + SHORT_SHA="$(echo '${{ github.sha }}' | cut -c1-7)" + + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + TAG="${{ github.ref_name }}" + VERSION="${TAG#v}" + echo "tags=${IMAGE}:${VERSION},${IMAGE}:latest" >> "$GITHUB_OUTPUT" + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + else + echo "tags=${IMAGE}:trunk,${IMAGE}:${SHORT_SHA}" >> "$GITHUB_OUTPUT" + echo "version=${SHORT_SHA}" >> "$GITHUB_OUTPUT" + fi - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + tags: ${{ steps.info.outputs.tags }} + build-args: | + FURUMI_VERSION=${{ steps.info.outputs.version }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index 5e3d992..68518a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,8 +14,10 @@ WORKDIR /usr/src/app # Option: Copy in root workspace files and source crates COPY . . +ARG FURUMI_VERSION=dev + # Build only the server for release -RUN cargo build --release --bin furumi-server +RUN FURUMI_VERSION=${FURUMI_VERSION} cargo build --release --bin furumi-server # Stage 2: Create the minimal runtime image FROM debian:bookworm-slim diff --git a/furumi-mount-linux/src/main.rs b/furumi-mount-linux/src/main.rs index 545ea9f..55ce983 100644 --- a/furumi-mount-linux/src/main.rs +++ b/furumi-mount-linux/src/main.rs @@ -75,7 +75,7 @@ fn main() -> Result<(), Box> { MountOption::NoExec, // Better security for media mount ]; - println!("Mounting Furumi-ng v{} to {:?}", env!("CARGO_PKG_VERSION"), args.mount); + println!("Mounting Furumi-ng v{} to {:?}", option_env!("FURUMI_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")), args.mount); // Use Session + BackgroundSession for graceful unmount on exit let session = Session::new(fuse_fs, &args.mount, &options)?; diff --git a/furumi-mount-macos/src/main.rs b/furumi-mount-macos/src/main.rs index e3315b3..8a93f5b 100644 --- a/furumi-mount-macos/src/main.rs +++ b/furumi-mount-macos/src/main.rs @@ -108,7 +108,7 @@ fn main() -> Result<(), Box> { std::process::exit(1); } - println!("Mounted Furumi-ng v{} to {:?}", env!("CARGO_PKG_VERSION"), mount_path); + println!("Mounted Furumi-ng v{} to {:?}", option_env!("FURUMI_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")), mount_path); // Wait for shutdown signal while running.load(Ordering::SeqCst) { diff --git a/furumi-server/src/main.rs b/furumi-server/src/main.rs index 7af2666..060d2f6 100644 --- a/furumi-server/src/main.rs +++ b/furumi-server/src/main.rs @@ -108,7 +108,7 @@ async fn main() -> Result<(), Box> { let svc = RemoteFileSystemServer::with_interceptor(remote_fs, auth.clone()); // Print startup info - println!("Furumi-ng Server v{} listening on {}", env!("CARGO_PKG_VERSION"), addr); + println!("Furumi-ng Server v{} listening on {}", option_env!("FURUMI_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")), addr); if args.no_tls { println!("WARNING: TLS is DISABLED — traffic is unencrypted"); } else { diff --git a/furumi-server/src/web/mod.rs b/furumi-server/src/web/mod.rs index 8efa678..785b69a 100644 --- a/furumi-server/src/web/mod.rs +++ b/furumi-server/src/web/mod.rs @@ -61,6 +61,6 @@ async fn player_html( ) -> axum::response::Html { let html = include_str!("player.html") .replace("", &user_info.0) - .replace("", env!("CARGO_PKG_VERSION")); + .replace("", option_env!("FURUMI_VERSION").unwrap_or(env!("CARGO_PKG_VERSION"))); axum::response::Html(html) }