From 665ca8d0e91d6320305606cc24049bfcc442dd01 Mon Sep 17 00:00:00 2001 From: Rophy Tsai Date: Fri, 3 Jul 2026 06:59:04 +0000 Subject: [PATCH 1/4] build: use PROJECT_VERSION as single source of truth for versioning Replace git describe --tags with PROJECT_VERSION from CMakeLists.txt. Git short SHA appended as build metadata (e.g. 1.9.0.2-1b09ac55). --- CMakeLists.txt | 23 +++++++++++++---------- Dockerfile.dev | 4 ++-- Dockerfile.release | 4 ++-- Makefile | 9 ++++----- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f40ac0b8..c03c5d43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,24 +18,27 @@ cmake_minimum_required(VERSION 3.16) project(OpenLogReplicator - VERSION 1.9.0 + VERSION 1.9.0.2 DESCRIPTION "OpenLogReplicator, Open Source Oracle database CDC" HOMEPAGE_URL "https://github.com/bersler/OpenLogReplicator" ) set(SCHEMA_VERSION "1.9.0") string(TIMESTAMP CMAKE_BUILD_TIMESTAMP "%Y-%m-%d %H:%M" UTC) -if(NOT DEFINED OLR_VERSION OR OLR_VERSION STREQUAL "") - execute_process( - COMMAND git describe --tags --always --dirty - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE OLR_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET - ) -endif() if(NOT DEFINED OLR_VERSION OR OLR_VERSION STREQUAL "") set(OLR_VERSION "${PROJECT_VERSION}") + if(NOT DEFINED GIT_SHORT_SHA OR GIT_SHORT_SHA STREQUAL "") + execute_process( + COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_SHORT_SHA + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + endif() + if(GIT_SHORT_SHA) + set(OLR_VERSION "${OLR_VERSION}-${GIT_SHORT_SHA}") + endif() endif() set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_STANDARD 17) diff --git a/Dockerfile.dev b/Dockerfile.dev index 7db511fb..1a4650fe 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -15,7 +15,7 @@ ARG GIDOLR=1001 ARG UIDOLR=1001 ARG GIDORA=54322 ARG BUILD_TYPE=Debug -ARG OLR_VERSION +ARG GIT_SHORT_SHA ARG WITHKAFKA ARG WITHPROMETHEUS ARG WITHORACLE @@ -138,7 +138,7 @@ RUN --mount=type=cache,target=/root/.ccache,id=olr-ccache \ fi && \ mkdir cmake-build-${BUILD_TYPE}-${ARCH} && \ cd cmake-build-${BUILD_TYPE}-${ARCH} && \ - cmake ${BUILDARGS} ${OLR_VERSION:+-DOLR_VERSION=${OLR_VERSION}} \ + cmake ${BUILDARGS} ${GIT_SHORT_SHA:+-DGIT_SHORT_SHA=${GIT_SHORT_SHA}} \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache && \ cmake --build ./ --target OpenLogReplicator -j && \ diff --git a/Dockerfile.release b/Dockerfile.release index 97a943ad..5d6aad07 100644 --- a/Dockerfile.release +++ b/Dockerfile.release @@ -23,7 +23,7 @@ FROM ${IMAGE}:${VERSION} AS builder ARG ARCH=x86_64 ARG BUILD_TYPE=Release -ARG OLR_VERSION +ARG GIT_SHORT_SHA ARG WITHKAFKA ARG WITHPROMETHEUS ARG WITHORACLE @@ -139,7 +139,7 @@ RUN set -eu && \ fi && \ mkdir cmake-build-${BUILD_TYPE}-${ARCH} && \ cd cmake-build-${BUILD_TYPE}-${ARCH} && \ - cmake ${BUILDARGS} ${OLR_VERSION:+-DOLR_VERSION=${OLR_VERSION}} && \ + cmake ${BUILDARGS} ${GIT_SHORT_SHA:+-DGIT_SHORT_SHA=${GIT_SHORT_SHA}} && \ cmake --build ./ --target OpenLogReplicator -j # Stage runtime libs into a single directory for clean COPY into runtime stage diff --git a/Makefile b/Makefile index 7b40917c..b44227e7 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,7 @@ OLR_IMAGE ?= olr-dev:latest CACHE_IMAGE ?= ghcr.io/bersler/openlogreplicator:ci BUILD_TYPE ?= Debug -OLR_VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo unknown) - +GIT_SHORT_SHA ?= $(shell git rev-parse --short HEAD 2>/dev/null) FIXTURE_ARCHIVES := $(wildcard tests/fixtures/*.tar.gz) FIXTURE_DIRS := $(FIXTURE_ARCHIVES:.tar.gz=) @@ -14,7 +13,7 @@ help: ## Show this help build: ## Build OLR dev image (Debug) docker buildx build \ --build-arg BUILD_TYPE=$(BUILD_TYPE) \ - --build-arg OLR_VERSION=$(OLR_VERSION) \ + --build-arg GIT_SHORT_SHA=$(GIT_SHORT_SHA) \ --build-arg UIDOLR=$$(id -u) \ --build-arg GIDOLR=$$(id -g) \ --build-arg GIDORA=54322 \ @@ -29,14 +28,14 @@ build: ## Build OLR dev image (Debug) build-release: ## Build OLR release image (minimal, multi-stage) docker buildx build \ - --build-arg OLR_VERSION=$(OLR_VERSION) \ + --build-arg GIT_SHORT_SHA=$(GIT_SHORT_SHA) \ --build-arg GIDOLR=$$(id -g) \ --build-arg UIDOLR=$$(id -u) \ --build-arg WITHORACLE=1 \ --build-arg WITHKAFKA=1 \ --build-arg WITHPROTOBUF=1 \ --build-arg WITHPROMETHEUS=1 \ - -t rophy/openlogreplicator:$(OLR_VERSION) \ + -t rophy/openlogreplicator:$(shell grep -oP 'VERSION \K[0-9]+(\.[0-9]+)+' CMakeLists.txt | head -1) \ --load \ -f Dockerfile.release . From a9849cd4753907cb37af25aad60ba7314a755f17 Mon Sep 17 00:00:00 2001 From: Rophy Tsai Date: Fri, 3 Jul 2026 07:26:22 +0000 Subject: [PATCH 2/4] build: update release workflow to use PROJECT_VERSION Trigger on CMakeLists.txt changes to master instead of tag push. Extract version from PROJECT_VERSION, skip build if image exists. --- .github/workflows/release.yaml | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 90346e5a..e38f3a7f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -2,7 +2,8 @@ name: Release Build on: push: - tags: ["v*"] + branches: [master] + paths: [CMakeLists.txt] jobs: build: @@ -14,14 +15,32 @@ jobs: env: IMAGE: ghcr.io/${{ github.repository }} steps: - - name: Lowercase image name - run: echo "IMAGE=${IMAGE,,}" >> "$GITHUB_ENV" - - uses: actions/checkout@v4 + - name: Extract version from CMakeLists.txt + id: version + run: | + VERSION=$(grep -oP 'VERSION \K[0-9]+(\.[0-9]+)+' CMakeLists.txt | head -1) + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "IMAGE=${IMAGE,,}" >> "$GITHUB_ENV" + + - name: Check if image already exists + id: check + run: | + if docker manifest inspect "${{ env.IMAGE }}:${{ steps.version.outputs.version }}" > /dev/null 2>&1; then + echo "exists=true" >> "$GITHUB_OUTPUT" + echo "Image ${{ env.IMAGE }}:${{ steps.version.outputs.version }} already exists, skipping build" + else + echo "exists=false" >> "$GITHUB_OUTPUT" + fi + env: + DOCKER_CLI_EXPERIMENTAL: enabled + - uses: docker/setup-buildx-action@v3 + if: steps.check.outputs.exists != 'true' - name: Log in to ghcr.io + if: steps.check.outputs.exists != 'true' uses: docker/login-action@v3 with: registry: ghcr.io @@ -29,14 +48,15 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push release image + if: steps.check.outputs.exists != 'true' uses: docker/build-push-action@v6 with: context: . file: Dockerfile.release push: true - tags: ${{ env.IMAGE }}:${{ github.ref_name }} + tags: ${{ env.IMAGE }}:${{ steps.version.outputs.version }} build-args: | - OLR_VERSION=${{ github.ref_name }} + GIT_SHORT_SHA=${{ github.sha }} UIDOLR=1001 GIDOLR=1001 GIDORA=54322 From 7f6c618f491ce1cf61c26c9e4845e95740372e98 Mon Sep 17 00:00:00 2001 From: Rophy Tsai Date: Fri, 3 Jul 2026 07:27:49 +0000 Subject: [PATCH 3/4] build: bump version to 1.9.0.3 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c03c5d43..83332b46 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ cmake_minimum_required(VERSION 3.16) project(OpenLogReplicator - VERSION 1.9.0.2 + VERSION 1.9.0.3 DESCRIPTION "OpenLogReplicator, Open Source Oracle database CDC" HOMEPAGE_URL "https://github.com/bersler/OpenLogReplicator" ) From ad3938d9a67d902ef8e9ca02281d95b8ac497665 Mon Sep 17 00:00:00 2001 From: Rophy Tsai Date: Sun, 5 Jul 2026 19:23:47 +0000 Subject: [PATCH 4/4] fix: address CodeRabbit review on PR #27 - Truncate github.sha to 8 chars for GIT_SHORT_SHA - Use env binding instead of inline template in shell scripts - Update stale usage comment in Dockerfile.release --- .github/workflows/release.yaml | 10 ++++++---- Dockerfile.release | 5 ++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e38f3a7f..817d4ff6 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -17,24 +17,26 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Extract version from CMakeLists.txt + - name: Extract version and short SHA id: version run: | VERSION=$(grep -oP 'VERSION \K[0-9]+(\.[0-9]+)+' CMakeLists.txt | head -1) echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "short_sha=${GITHUB_SHA::8}" >> "$GITHUB_OUTPUT" echo "IMAGE=${IMAGE,,}" >> "$GITHUB_ENV" - name: Check if image already exists id: check run: | - if docker manifest inspect "${{ env.IMAGE }}:${{ steps.version.outputs.version }}" > /dev/null 2>&1; then + if docker manifest inspect "${IMAGE}:${VERSION}" > /dev/null 2>&1; then echo "exists=true" >> "$GITHUB_OUTPUT" - echo "Image ${{ env.IMAGE }}:${{ steps.version.outputs.version }} already exists, skipping build" + echo "Image ${IMAGE}:${VERSION} already exists, skipping build" else echo "exists=false" >> "$GITHUB_OUTPUT" fi env: DOCKER_CLI_EXPERIMENTAL: enabled + VERSION: ${{ steps.version.outputs.version }} - uses: docker/setup-buildx-action@v3 if: steps.check.outputs.exists != 'true' @@ -56,7 +58,7 @@ jobs: push: true tags: ${{ env.IMAGE }}:${{ steps.version.outputs.version }} build-args: | - GIT_SHORT_SHA=${{ github.sha }} + GIT_SHORT_SHA=${{ steps.version.outputs.short_sha }} UIDOLR=1001 GIDOLR=1001 GIDORA=54322 diff --git a/Dockerfile.release b/Dockerfile.release index 5d6aad07..022b5b5e 100644 --- a/Dockerfile.release +++ b/Dockerfile.release @@ -5,13 +5,12 @@ # Produces a minimal runtime image with only the OLR binary and shared libs. # # Usage: -# OLR_VERSION=$(git describe --tags --always --dirty) # docker buildx build -f Dockerfile.release \ -# --build-arg OLR_VERSION=$OLR_VERSION \ +# --build-arg GIT_SHORT_SHA=$(git rev-parse --short HEAD) \ # --build-arg GIDOLR=$(id -g) --build-arg UIDOLR=$(id -u) \ # --build-arg WITHORACLE=1 --build-arg WITHKAFKA=1 \ # --build-arg WITHPROTOBUF=1 --build-arg WITHPROMETHEUS=1 \ -# -t rophy/openlogreplicator:$OLR_VERSION . +# -t rophy/openlogreplicator:latest . ARG IMAGE=debian ARG VERSION=13.0