This is an automated email from the ASF dual-hosted git repository.

hgruszecki pushed a commit to branch codecov
in repository https://gitbox.apache.org/repos/asf/iggy.git

commit ff2ab58d35266a52b76045c26a3b93951028ce03
Author: Hubert Gruszecki <[email protected]>
AuthorDate: Wed Feb 4 13:20:30 2026 +0100

    ci(rust): add code coverage reporting with Codecov
    
    Integrate cargo-llvm-cov into test runs and upload reports to
    Codecov. Coverage runs on pre-merge (PR comments) and post-merge
    (baseline tracking). Configured as informational-only to avoid
    blocking PRs on coverage changes.
---
 .github/actions/csharp-dotnet/pre-merge/action.yml |  2 -
 .github/actions/go/pre-merge/action.yml            |  2 -
 .github/actions/java-gradle/pre-merge/action.yml   |  2 -
 .github/actions/node-npm/pre-merge/action.yml      |  2 -
 .../actions/python-maturin/pre-merge/action.yml    |  2 -
 .github/actions/rust/post-merge/action.yml         |  2 -
 .github/actions/rust/pre-merge/action.yml          | 16 ++++-
 .../actions/utils/setup-go-with-cache/action.yml   |  2 +-
 .../actions/utils/setup-rust-with-cache/action.yml | 35 ++++++++--
 .github/workflows/_build_rust_artifacts.yml        |  6 ++
 .github/workflows/_common.yml                      |  2 +-
 .github/workflows/_test.yml                        | 15 +++++
 .github/workflows/_test_bdd.yml                    |  2 -
 .github/workflows/_test_examples.yml               |  2 -
 .github/workflows/post-merge.yml                   | 75 ++++++++++++++++++++++
 .github/workflows/pre-merge.yml                    |  4 +-
 codecov.yml                                        | 53 +++++++++++++++
 17 files changed, 197 insertions(+), 27 deletions(-)

diff --git a/.github/actions/csharp-dotnet/pre-merge/action.yml 
b/.github/actions/csharp-dotnet/pre-merge/action.yml
index 57c226633..035e8650b 100644
--- a/.github/actions/csharp-dotnet/pre-merge/action.yml
+++ b/.github/actions/csharp-dotnet/pre-merge/action.yml
@@ -35,8 +35,6 @@ runs:
     - name: Setup Rust with cache
       if: inputs.task == 'test' || inputs.task == 'e2e'
       uses: ./.github/actions/utils/setup-rust-with-cache
-      with:
-        shared-key: dev
 
     - name: Restore dependencies
       run: |
diff --git a/.github/actions/go/pre-merge/action.yml 
b/.github/actions/go/pre-merge/action.yml
index 3401ea3e2..dc0077a54 100644
--- a/.github/actions/go/pre-merge/action.yml
+++ b/.github/actions/go/pre-merge/action.yml
@@ -119,8 +119,6 @@ runs:
     - name: Setup Rust with cache for e2e
       if: inputs.task == 'e2e'
       uses: ./.github/actions/utils/setup-rust-with-cache
-      with:
-        shared-key: dev
 
     - name: Setup server for e2e tests
       if: inputs.task == 'e2e'
diff --git a/.github/actions/java-gradle/pre-merge/action.yml 
b/.github/actions/java-gradle/pre-merge/action.yml
index fe5565ca4..df02a52fc 100644
--- a/.github/actions/java-gradle/pre-merge/action.yml
+++ b/.github/actions/java-gradle/pre-merge/action.yml
@@ -79,8 +79,6 @@ runs:
     - name: Setup Rust with cache
       if: inputs.task == 'test'
       uses: ./.github/actions/utils/setup-rust-with-cache
-      with:
-        shared-key: dev
 
     - name: Start Iggy server
       if: inputs.task == 'test'
diff --git a/.github/actions/node-npm/pre-merge/action.yml 
b/.github/actions/node-npm/pre-merge/action.yml
index f6e2e5131..9b91e4057 100644
--- a/.github/actions/node-npm/pre-merge/action.yml
+++ b/.github/actions/node-npm/pre-merge/action.yml
@@ -37,8 +37,6 @@ runs:
     - name: Setup Rust with cache
       if: inputs.task == 'e2e'
       uses: ./.github/actions/utils/setup-rust-with-cache
-      with:
-        shared-key: dev
 
     - name: Install netcat
       if: inputs.task == 'e2e'
diff --git a/.github/actions/python-maturin/pre-merge/action.yml 
b/.github/actions/python-maturin/pre-merge/action.yml
index 6d25bf6c6..496810702 100644
--- a/.github/actions/python-maturin/pre-merge/action.yml
+++ b/.github/actions/python-maturin/pre-merge/action.yml
@@ -33,8 +33,6 @@ runs:
 
     - name: Setup Rust with cache
       uses: ./.github/actions/utils/setup-rust-with-cache
