This is an automated email from the ASF dual-hosted git repository.
rustyrazorblade pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra-sidecar.git
The following commit(s) were added to refs/heads/trunk by this push:
new 37a881fb CASSSIDECAR-365: Setup CI using GitHub Actions
37a881fb is described below
commit 37a881fbb4f3028af31c3fc11a80fc690e197f2e
Author: Jon Haddad <[email protected]>
AuthorDate: Tue Nov 11 15:54:33 2025 -0800
CASSSIDECAR-365: Setup CI using GitHub Actions
Add GitHub Actions CI/CD with Java 11 and 17.
Implements complete GitHub Actions pipeline:
Main CI (.github/workflows/ci.yml):
- Test matrix: Java 11/17/21 × Cassandra 4.0/4.1/5.0/5.1
- Cached dtest jar builds
- Lightweight + heavyweight integration tests
- Checkstyle/Javadoc disabled pending fixes
Artifact Publishing (.github/workflows/publish-test-artifacts.yml):
- Auto-publishes after successful trunk CI runs
- Docker: ghcr.io/apache/cassandra-sidecar:latest
- Tarball: GitHub release at 'test-artifacts' tag
Dependabot (.github/dependabot.yml):
- Weekly Gradle dependency updates
- Weekly GitHub Actions version updates
Patch by Jon Haddad; Reviewed by Yifan Cai for CASSSIDECAR-292
---
.github/dependabot.yml | 53 +++++
.github/workflows/ci.yml | 320 +++++++++++++++++++++++++++
.github/workflows/publish-test-artifacts.yml | 164 ++++++++++++++
3 files changed, 537 insertions(+)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..44f07e04
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,53 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+version: 2
+updates:
+ # Gradle dependencies
+ - package-ecosystem: "gradle"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ time: "09:00"
+ open-pull-requests-limit: 10
+ groups:
+ gradle-dependencies:
+ patterns:
+ - "*"
+ labels:
+ - "dependencies"
+ - "gradle"
+ commit-message:
+ prefix: "chore"
+ include: "scope"
+
+ # GitHub Actions versions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "monday"
+ time: "09:00"
+ open-pull-requests-limit: 5
+ labels:
+ - "dependencies"
+ - "github-actions"
+ commit-message:
+ prefix: "chore"
+ include: "scope"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..8eceb4be
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,320 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+name: CI
+
+on:
+ pull_request:
+ branches: [trunk]
+ push:
+ branches: [trunk]
+
+# Cancel in-progress runs for PRs when new commits are pushed
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
+
+permissions:
+ contents: read
+
+jobs:
+ # Build Cassandra dtest jars once for all test jobs to reuse
+ build-dtest-jars:
+ name: Build dtest jars
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v5
+
+ - name: Setup Java 11
+ uses: actions/setup-java@v5
+ with:
+ java-version: "11"
+ distribution: "temurin"
+ cache: "gradle"
+
+ - name: Install prerequisites
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y ant
+
+ - name: Setup network aliases for multi-node tests
+ run: |
+ for i in {2..20}; do
+ sudo ip addr add 127.0.0.$i/8 dev lo
+ done
+
+ - name: Cache dtest jars
+ id: cache-dtest-jars
+ uses: actions/cache@v4
+ with:
+ path: dtest-jars/
+ key: dtest-jars-${{ hashFiles('scripts/build-dtest-jars.sh',
'gradle/wrapper/gradle-wrapper.properties') }}
+
+ - name: Dtest jars cache status
+ run: |
+ if [ "${{ steps.cache-dtest-jars.outputs.cache-hit }}" == "true" ];
then
+ echo "✅ Dtest jars restored from cache (saves ~25 minutes)"
+ else
+ echo "⚠️ Cache miss - will build dtest jars (~25 minutes)"
+ fi
+
+ - name: Build dtest jars
+ if: steps.cache-dtest-jars.outputs.cache-hit != 'true'
+ run: |
+ ./scripts/build-dtest-jars.sh
+
+ - name: Upload dtest jars artifact
+ uses: actions/upload-artifact@v5
+ with:
+ name: dtest-jars
+ path: dtest-jars/
+ retention-days: 90
+
+ # Run unit tests with static analysis on all Java versions
+ unit-tests:
+ name: Unit tests (Java ${{ matrix.java }})
+ runs-on: ubuntu-latest
+ needs: build-dtest-jars
+ permissions:
+ contents: read
+ checks: write
+ strategy:
+ fail-fast: false
+ matrix:
+ java: ["11", "17"]
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v5
+
+ - name: Setup Java ${{ matrix.java }}
+ uses: actions/setup-java@v5
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: "temurin"
+ cache: "gradle"
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v5
+ with:
+ cache-read-only: ${{ github.ref != 'refs/heads/trunk' }}
+
+ - name: Download dtest jars
+ uses: actions/download-artifact@v5
+ with:
+ name: dtest-jars
+ path: dtest-jars/
+
+ - name: Run build with static analysis
+ run: |
+ ./gradlew build -x integrationTest -x checkstyleMain -x
checkstyleTest -x checkstyleTestFixtures -x javadoc --stacktrace
+ env:
+ CASSANDRA_DEP_DIR: ${{ github.workspace }}/dtest-jars
+
+ - name: Upload test results
+ if: always()
+ uses: actions/upload-artifact@v5
+ with:
+ name: unit-test-results-java-${{ matrix.java }}
+ path: |
+ **/build/test-results/test/**
+ **/build/reports/tests/
+ retention-days: 30
+
+ - name: Upload static analysis reports
+ if: always()
+ uses: actions/upload-artifact@v5
+ with:
+ name: static-analysis-reports-java-${{ matrix.java }}
+ path: |
+ **/build/reports/spotbugs/
+ **/build/reports/rat/
+ **/build/reports/jacoco/
+ retention-days: 30
+
+ # Run lightweight integration tests on full matrix
+ integration-tests-lightweight:
+ name: Integration tests lightweight (Java ${{ matrix.java }}, C* ${{
matrix.cassandra }})
+ runs-on: ubuntu-latest
+ needs: [build-dtest-jars, unit-tests]
+ permissions:
+ contents: read
+ checks: write
+ strategy:
+ fail-fast: false
+ matrix:
+ java: ["11", "17"]
+ cassandra: ["4.0", "4.1", "5.0", "5.1"]
+ include:
+ - cassandra: "4.0"
+ dtestVersion: "4.0.16"
+ - cassandra: "4.1"
+ dtestVersion: "4.1.6"
+ - cassandra: "5.0"
+ dtestVersion: "5.0.3"
+ - cassandra: "5.1"
+ dtestVersion: "5.1"
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v5
+
+ - name: Setup Java ${{ matrix.java }}
+ uses: actions/setup-java@v5
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: "temurin"
+ cache: "gradle"
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v5
+ with:
+ cache-read-only: ${{ github.ref != 'refs/heads/trunk' }}
+
+ - name: Install prerequisites
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y ant
+
+ - name: Setup network aliases for multi-node tests
+ run: |
+ for i in {2..20}; do
+ sudo ip addr add 127.0.0.$i/8 dev lo
+ done
+
+ - name: Download dtest jars
+ uses: actions/download-artifact@v5
+ with:
+ name: dtest-jars
+ path: dtest-jars/
+
+ - name: Install dtest jars to local Maven
+ run: |
+ ./scripts/install-shaded-dtest-jar-local.sh
+ env:
+ CASSANDRA_DEP_DIR: ${{ github.workspace }}/dtest-jars
+
+ - name: Run lightweight integration tests
+ run: |
+ ./gradlew --no-daemon \
+ -PdtestVersion=${{ matrix.dtestVersion }} \
+ -Dcassandra.sidecar.versions_to_test="${{ matrix.cassandra }}" \
+ integrationTestLightWeight \
+ --stacktrace
+ env:
+ CASSANDRA_DEP_DIR: ${{ github.workspace }}/dtest-jars
+ INTEGRATION_MAX_PARALLEL_FORKS: 3
+ INTEGRATION_MAX_HEAP_SIZE: 2500M
+
+ - name: Upload test results
+ if: always()
+ uses: actions/upload-artifact@v5
+ with:
+ name: integration-lightweight-results-java-${{ matrix.java
}}-cassandra-${{ matrix.cassandra }}
+ path: |
+ **/build/test-results/integrationTest*/**
+ **/build/reports/tests/integrationTest*/
+ retention-days: 30
+
+ # Run heavyweight integration tests on full matrix
+ integration-tests-heavyweight:
+ name: Integration tests heavyweight (Java ${{ matrix.java }}, C* ${{
matrix.cassandra }})
+ runs-on: ubuntu-latest
+ needs: [build-dtest-jars, unit-tests]
+ permissions:
+ contents: read
+ checks: write
+ strategy:
+ fail-fast: false
+ matrix:
+ java: ["11", "17"]
+ cassandra: ["4.0", "4.1", "5.0", "5.1"]
+ include:
+ - cassandra: "4.0"
+ dtestVersion: "4.0.16"
+ - cassandra: "4.1"
+ dtestVersion: "4.1.6"
+ - cassandra: "5.0"
+ dtestVersion: "5.0.3"
+ - cassandra: "5.1"
+ dtestVersion: "5.1"
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v5
+
+ - name: Setup Java ${{ matrix.java }}
+ uses: actions/setup-java@v5
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: "temurin"
+ cache: "gradle"
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v5
+ with:
+ cache-read-only: ${{ github.ref != 'refs/heads/trunk' }}
+
+ - name: Install prerequisites
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y ant
+
+ - name: Setup network aliases for multi-node tests
+ run: |
+ for i in {2..20}; do
+ sudo ip addr add 127.0.0.$i/8 dev lo
+ done
+
+ - name: Download dtest jars
+ uses: actions/download-artifact@v5
+ with:
+ name: dtest-jars
+ path: dtest-jars/
+
+ - name: Install dtest jars to local Maven
+ run: |
+ ./scripts/install-shaded-dtest-jar-local.sh
+ env:
+ CASSANDRA_DEP_DIR: ${{ github.workspace }}/dtest-jars
+
+ - name: Run heavyweight integration tests
+ run: |
+ ./gradlew --no-daemon \
+ -PdtestVersion=${{ matrix.dtestVersion }} \
+ -Dcassandra.sidecar.versions_to_test="${{ matrix.cassandra }}" \
+ integrationTestHeavyWeight \
+ --stacktrace
+ env:
+ CASSANDRA_DEP_DIR: ${{ github.workspace }}/dtest-jars
+ INTEGRATION_MAX_PARALLEL_FORKS: 3
+ INTEGRATION_MAX_HEAP_SIZE: 3600M
+
+ - name: Upload test results
+ if: always()
+ uses: actions/upload-artifact@v5
+ with:
+ name: integration-heavyweight-results-java-${{ matrix.java
}}-cassandra-${{ matrix.cassandra }}
+ path: |
+ **/build/test-results/integrationTest*/**
+ **/build/reports/tests/integrationTest*/
+ retention-days: 30
diff --git a/.github/workflows/publish-test-artifacts.yml
b/.github/workflows/publish-test-artifacts.yml
new file mode 100644
index 00000000..f350b6b2
--- /dev/null
+++ b/.github/workflows/publish-test-artifacts.yml
@@ -0,0 +1,164 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+name: Publish Test Artifacts
+
+on:
+ workflow_run:
+ workflows: ["CI"]
+ types:
+ - completed
+ branches:
+ - trunk
+ workflow_dispatch:
+ # Allow manual triggering for testing
+
+permissions:
+ contents: write # Required for creating releases
+ packages: write # Required for pushing to GHCR
+
+jobs:
+ # Build and publish test artifacts after successful CI
+ publish:
+ name: Publish test artifacts
+ runs-on: ubuntu-latest
+ if: ${{ github.event.workflow_run.conclusion == 'success' ||
github.event_name == 'workflow_dispatch' }}
+ permissions:
+ contents: write
+ packages: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v5
+
+ - name: Setup Java 11
+ uses: actions/setup-java@v5
+ with:
+ java-version: '11'
+ distribution: 'temurin'
+ cache: 'gradle'
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v5
+
+ - name: Get version
+ id: version
+ run: |
+ VERSION=$(grep "^version=" gradle.properties | cut -d'=' -f2)
+ COMMIT_SHORT=$(git rev-parse --short HEAD)
+ BUILD_DATE=$(date -u +"%Y%m%d")
+ TEST_VERSION="${VERSION}-test-${BUILD_DATE}-${COMMIT_SHORT}"
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
+ echo "test_version=$TEST_VERSION" >> $GITHUB_OUTPUT
+ echo "commit_short=$COMMIT_SHORT" >> $GITHUB_OUTPUT
+ echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT
+ echo "Building test artifact version: $TEST_VERSION"
+
+ - name: Build distribution tarball
+ run: |
+ ./gradlew distTar --stacktrace
+ env:
+ SKIP_SIGNING: true
+
+ - name: Rename tarball
+ run: |
+ ORIGINAL=$(find build/distributions -name "*.tar.gz" -type f | head
-n 1)
+ TEST_NAME="apache-cassandra-sidecar-${{
steps.version.outputs.test_version }}.tar.gz"
+ cp "$ORIGINAL" "$TEST_NAME"
+ echo "Created test artifact tarball: $TEST_NAME"
+ ls -lh "$TEST_NAME"
+
+ - name: Build and push Docker image (latest tag)
+ run: |
+ ./gradlew :server:jib \
+ -Djib.to.image=ghcr.io/apache/cassandra-sidecar:latest \
+ -Djib.to.auth.username=${{ github.actor }} \
+ -Djib.to.auth.password=${{ secrets.GITHUB_TOKEN }} \
+ --stacktrace
+ env:
+ SKIP_SIGNING: true
+
+ - name: Delete existing test-artifacts release
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ gh release delete test-artifacts --yes --repo ${{ github.repository
}} || true
+ git push --delete origin test-artifacts || true
+
+ - name: Create test artifacts release
+ uses: softprops/action-gh-release@v2
+ with:
+ tag_name: test-artifacts
+ name: "Test Artifacts - ${{ steps.version.outputs.build_date }}"
+ prerelease: true
+ draft: false
+ body: |
+ ## Test Artifacts (Not an Official Release)
+
+ **⚠️ These are automated test artifacts built after successful CI
runs. They are NOT official releases.**
+
+ This contains test builds of Apache Cassandra Sidecar from the
`trunk` branch after all CI tests pass.
+
+ ### Build Information
+
+ - **Version**: ${{ steps.version.outputs.test_version }}
+ - **Base Version**: ${{ steps.version.outputs.version }}
+ - **Commit**: ${{ steps.version.outputs.commit_short }} (${{
github.sha }})
+ - **Build Date**: ${{ steps.version.outputs.build_date }}
+ - **Workflow Run**: ${{ github.server_url }}/${{ github.repository
}}/actions/runs/${{ github.run_id }}
+ - **CI Run**: ${{ github.event.workflow_run.html_url }}
+
+ ### Test Coverage
+
+ All tests passed before creating these artifacts:
+ - ✅ Unit tests (Java 11, 17, 21)
+ - ✅ Lightweight integration tests (Java 11, 17, 21 × Cassandra
4.0, 4.1, 5.0, 5.1)
+ - ✅ Heavyweight integration tests (Java 11, 17, 21 × Cassandra
4.0, 4.1, 5.0, 5.1)
+ - ✅ Static analysis (SpotBugs, Apache RAT, JaCoCo)
+
+ ### Artifacts
+
+ - **Distribution Tarball**: `apache-cassandra-sidecar-${{
steps.version.outputs.test_version }}.tar.gz`
+ - **Docker Image**: `ghcr.io/apache/cassandra-sidecar:latest`
+
+ ### Download URLs
+
+ These URLs always point to the latest test artifacts:
+
+ ```
+ https://github.com/${{ github.repository
}}/releases/download/test-artifacts/apache-cassandra-sidecar-${{
steps.version.outputs.test_version }}.tar.gz
+ ```
+
+ Docker pull:
+ ```bash
+ docker pull ghcr.io/apache/cassandra-sidecar:latest
+ ```
+
+ ### Usage
+
+ These artifacts are suitable for:
+ - Testing and development
+ - Integration testing
+ - Preview of upcoming changes
+
+ ---
+
+ **Note**: These are test artifacts, not official releases. Do not
use in production.
+ files: |
+ apache-cassandra-sidecar-${{ steps.version.outputs.test_version
}}.tar.gz
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]