From 0261a07fc2be3431fff14b2e2d23417f52694f2f Mon Sep 17 00:00:00 2001 From: Charles GTE Date: Sat, 6 Jun 2026 20:59:30 +0200 Subject: [PATCH] fix: test ci --- .github/workflows/codecov.yml | 37 +++++++++---------- .../api/endpoints/agent/backup/mod.rs | 4 ++ src/services/backup/executor.rs | 9 +++-- src/services/backup/result.rs | 2 + 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 904edf0..b4c7869 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -16,15 +16,11 @@ env: jobs: coverage: runs-on: ubuntu-latest + steps: - uses: actions/checkout@v4 - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - with: - components: llvm-tools-preview - - - name: Build test image (with grcov included) + - name: Build test image run: docker compose -f docker-compose.test.yml build agent-test - name: Start agent-test container @@ -32,28 +28,32 @@ jobs: - name: Run tests inside container run: | - docker compose -f docker-compose.test.yml exec \ + docker compose -f docker-compose.test.yml exec -T \ -e CARGO_TARGET_DIR \ -e CARGO_INCREMENTAL \ -e RUSTFLAGS \ -e LLVM_PROFILE_FILE \ agent-test bash -c " - rm -rf /app/target/* && + mkdir -p /app/coverage && + rm -rf /app/target/* /app/coverage/* && cargo test --verbose && sync " - name: Verify profraw files exist run: | - docker compose -f docker-compose.test.yml exec \ - -e LLVM_PROFILE_FILE \ - agent-test find /app/coverage -type f -name "*.profraw" | wc -l || true + docker compose -f docker-compose.test.yml exec -T \ + agent-test bash -c ' + count=$(find /app/coverage -type f -name "*.profraw" | wc -l) + echo "profraw files: $count" + test "$count" -gt 0 + ' - name: Generate coverage report inside container run: | - docker compose -f docker-compose.test.yml exec \ + docker compose -f docker-compose.test.yml exec -T \ agent-test bash -c " - rustup component add llvm-tools && + rustup component add llvm-tools-preview && grcov /app/coverage \ --binary-path /app/target/debug \ -s /app \ @@ -62,20 +62,17 @@ jobs: --branch \ --ignore-not-existing \ --ignore '/app/target/*' \ - --ignore '/*' \ -o /app/lcov.info " - name: Copy lcov.info from container to host run: docker compose -f docker-compose.test.yml cp agent-test:/app/lcov.info ./lcov.info - - name: Show basic coverage report info (debug) + - name: Show basic coverage report info run: | echo "lcov.info size:" $(wc -c ./lcov.info | awk '{print $1}') head -n 30 ./lcov.info || true - - - name: Import Codecov GPG key - run: curl -s https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --import + test -s ./lcov.info - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 @@ -85,8 +82,8 @@ jobs: name: rust-unit-coverage verbose: true fail_ci_if_error: true - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + token: ${{ secrets.CODECOV_TOKEN }} - name: Stop and remove container + if: always() run: docker compose -f docker-compose.test.yml down --volumes \ No newline at end of file diff --git a/src/services/api/endpoints/agent/backup/mod.rs b/src/services/api/endpoints/agent/backup/mod.rs index cd482d8..f47764c 100644 --- a/src/services/api/endpoints/agent/backup/mod.rs +++ b/src/services/api/endpoints/agent/backup/mod.rs @@ -23,6 +23,8 @@ pub struct BackupUpdateRequest { #[serde(rename = "generatedId")] pub generated_id: String, pub logs: Vec, + #[serde(rename = "durationMs")] + pub duration_ms: f64, } impl ApiClient { @@ -52,6 +54,7 @@ impl ApiClient { file_size: impl Into>, generated_id: impl Into, job_logs: Vec, + duration_ms: f64, ) -> Result, ApiError> { let body = BackupUpdateRequest { backup_id: backup_id.into(), @@ -59,6 +62,7 @@ impl ApiClient { size: file_size.into(), generated_id: generated_id.into(), logs: job_logs, + duration_ms: duration_ms, }; let agent_id = agent_id.into(); diff --git a/src/services/backup/executor.rs b/src/services/backup/executor.rs index 4e157c8..018eed9 100644 --- a/src/services/backup/executor.rs +++ b/src/services/backup/executor.rs @@ -7,6 +7,7 @@ use crate::utils::locks::FileLock; use anyhow::Result; use std::sync::Arc; +use std::time::Instant; use tempfile::TempDir; impl BackupService { @@ -23,7 +24,7 @@ impl BackupService { if FileLock::is_locked(&generated_id).await? { anyhow::bail!("backup already running"); } - + let start = Instant::now(); logger.log("info", "Database backup job started".to_string()); let backup = self.create_backup_record(&generated_id, &method).await?; @@ -35,8 +36,9 @@ impl BackupService { let mut result = Self::run(db_cfg, tmp_path, Arc::clone(&logger)).await?; if result.status == "failed" { + let duration_ms = start.elapsed().as_millis() as f64; let logs = Arc::try_unwrap(logger).unwrap_or_else(|_| JobLogger::new()).into_entries(); - self.send_result(result, vec![], &backup_id, logs).await?; + self.send_result(result, vec![], &backup_id, logs, duration_ms).await?; return Ok(()); } @@ -49,8 +51,9 @@ impl BackupService { logger.log("info", "Database backup job finished".to_string()); + let duration_ms = start.elapsed().as_millis() as f64; let logs = Arc::try_unwrap(logger).unwrap_or_else(|_| JobLogger::new()).into_entries(); - self.send_result(result, uploads, &backup_id, logs).await?; + self.send_result(result, uploads, &backup_id, logs, duration_ms).await?; Ok(()) } diff --git a/src/services/backup/result.rs b/src/services/backup/result.rs index 74dc8bf..b5ed574 100644 --- a/src/services/backup/result.rs +++ b/src/services/backup/result.rs @@ -13,6 +13,7 @@ impl BackupService { upload_results: Vec, backup_id: &String, logs: Vec, + duration_ms: f64, ) -> Result, ApiError> { let status = if upload_results.iter().any(|r| r.success) { "success" @@ -37,6 +38,7 @@ impl BackupService { file_size, &result.generated_id, logs, + duration_ms ) .await .map_err(|e| {