-      with:
-        shared-key: dev
 
     - name: Cache pip
       uses: actions/cache@v4
diff --git a/.github/actions/rust/post-merge/action.yml 
b/.github/actions/rust/post-merge/action.yml
index 909facf8e..3d592de53 100644
--- a/.github/actions/rust/post-merge/action.yml
+++ b/.github/actions/rust/post-merge/action.yml
@@ -35,8 +35,6 @@ runs:
   steps:
     - name: Setup Rust with cache
       uses: ./.github/actions/utils/setup-rust-with-cache
-      with:
-        enabled: "false"  # Post-merge runs infrequently, no need to cache
 
     - name: Validate package
       run: |
diff --git a/.github/actions/rust/pre-merge/action.yml 
b/.github/actions/rust/pre-merge/action.yml
index 9a01a0c98..6022e013a 100644
--- a/.github/actions/rust/pre-merge/action.yml
+++ b/.github/actions/rust/pre-merge/action.yml
@@ -44,7 +44,7 @@ runs:
     - name: Setup Rust with cache
       uses: ./.github/actions/utils/setup-rust-with-cache
       with:
-        shared-key: dev
+        print-cache-status: ${{ inputs.task == 'test' }}
 
     - name: Install tools for specific tasks
       run: |
@@ -99,9 +99,17 @@ runs:
         echo -n "test" | gnome-keyring-daemon --unlock
       shell: bash
 
-    - name: Build and test
+    - name: Install cargo-llvm-cov
+      if: inputs.task == 'test'
+      uses: taiki-e/install-action@v2
+      with:
+        tool: cargo-llvm-cov
+
+    - name: Build and test with coverage
       if: inputs.task == 'test'
       run: |
+        source <(cargo llvm-cov show-env --export-prefix)
+
         bins_start=$(date +%s)
         cargo build --locked
         bins_end=$(date +%s)
@@ -135,6 +143,10 @@ runs:
         echo "Total build:                   ${build_duration}s ($(date -ud 
@${build_duration} +'%M:%S'))"
         echo "Total time:                    ${total_duration}s ($(date -ud 
@${total_duration} +'%M:%S'))"
         echo "========================================="
+
+        cargo llvm-cov report --codecov --output-path codecov.json
+        echo "Coverage report generated: codecov.json"
+        ls -la codecov.json
       shell: bash
 
     - name: Backwards compatibility check
diff --git a/.github/actions/utils/setup-go-with-cache/action.yml 
b/.github/actions/utils/setup-go-with-cache/action.yml
index c0888bf01..e9d62a469 100644
--- a/.github/actions/utils/setup-go-with-cache/action.yml
+++ b/.github/actions/utils/setup-go-with-cache/action.yml
@@ -52,7 +52,7 @@ runs:
       uses: actions/setup-go@v5
       with:
         go-version: ${{ inputs.go-version }}
-        cache: ${{ inputs.enabled }}
+        cache: ${{ inputs.enabled == 'true' }}
         cache-dependency-path: ${{ inputs.cache-dependency-path }}
 
     - name: Setup additional Go module cache
diff --git a/.github/actions/utils/setup-rust-with-cache/action.yml 
b/.github/actions/utils/setup-rust-with-cache/action.yml
index ec0bb118d..f4972dfdc 100644
--- a/.github/actions/utils/setup-rust-with-cache/action.yml
+++ b/.github/actions/utils/setup-rust-with-cache/action.yml
@@ -19,14 +19,22 @@ name: setup-rust-with-cache
 description: Setup Rust toolchain with Swatinem/rust-cache
 
 inputs:
-  enabled:
-    description: "Whether to enable caching"
+  read-cache:
+    description: "Whether to read from cache"
     required: false
     default: "true"
   shared-key:
-    description: "Shared cache key across jobs (e.g., 'dev', 'dev-coverage')"
+    description: "Shared cache key across jobs"
     required: false
-    default: ""
+    default: "dev"
+  save-cache:
+    description: "Whether to save cache (true/false)"
+    required: false
+    default: "false"
+  print-cache-status:
+    description: "Whether to print cache status to job summary"
+    required: false
+    default: "false"
 
 runs:
   using: "composite"
@@ -49,10 +57,25 @@ runs:
       shell: bash
 
     - name: Setup Rust cache
-      if: inputs.enabled == 'true'
+      id: rust-cache
+      if: inputs.read-cache == 'true'
       uses: Swatinem/rust-cache@v2
       with:
         shared-key: ${{ inputs.shared-key }}
