diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 90346e5a..817d4ff6 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,34 @@ 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 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 "${IMAGE}:${VERSION}" > /dev/null 2>&1; then + echo "exists=true" >> "$GITHUB_OUTPUT" + 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' - name: Log in to ghcr.io + if: steps.check.outputs.exists != 'true' uses: docker/login-action@v3 with: registry: ghcr.io @@ -29,14 +50,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=${{ steps.version.outputs.short_sha }} UIDOLR=1001 GIDOLR=1001 GIDORA=54322 diff --git a/CMakeLists.txt b/CMakeLists.txt index f40ac0b8..83332b46 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.3 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..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 @@ -23,7 +22,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 +138,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 .