From 1083975a2aa548712e53cf39db4875f58bf9e961 Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Tue, 27 Jan 2026 14:26:48 -0500 Subject: [PATCH 1/9] Create environment casual-raccoon: GitHub Actions GHCR publishing (from main) From d025e84f8037cefaaecf86f224bbd83acef5d7ff Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Tue, 27 Jan 2026 14:27:10 -0500 Subject: [PATCH 2/9] Create the GitHub Actions workflow for GHCR publishing --- .github/workflows/publish-images.yml | 115 +++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 .github/workflows/publish-images.yml diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml new file mode 100644 index 00000000..e56dcf0f --- /dev/null +++ b/.github/workflows/publish-images.yml @@ -0,0 +1,115 @@ +name: Publish Docker Images + +on: + push: + branches: [main] + tags: ['v*'] + workflow_dispatch: + +permissions: + contents: read + packages: write + +env: + REGISTRY: ghcr.io + +jobs: + build-server: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Nix + uses: DeterminateSystems/nix-installer-action@v21 + with: + flakehub: false + + - name: Setup Magic Nix Cache + uses: DeterminateSystems/magic-nix-cache-action@v13 + with: + use-flakehub: false + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push server image + run: nix develop --command gradle :server:jib + env: + GITHUB_ACTOR: ${{ github.actor }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-demo-data: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/typestreamio/demo-data + tags: | + type=raw,value=latest,enable={{is_default_branch}} + type=semver,pattern={{version}} + type=sha,prefix= + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: connectors/demo-data/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + build-kafka-connect: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/typestreamio/kafka-connect + tags: | + type=raw,value=latest,enable={{is_default_branch}} + type=semver,pattern={{version}} + type=sha,prefix= + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: docker/Dockerfile.kafka-connect + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max From 8ab17961be6ef6c3e2eab2a461f449d560ccd09c Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Tue, 27 Jan 2026 14:27:13 -0500 Subject: [PATCH 3/9] Update Jib config to use GHCR --- server/build.gradle.kts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 47522a51..b9260275 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -51,8 +51,12 @@ dependencies { jib { to { - image = "typestream/server" - tags = mutableSetOf(project.version.toString()) + image = "ghcr.io/typestreamio/server" + tags = mutableSetOf(project.version.toString(), "latest") + auth { + username = System.getenv("GITHUB_ACTOR") ?: "" + password = System.getenv("GITHUB_TOKEN") ?: "" + } } } From 4c2a7ee390731163c2eb5cbbad542434eba73ce6 Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Tue, 27 Jan 2026 14:43:41 -0500 Subject: [PATCH 4/9] Fix COPY paths for GitHub Actions build context --- docker/Dockerfile.kafka-connect | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile.kafka-connect b/docker/Dockerfile.kafka-connect index 6c5e514e..fdb1e7eb 100644 --- a/docker/Dockerfile.kafka-connect +++ b/docker/Dockerfile.kafka-connect @@ -72,8 +72,9 @@ RUN cd /kafka/connect/weaviate-sink/Weaviate-kafka-connect-weaviate-${WEAVIATE_C curl -sLO https://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/${NETTY_VERSION}/netty-transport-native-unix-common-${NETTY_VERSION}.jar # Copy connector registration script and custom entrypoint -COPY register-connector.sh /usr/local/bin/register-connector.sh -COPY custom-entrypoint.sh /usr/local/bin/custom-entrypoint.sh +# Note: Build context is repo root, so prefix with docker/ +COPY docker/register-connector.sh /usr/local/bin/register-connector.sh +COPY docker/custom-entrypoint.sh /usr/local/bin/custom-entrypoint.sh RUN chmod +x /usr/local/bin/register-connector.sh /usr/local/bin/custom-entrypoint.sh USER 1001 From 861c332b4cdd18ce6529a7517e1da8688860f769 Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Tue, 27 Jan 2026 14:43:43 -0500 Subject: [PATCH 5/9] Add path triggers to prevent unnecessary builds --- .github/workflows/publish-images.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml index e56dcf0f..cac3e8cf 100644 --- a/.github/workflows/publish-images.yml +++ b/.github/workflows/publish-images.yml @@ -3,6 +3,13 @@ name: Publish Docker Images on: push: branches: [main] + paths: + - 'server/**' + - 'connectors/demo-data/**' + - 'docker/Dockerfile.kafka-connect' + - 'docker/register-connector.sh' + - 'docker/custom-entrypoint.sh' + - '.github/workflows/publish-images.yml' tags: ['v*'] workflow_dispatch: From 48c30b7f76b77bcf4c230349744d50938336a69a Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Wed, 28 Jan 2026 15:52:43 -0500 Subject: [PATCH 6/9] Updating workflow to only trigger on tags and add smoke tests before publishing --- .github/workflows/publish-images.yml | 185 +++++++++++++++++++++------ 1 file changed, 145 insertions(+), 40 deletions(-) diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml index cac3e8cf..8b73dab1 100644 --- a/.github/workflows/publish-images.yml +++ b/.github/workflows/publish-images.yml @@ -2,14 +2,6 @@ name: Publish Docker Images on: push: - branches: [main] - paths: - - 'server/**' - - 'connectors/demo-data/**' - - 'docker/Dockerfile.kafka-connect' - - 'docker/register-connector.sh' - - 'docker/custom-entrypoint.sh' - - '.github/workflows/publish-images.yml' tags: ['v*'] workflow_dispatch: @@ -21,8 +13,11 @@ env: REGISTRY: ghcr.io jobs: - build-server: + # Build server image and run smoke test + build-and-test-server: runs-on: ubuntu-latest + outputs: + image-tag: ${{ steps.meta.outputs.version }} steps: - uses: actions/checkout@v4 @@ -36,20 +31,53 @@ jobs: with: use-flakehub: false - - name: Login to GHCR - uses: docker/login-action@v3 + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push server image - run: nix develop --command gradle :server:jib - env: - GITHUB_ACTOR: ${{ github.actor }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + images: ${{ env.REGISTRY }}/typestreamio/server + tags: | + type=semver,pattern={{version}} - build-demo-data: + - name: Build server image locally + run: nix develop --command gradle :server:jibDockerBuild + + - name: Smoke test - server starts and responds + run: | + # Start the server container + docker run -d --name server-smoke-test \ + -p 4242:4242 \ + typestream/server:latest + + # Wait for server to be ready (up to 30 seconds) + echo "Waiting for server to start..." + for i in {1..30}; do + if docker logs server-smoke-test 2>&1 | grep -q "started"; then + echo "Server started successfully" + break + fi + if [ $i -eq 30 ]; then + echo "Server failed to start in time" + docker logs server-smoke-test + exit 1 + fi + sleep 1 + done + + # Check container is still running + if ! docker ps | grep -q server-smoke-test; then + echo "Server container exited unexpectedly" + docker logs server-smoke-test + exit 1 + fi + + # Cleanup + docker stop server-smoke-test + docker rm server-smoke-test + echo "Smoke test passed!" + + # Build and test demo-data + build-and-test-demo-data: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -57,39 +85,86 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Login to GHCR - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/typestreamio/demo-data tags: | - type=raw,value=latest,enable={{is_default_branch}} type=semver,pattern={{version}} type=sha,prefix= - - name: Build and push + - name: Build demo-data image uses: docker/build-push-action@v6 with: context: . file: connectors/demo-data/Dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + load: true + tags: demo-data:test cache-from: type=gha cache-to: type=gha,mode=max - build-kafka-connect: + - name: Smoke test - demo-data container starts + run: | + # Start the container with --help to verify it runs + docker run --rm demo-data:test --help || true + + # Verify container can start (will exit due to no Kafka, but should not crash immediately) + timeout 5 docker run --rm demo-data:test coinbase 2>&1 | head -20 || true + echo "Smoke test passed - container starts correctly" + + # Build and test kafka-connect + build-and-test-kafka-connect: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/typestreamio/kafka-connect + tags: | + type=semver,pattern={{version}} + type=sha,prefix= + + - name: Build kafka-connect image + uses: docker/build-push-action@v6 + with: + context: . + file: docker/Dockerfile.kafka-connect + load: true + tags: kafka-connect:test + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Smoke test - kafka-connect has required connectors + run: | + # Check that Debezium connector JARs are present + docker run --rm --entrypoint /bin/bash kafka-connect:test -c \ + "ls -la /kafka/connect/ && test -d /kafka/connect/debezium-connector-postgres" + echo "Smoke test passed - Debezium connectors are installed" + + # Publish all images after smoke tests pass + publish-images: + runs-on: ubuntu-latest + needs: [build-and-test-server, build-and-test-demo-data, build-and-test-kafka-connect] + steps: + - uses: actions/checkout@v4 + + - name: Install Nix + uses: DeterminateSystems/nix-installer-action@v21 + with: + flakehub: false + + - name: Setup Magic Nix Cache + uses: DeterminateSystems/magic-nix-cache-action@v13 + with: + use-flakehub: false + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -100,23 +175,53 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract metadata - id: meta + # Publish server + - name: Build and push server image + run: nix develop --command gradle :server:jib + env: + GITHUB_ACTOR: ${{ github.actor }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Publish demo-data + - name: Extract demo-data metadata + id: demo-meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/typestreamio/demo-data + tags: | + type=raw,value=latest + type=semver,pattern={{version}} + type=sha,prefix= + + - name: Build and push demo-data + uses: docker/build-push-action@v6 + with: + context: . + file: connectors/demo-data/Dockerfile + push: true + tags: ${{ steps.demo-meta.outputs.tags }} + labels: ${{ steps.demo-meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + # Publish kafka-connect + - name: Extract kafka-connect metadata + id: kc-meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/typestreamio/kafka-connect tags: | - type=raw,value=latest,enable={{is_default_branch}} + type=raw,value=latest type=semver,pattern={{version}} type=sha,prefix= - - name: Build and push + - name: Build and push kafka-connect uses: docker/build-push-action@v6 with: context: . file: docker/Dockerfile.kafka-connect push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + tags: ${{ steps.kc-meta.outputs.tags }} + labels: ${{ steps.kc-meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max From f9c6d1f52bb254f5e2dd07de7f44ad43edfa981c Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Wed, 28 Jan 2026 15:53:01 -0500 Subject: [PATCH 7/9] Fix image name in smoke test to match Jib configuration --- .github/workflows/publish-images.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml index 8b73dab1..8bd2d336 100644 --- a/.github/workflows/publish-images.yml +++ b/.github/workflows/publish-images.yml @@ -47,7 +47,7 @@ jobs: # Start the server container docker run -d --name server-smoke-test \ -p 4242:4242 \ - typestream/server:latest + ghcr.io/typestreamio/server:latest # Wait for server to be ready (up to 30 seconds) echo "Waiting for server to start..." From 89c3a1c66f4d9349a69f8294102450d97934e301 Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Wed, 28 Jan 2026 16:06:26 -0500 Subject: [PATCH 8/9] Fixing duplicate build, adding proper health check, improving smoke tests, consistent tagging --- .github/workflows/publish-images.yml | 197 ++++++++++++++------------- 1 file changed, 103 insertions(+), 94 deletions(-) diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml index 8bd2d336..6cbb0e2c 100644 --- a/.github/workflows/publish-images.yml +++ b/.github/workflows/publish-images.yml @@ -13,11 +13,10 @@ env: REGISTRY: ghcr.io jobs: - # Build server image and run smoke test + # Build server image, run smoke test, save for publishing build-and-test-server: runs-on: ubuntu-latest - outputs: - image-tag: ${{ steps.meta.outputs.version }} + timeout-minutes: 30 steps: - uses: actions/checkout@v4 @@ -31,14 +30,6 @@ jobs: with: use-flakehub: false - - name: Extract metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/typestreamio/server - tags: | - type=semver,pattern={{version}} - - name: Build server image locally run: nix develop --command gradle :server:jibDockerBuild @@ -71,29 +62,40 @@ jobs: exit 1 fi + # Health check: verify gRPC port is responding + echo "Checking gRPC port..." + timeout 10 bash -c 'until nc -z localhost 4242; do sleep 1; done' || { + echo "gRPC port not responding" + docker logs server-smoke-test + exit 1 + } + echo "gRPC port is responding" + # Cleanup docker stop server-smoke-test docker rm server-smoke-test echo "Smoke test passed!" + - name: Save server image for publishing + run: docker save ghcr.io/typestreamio/server:latest | gzip > /tmp/server-image.tar.gz + + - name: Upload server image artifact + uses: actions/upload-artifact@v4 + with: + name: server-image + path: /tmp/server-image.tar.gz + retention-days: 1 + # Build and test demo-data build-and-test-demo-data: runs-on: ubuntu-latest + timeout-minutes: 20 steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Extract metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/typestreamio/demo-data - tags: | - type=semver,pattern={{version}} - type=sha,prefix= - - name: Build demo-data image uses: docker/build-push-action@v6 with: @@ -106,31 +108,41 @@ jobs: - name: Smoke test - demo-data container starts run: | - # Start the container with --help to verify it runs - docker run --rm demo-data:test --help || true + # Verify --help exits successfully + docker run --rm demo-data:test --help + echo "Help command works" + + # Verify coinbase generator starts (will fail on Kafka connection, but should not crash immediately) + OUTPUT=$(timeout 5 docker run --rm demo-data:test coinbase 2>&1 || true) + if echo "$OUTPUT" | grep -qE "(coinbase|Kafka|bootstrap)"; then + echo "Coinbase generator starts correctly" + else + echo "Unexpected output:" + echo "$OUTPUT" + exit 1 + fi + echo "Smoke test passed!" + + - name: Save demo-data image for publishing + run: docker save demo-data:test | gzip > /tmp/demo-data-image.tar.gz - # Verify container can start (will exit due to no Kafka, but should not crash immediately) - timeout 5 docker run --rm demo-data:test coinbase 2>&1 | head -20 || true - echo "Smoke test passed - container starts correctly" + - name: Upload demo-data image artifact + uses: actions/upload-artifact@v4 + with: + name: demo-data-image + path: /tmp/demo-data-image.tar.gz + retention-days: 1 # Build and test kafka-connect build-and-test-kafka-connect: runs-on: ubuntu-latest + timeout-minutes: 20 steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Extract metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/typestreamio/kafka-connect - tags: | - type=semver,pattern={{version}} - type=sha,prefix= - - name: Build kafka-connect image uses: docker/build-push-action@v6 with: @@ -148,26 +160,22 @@ jobs: "ls -la /kafka/connect/ && test -d /kafka/connect/debezium-connector-postgres" echo "Smoke test passed - Debezium connectors are installed" + - name: Save kafka-connect image for publishing + run: docker save kafka-connect:test | gzip > /tmp/kafka-connect-image.tar.gz + + - name: Upload kafka-connect image artifact + uses: actions/upload-artifact@v4 + with: + name: kafka-connect-image + path: /tmp/kafka-connect-image.tar.gz + retention-days: 1 + # Publish all images after smoke tests pass publish-images: runs-on: ubuntu-latest + timeout-minutes: 15 needs: [build-and-test-server, build-and-test-demo-data, build-and-test-kafka-connect] steps: - - uses: actions/checkout@v4 - - - name: Install Nix - uses: DeterminateSystems/nix-installer-action@v21 - with: - flakehub: false - - - name: Setup Magic Nix Cache - uses: DeterminateSystems/magic-nix-cache-action@v13 - with: - use-flakehub: false - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to GHCR uses: docker/login-action@v3 with: @@ -175,53 +183,54 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Download all image artifacts + uses: actions/download-artifact@v4 + with: + path: /tmp/images + # Publish server - - name: Build and push server image - run: nix develop --command gradle :server:jib - env: - GITHUB_ACTOR: ${{ github.actor }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Load and push server image + run: | + gunzip -c /tmp/images/server-image/server-image.tar.gz | docker load + + # Tag with version and SHA + VERSION="${GITHUB_REF_NAME#v}" + docker tag ghcr.io/typestreamio/server:latest ghcr.io/typestreamio/server:${VERSION} + docker tag ghcr.io/typestreamio/server:latest ghcr.io/typestreamio/server:${GITHUB_SHA::7} + + # Push all tags + docker push ghcr.io/typestreamio/server:latest + docker push ghcr.io/typestreamio/server:${VERSION} + docker push ghcr.io/typestreamio/server:${GITHUB_SHA::7} # Publish demo-data - - name: Extract demo-data metadata - id: demo-meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/typestreamio/demo-data - tags: | - type=raw,value=latest - type=semver,pattern={{version}} - type=sha,prefix= - - - name: Build and push demo-data - uses: docker/build-push-action@v6 - with: - context: . - file: connectors/demo-data/Dockerfile - push: true - tags: ${{ steps.demo-meta.outputs.tags }} - labels: ${{ steps.demo-meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max + - name: Load and push demo-data image + run: | + gunzip -c /tmp/images/demo-data-image/demo-data-image.tar.gz | docker load + + # Tag with proper names + VERSION="${GITHUB_REF_NAME#v}" + docker tag demo-data:test ghcr.io/typestreamio/demo-data:latest + docker tag demo-data:test ghcr.io/typestreamio/demo-data:${VERSION} + docker tag demo-data:test ghcr.io/typestreamio/demo-data:${GITHUB_SHA::7} + + # Push all tags + docker push ghcr.io/typestreamio/demo-data:latest + docker push ghcr.io/typestreamio/demo-data:${VERSION} + docker push ghcr.io/typestreamio/demo-data:${GITHUB_SHA::7} # Publish kafka-connect - - name: Extract kafka-connect metadata - id: kc-meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/typestreamio/kafka-connect - tags: | - type=raw,value=latest - type=semver,pattern={{version}} - type=sha,prefix= - - - name: Build and push kafka-connect - uses: docker/build-push-action@v6 - with: - context: . - file: docker/Dockerfile.kafka-connect - push: true - tags: ${{ steps.kc-meta.outputs.tags }} - labels: ${{ steps.kc-meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max + - name: Load and push kafka-connect image + run: | + gunzip -c /tmp/images/kafka-connect-image/kafka-connect-image.tar.gz | docker load + + # Tag with proper names + VERSION="${GITHUB_REF_NAME#v}" + docker tag kafka-connect:test ghcr.io/typestreamio/kafka-connect:latest + docker tag kafka-connect:test ghcr.io/typestreamio/kafka-connect:${VERSION} + docker tag kafka-connect:test ghcr.io/typestreamio/kafka-connect:${GITHUB_SHA::7} + + # Push all tags + docker push ghcr.io/typestreamio/kafka-connect:latest + docker push ghcr.io/typestreamio/kafka-connect:${VERSION} + docker push ghcr.io/typestreamio/kafka-connect:${GITHUB_SHA::7} From 1a724c527a5654062ea9421d26ac748a67d4da48 Mon Sep 17 00:00:00 2001 From: Jevin Maltais Date: Wed, 28 Jan 2026 16:14:14 -0500 Subject: [PATCH 9/9] Fixing version extraction for manual dispatch, specific grep pattern, and race condition --- .github/workflows/publish-images.yml | 53 +++++++++++++++++----------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml index 6cbb0e2c..eac710e3 100644 --- a/.github/workflows/publish-images.yml +++ b/.github/workflows/publish-images.yml @@ -43,10 +43,18 @@ jobs: # Wait for server to be ready (up to 30 seconds) echo "Waiting for server to start..." for i in {1..30}; do - if docker logs server-smoke-test 2>&1 | grep -q "started"; then + # First check container is still running + if ! docker ps | grep -q server-smoke-test; then + echo "Server container exited unexpectedly" + docker logs server-smoke-test + exit 1 + fi + + if docker logs server-smoke-test 2>&1 | grep -q "grpc server listening on port"; then echo "Server started successfully" break fi + if [ $i -eq 30 ]; then echo "Server failed to start in time" docker logs server-smoke-test @@ -55,13 +63,6 @@ jobs: sleep 1 done - # Check container is still running - if ! docker ps | grep -q server-smoke-test; then - echo "Server container exited unexpectedly" - docker logs server-smoke-test - exit 1 - fi - # Health check: verify gRPC port is responding echo "Checking gRPC port..." timeout 10 bash -c 'until nc -z localhost 4242; do sleep 1; done' || { @@ -192,12 +193,16 @@ jobs: - name: Load and push server image run: | gunzip -c /tmp/images/server-image/server-image.tar.gz | docker load - - # Tag with version and SHA - VERSION="${GITHUB_REF_NAME#v}" + + # Tag with version and SHA (handle manual dispatch vs tag trigger) + if [[ "$GITHUB_REF_TYPE" == "tag" ]]; then + VERSION="${GITHUB_REF_NAME#v}" + else + VERSION="dev-${GITHUB_SHA::7}" + fi docker tag ghcr.io/typestreamio/server:latest ghcr.io/typestreamio/server:${VERSION} docker tag ghcr.io/typestreamio/server:latest ghcr.io/typestreamio/server:${GITHUB_SHA::7} - + # Push all tags docker push ghcr.io/typestreamio/server:latest docker push ghcr.io/typestreamio/server:${VERSION} @@ -207,13 +212,17 @@ jobs: - name: Load and push demo-data image run: | gunzip -c /tmp/images/demo-data-image/demo-data-image.tar.gz | docker load - - # Tag with proper names - VERSION="${GITHUB_REF_NAME#v}" + + # Tag with version and SHA (handle manual dispatch vs tag trigger) + if [[ "$GITHUB_REF_TYPE" == "tag" ]]; then + VERSION="${GITHUB_REF_NAME#v}" + else + VERSION="dev-${GITHUB_SHA::7}" + fi docker tag demo-data:test ghcr.io/typestreamio/demo-data:latest docker tag demo-data:test ghcr.io/typestreamio/demo-data:${VERSION} docker tag demo-data:test ghcr.io/typestreamio/demo-data:${GITHUB_SHA::7} - + # Push all tags docker push ghcr.io/typestreamio/demo-data:latest docker push ghcr.io/typestreamio/demo-data:${VERSION} @@ -223,13 +232,17 @@ jobs: - name: Load and push kafka-connect image run: | gunzip -c /tmp/images/kafka-connect-image/kafka-connect-image.tar.gz | docker load - - # Tag with proper names - VERSION="${GITHUB_REF_NAME#v}" + + # Tag with version and SHA (handle manual dispatch vs tag trigger) + if [[ "$GITHUB_REF_TYPE" == "tag" ]]; then + VERSION="${GITHUB_REF_NAME#v}" + else + VERSION="dev-${GITHUB_SHA::7}" + fi docker tag kafka-connect:test ghcr.io/typestreamio/kafka-connect:latest docker tag kafka-connect:test ghcr.io/typestreamio/kafka-connect:${VERSION} docker tag kafka-connect:test ghcr.io/typestreamio/kafka-connect:${GITHUB_SHA::7} - + # Push all tags docker push ghcr.io/typestreamio/kafka-connect:latest docker push ghcr.io/typestreamio/kafka-connect:${VERSION}