+        save-if: ${{ inputs.save-cache == 'true' }}
+
+    - name: Cache status
+      if: inputs.read-cache == 'true' && inputs.print-cache-status == 'true'
+      run: |
+        echo "### Rust Cache" >> $GITHUB_STEP_SUMMARY
+        if [ "${{ steps.rust-cache.outputs.cache-hit }}" == "true" ]; then
+          echo "✅ Cache hit" >> $GITHUB_STEP_SUMMARY
+        elif [ -d "target" ]; then
+          echo "🔶 Partial cache hit" >> $GITHUB_STEP_SUMMARY
+        else
+          echo "❌ Cache miss" >> $GITHUB_STEP_SUMMARY
+        fi
+      shell: bash
 
     - name: Install cargo-nextest
       if: runner.os == 'Linux'
@@ -79,7 +102,7 @@ runs:
       continue-on-error: true
 
     - name: Configure Cargo for CI
-      if: inputs.enabled == 'true'
+      if: inputs.read-cache == 'true'
       run: |
         echo "CARGO_INCREMENTAL=0" >> $GITHUB_ENV
         echo "CARGO_PROFILE_DEV_DEBUG=0" >> $GITHUB_ENV
diff --git a/.github/workflows/_build_rust_artifacts.yml 
b/.github/workflows/_build_rust_artifacts.yml
index e25bad3a1..ff4258883 100644
--- a/.github/workflows/_build_rust_artifacts.yml
+++ b/.github/workflows/_build_rust_artifacts.yml
@@ -138,6 +138,12 @@ jobs:
             export CFLAGS="-mno-outline-atomics"
           fi
 
+          # musl builds: use musl-gcc as linker to ensure proper linking 
against musl libc
+          if [[ "${{ matrix.libc }}" == "musl" ]]; then
+            export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc
+            export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc
+          fi
+
           cargo build --locked --release --target ${{ matrix.target }} 
"${bin_flags[@]}"
 
       - name: Package binaries
diff --git a/.github/workflows/_common.yml b/.github/workflows/_common.yml
index 87e809f72..3e2cc20cf 100644
--- a/.github/workflows/_common.yml
+++ b/.github/workflows/_common.yml
@@ -137,7 +137,7 @@ jobs:
       - name: Setup Rust toolchain
         uses: ./.github/actions/utils/setup-rust-with-cache
         with:
-          enabled: "false" # Don't need cache for just checking licenses
+          read-cache: "false"
 
       - name: Install cargo-license
         run: cargo install cargo-license
diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml
index c6a95ea71..6631e96f1 100644
--- a/.github/workflows/_test.yml
+++ b/.github/workflows/_test.yml
@@ -27,10 +27,14 @@ on:
         type: string
         required: true
         description: "Task to run"
+    secrets:
+      CODECOV_TOKEN:
+        required: false
 
 permissions:
   contents: read
   security-events: write
+  pull-requests: write
 
 jobs:
   run:
@@ -57,6 +61,16 @@ jobs:
           task: ${{ inputs.task }}
           component: ${{ inputs.component }}
 
+      - name: Upload coverage to Codecov
+        if: startsWith(inputs.component, 'rust') && inputs.task == 'test'
+        uses: codecov/codecov-action@v5
+        with:
+          token: ${{ secrets.CODECOV_TOKEN }}
+          files: codecov.json
+          flags: rust
+          fail_ci_if_error: false
+          verbose: true
+
       # Python SDK
       - name: Set up Docker Buildx for Python
         if: inputs.component == 'sdk-python' && inputs.task == 'test'
@@ -130,5 +144,6 @@ jobs:
             reports/**
             target/llvm-cov/**
             coverage.lcov
+            codecov.json
           if-no-files-found: ignore
           retention-days: 7
diff --git a/.github/workflows/_test_bdd.yml b/.github/workflows/_test_bdd.yml
index f949daaec..9c9c571f6 100644
--- a/.github/workflows/_test_bdd.yml
+++ b/.github/workflows/_test_bdd.yml
@@ -55,8 +55,6 @@ jobs:
       - name: Setup Rust with cache for BDD
         if: startsWith(inputs.component, 'bdd-') && startsWith(inputs.task, 
'bdd-')
         uses: ./.github/actions/utils/setup-rust-with-cache
-        with:
-          shared-key: dev
 
       - name: Build server for BDD tests
         if: startsWith(inputs.component, 'bdd-') && startsWith(inputs.task, 
'bdd-')
diff --git a/.github/workflows/_test_examples.yml 
b/.github/workflows/_test_examples.yml
index 64053ef30..8a611998d 100644
--- a/.github/workflows/_test_examples.yml
+++ b/.github/workflows/_test_examples.yml
@@ -46,8 +46,6 @@ jobs:
       - name: Setup Rust with cache for examples
         if: inputs.component == 'examples-suite'
         uses: ./.github/actions/utils/setup-rust-with-cache
-        with:
-          shared-key: dev
 
       - name: Setup Node with cache for examples
         if: inputs.component == 'examples-suite'
diff --git a/.github/workflows/post-merge.yml b/.github/workflows/post-merge.yml
index 4f6ea5c73..b422fc5ff 100644
--- a/.github/workflows/post-merge.yml
+++ b/.github/workflows/post-merge.yml
@@ -133,6 +133,28 @@ jobs:
       create_edge_docker_tag: true
     secrets: inherit
 
+  warm-cache:
+    name: Warm cache (${{ matrix.runner }})
+    runs-on: ${{ matrix.runner }}
+    strategy:
+      fail-fast: false
+      matrix:
+        # Don't cache ubuntu-24.04-arm due to size
+        runner: [ubuntu-latest, macos-14]
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Setup Rust with cache
+        uses: ./.github/actions/utils/setup-rust-with-cache
+        with:
+          save-cache: "true"
+
+      - name: Build
+        run: cargo build --locked
+
+      - name: Compile tests
+        run: cargo test --no-run --locked
+
   build-artifacts:
     name: Build artifacts
     uses: ./.github/workflows/_build_rust_artifacts.yml
@@ -140,6 +162,59 @@ jobs:
       version: edge
       upload_artifacts: true
 
+  coverage:
+    name: Coverage baseline
+    runs-on: ubuntu-latest
+    timeout-minutes: 45
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Cleanup disk space
+        run: sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc 
/opt/hostedtoolcache/CodeQL
+
+      - name: Install system dependencies
+        run: |
+          sudo apt-get update --yes
+          sudo apt-get install --yes gnome-keyring keyutils
+          rm -f $HOME/.local/share/keyrings/*
+          echo -n "test" | gnome-keyring-daemon --unlock
+
+      - name: Setup Rust with cache
+        uses: ./.github/actions/utils/setup-rust-with-cache
+        with:
+          save-cache: "true"
+
+      - name: Install cargo-llvm-cov
+        uses: taiki-e/install-action@v2
+        with:
+          tool: cargo-llvm-cov
+
+      - name: Build and test with coverage
+        run: |
+          source <(cargo llvm-cov show-env --export-prefix)
+          cargo build --locked
+          cargo test --locked --no-run
+          if command -v cargo-nextest &> /dev/null; then
+            cargo nextest run --locked --no-fail-fast
+          else
+            cargo test --locked --no-fail-fast
+          fi
+        shell: bash
+
+      - name: Generate coverage report
+        run: |
+          source <(cargo llvm-cov show-env --export-prefix)
+          cargo llvm-cov report --codecov --output-path codecov.json
+        shell: bash
+
+      - name: Upload to Codecov
+        uses: codecov/codecov-action@v5
+        with:
+          token: ${{ secrets.CODECOV_TOKEN }}
+          files: codecov.json
+          flags: rust
+          fail_ci_if_error: false
+
   create-prerelease:
     name: Create edge pre-release
     runs-on: ubuntu-latest
diff --git a/.github/workflows/pre-merge.yml b/.github/workflows/pre-merge.yml
index 98627b9dd..35c8dee28 100644
--- a/.github/workflows/pre-merge.yml
+++ b/.github/workflows/pre-merge.yml
@@ -28,7 +28,7 @@ concurrency:
 permissions:
   contents: read
   security-events: write
-  pull-requests: read
+  pull-requests: write
 
 jobs:
   # Common checks - always run
@@ -56,6 +56,8 @@ jobs:
     with:
       component: ${{ matrix.component }}
       task: ${{ matrix.task }}
+    secrets:
+      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
 
   # Python SDK
   test-python:
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 000000000..0cdb369b5
--- /dev/null
+++ b/codecov.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.
+
+codecov:
+  require_ci_to_pass: false
+
+coverage:
+  precision: 2
+  round: down
+  range: "50...90"
+  status:
+    project:
+      default:
+        informational: true
+        target: auto
+        threshold: 1%
+    patch:
+      default:
+        informational: true
+        target: 50%
+        threshold: 5%
+
+comment:
+  layout: "header, diff, flags, files"
+  behavior: default
+  require_changes: true
+  require_base: true
+  require_head: true
+
+ignore:
+  - "core/bench/**"
+  - "core/integration/**"
+  - "core/tools/**"
+  - "core/harness_derive/**"
+  - "bdd/**"
+  - "examples/**"
+  - "foreign/**"
+  - "web/**"
+  - "**/tests/**"

Reply via email to