From 614d938625adf0bce8cc04e3908fff1a1e55a106 Mon Sep 17 00:00:00 2001 From: Baptiste Roux Date: Sun, 12 Oct 2025 16:32:57 +0200 Subject: [PATCH 1/7] fix(ci): use cross-rs/cross for cross-compilation --- .github/workflows/release.yml | 83 +++++++++++++++++++++++++++-------- Cargo.toml | 3 -- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b3bc226..c4c4edd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,20 +9,53 @@ permissions: contents: write jobs: + # Run checks once before building + check: + name: Check + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + + - name: Install required tools + uses: jdx/mise-action@e3d7b8d67a7958d1207f6ed871e83b1ea780e7b0 # v3.3.1 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - name: Check formatting + run: cargo fmt --check + + - name: Run clippy + run: cargo clippy --all-targets --all-features -- -D warnings + + - name: Run tests + run: cargo nextest run --profile ci + build-release-artifacts: name: Build release artifacts + needs: check runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu + use-cross: false - os: ubuntu-latest target: aarch64-unknown-linux-gnu + use-cross: true - os: macos-latest target: x86_64-apple-darwin + use-cross: false - os: macos-latest target: aarch64-apple-darwin + use-cross: false + - os: windows-latest + target: x86_64-pc-windows-msvc + use-cross: false steps: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 @@ -34,46 +67,58 @@ jobs: uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: ~/.cargo/registry - key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + key: ${{ runner.os }}-${{ matrix.target }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: ~/.cargo/git - key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} + key: ${{ runner.os }}-${{ matrix.target }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: target - key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} + key: ${{ runner.os }}-${{ matrix.target }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - name: Install ${{ matrix.target }} toolchain uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - - name: Install cross-compilation tools - if: matrix.target == 'aarch64-unknown-linux-gnu' - run: | - sudo apt-get update - sudo apt-get install -y gcc-aarch64-linux-gnu - - - name: Check formatting - run: cargo fmt --check + - name: Install cross + if: matrix.use-cross + run: cargo install cross --git https://github.com/cross-rs/cross - - name: Run clippy - run: cargo clippy -- -D warnings + - name: Build release binary + run: | + if [ "${{ matrix.use-cross }}" == "true" ]; then + cross build --release --locked --target ${{ matrix.target }} + else + cargo build --release --locked --target ${{ matrix.target }} + fi + shell: bash - - name: Run tests - run: cargo nextest run --profile ci --target ${{ matrix.target }} + - name: Prepare binary (Unix) + if: runner.os != 'Windows' + run: | + cd target/${{ matrix.target }}/release + mv mk mk-${GITHUB_REF_NAME#v}-${{ matrix.target }} - - name: Build release binary + - name: Prepare binary (Windows) + if: runner.os == 'Windows' run: | - cargo build --release --locked --target ${{ matrix.target }} - mv target/${{ matrix.target }}/release/mk target/${{ matrix.target }}/release/mk-${GITHUB_REF_NAME#v}-${{ matrix.target }} + cd target/${{ matrix.target }}/release + mv mk.exe mk-${GITHUB_REF_NAME#v}-${{ matrix.target }}.exe + shell: bash - name: Upload Release Artifact env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh release upload ${{ github.ref_name }} ./target/${{ matrix.target }}/release/mk-${GITHUB_REF_NAME#v}-${{ matrix.target }} + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + gh release upload ${{ github.ref_name }} ./target/${{ matrix.target }}/release/mk-${GITHUB_REF_NAME#v}-${{ matrix.target }}.exe + else + gh release upload ${{ github.ref_name }} ./target/${{ matrix.target }}/release/mk-${GITHUB_REF_NAME#v}-${{ matrix.target }} + fi + shell: bash diff --git a/Cargo.toml b/Cargo.toml index 6a55894..605954d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,3 @@ serial_test = "=3.2.0" strip = true lto = true codegen-units = 1 - -[target.aarch64-unknown-linux-gnu] -linker = "aarch64-linux-gnu-gcc" From b569582c6ecfd9582bba0263368095804ef9e2f7 Mon Sep 17 00:00:00 2001 From: Baptiste Roux Date: Sun, 12 Oct 2025 16:34:33 +0200 Subject: [PATCH 2/7] chore: tempo test release --- .github/workflows/build.yml | 213 --------------------------- .github/workflows/release-please.yml | 19 --- .github/workflows/release.yml | 14 +- 3 files changed, 7 insertions(+), 239 deletions(-) delete mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/release-please.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 435246d..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,213 +0,0 @@ -name: Build and Test - -on: - pull_request: - branches: - - main - paths: - - Cargo.lock - - Cargo.toml - - mise.toml - - src/** - - tests/** - -permissions: - pull-requests: write - -jobs: - test: - name: Test - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest] - steps: - - name: Checkout code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - - name: Install required tools - uses: jdx/mise-action@e3d7b8d67a7958d1207f6ed871e83b1ea780e7b0 # v3.3.1 - - - name: Cache cargo registry - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.cargo/registry - key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache cargo index - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.cargo/git - key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache cargo build - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: target - key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - - - name: Check formatting - run: cargo fmt --check - - - name: Run clippy - run: cargo clippy -- -D warnings - - - name: Run tests with nextest - id: nextest - env: - NEXTEST_EXPERIMENTAL_LIBTEST_JSON: "1" - run: | - cargo nextest run --profile ci --message-format libtest-json-plus | tee nextest-results.json - # Parse libtest-json-plus output for test results using jq - # Sum up results from all suite completion events - if [ -f nextest-results.json ]; then - PASSED=$(jq -s '[.[] | select(.type=="suite" and .event=="ok") | .passed] | add // 0' nextest-results.json) - FAILED=$(jq -s '[.[] | select(.type=="suite" and .event=="ok") | .failed] | add // 0' nextest-results.json) - SKIPPED=$(jq -s '[.[] | select(.type=="suite" and .event=="ok") | .ignored] | add // 0' nextest-results.json) - TOTAL=$((PASSED + FAILED + SKIPPED)) - else - TOTAL=0 - PASSED=0 - FAILED=0 - SKIPPED=0 - fi - echo "total=$TOTAL" >> $GITHUB_OUTPUT - echo "passed=$PASSED" >> $GITHUB_OUTPUT - echo "failed=$FAILED" >> $GITHUB_OUTPUT - echo "skipped=$SKIPPED" >> $GITHUB_OUTPUT - - - name: Comment PR with results - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const total = '${{ steps.nextest.outputs.total }}'; - const passed = '${{ steps.nextest.outputs.passed }}'; - const failed = '${{ steps.nextest.outputs.failed }}'; - const skipped = '${{ steps.nextest.outputs.skipped }}'; - - const body = `## ๐Ÿงช Test Results - - | Metric | Value | - |--------|-------| - | โœ… Passed | ${passed}/${total} | - | โŒ Failed | ${failed} | - | โญ๏ธ Skipped | ${skipped} | - - --- - *Generated by cargo-nextest*`; - - const { data: comments } = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - }); - - const botComment = comments.find(comment => - comment.user.type === 'Bot' && - comment.body.includes('๐Ÿงช Test Results') - ); - - if (botComment) { - await github.rest.issues.updateComment({ - owner: context.repo.owner, - repo: context.repo.repo, - comment_id: botComment.id, - body: body - }); - } else { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: body - }); - } - - coverage: - name: Coverage - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - - name: Install required tools - uses: jdx/mise-action@e3d7b8d67a7958d1207f6ed871e83b1ea780e7b0 # v3.3.1 - - - name: Cache cargo registry - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.cargo/registry - key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache cargo index - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: ~/.cargo/git - key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache cargo build - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 - with: - path: target - key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - - - name: Generate coverage report - id: coverage - run: | - OUTPUT=$(cargo tarpaulin --verbose --all-features --workspace --timeout 120 --out Html --out Xml --output-dir ./coverage 2>&1) - COVERAGE=$(echo "$OUTPUT" | grep -oP '\d+\.\d+(?=% coverage)' | head -1) - echo "percentage=$COVERAGE" >> $GITHUB_OUTPUT - - - name: Upload coverage reports - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: coverage-report - path: | - coverage/ - retention-days: 30 - - - name: Comment PR with results - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const coverage = '${{ steps.coverage.outputs.percentage }}'; - - const body = `## ๐Ÿ“Š Coverage Report - - | Metric | Value | - |--------|-------| - | ๐Ÿ“Š Coverage | ${coverage}% | - - [๐Ÿ“ฅ Download Full Coverage Report](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) - - --- - *Generated by cargo-tarpaulin*`; - - const { data: comments } = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - }); - - const botComment = comments.find(comment => - comment.user.type === 'Bot' && - comment.body.includes('๐Ÿ“Š Coverage Report') - ); - - if (botComment) { - await github.rest.issues.updateComment({ - owner: context.repo.owner, - repo: context.repo.repo, - comment_id: botComment.id, - body: body - }); - } else { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: body - }); - } diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml deleted file mode 100644 index e2c97b0..0000000 --- a/.github/workflows/release-please.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Release Please - -on: - push: - branches: - - main - -permissions: - contents: write - pull-requests: write - -jobs: - release-please: - runs-on: ubuntu-latest - steps: - - name: Run Release Please - uses: googleapis/release-please-action@c2a5a2bd6a758a0937f1ddb1e8950609867ed15c # v4 - with: - token: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c4c4edd..72936c3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,9 +1,9 @@ name: Build and publish release artifacts on: - push: - tags: - - v\d+.\d+.\d+ + pull_request: + branches: + - main permissions: contents: write @@ -103,13 +103,13 @@ jobs: if: runner.os != 'Windows' run: | cd target/${{ matrix.target }}/release - mv mk mk-${GITHUB_REF_NAME#v}-${{ matrix.target }} + mv mk mk-0.5.4-${{ matrix.target }} - name: Prepare binary (Windows) if: runner.os == 'Windows' run: | cd target/${{ matrix.target }}/release - mv mk.exe mk-${GITHUB_REF_NAME#v}-${{ matrix.target }}.exe + mv mk.exe mk-0.5.4-${{ matrix.target }}.exe shell: bash - name: Upload Release Artifact @@ -117,8 +117,8 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | if [ "${{ runner.os }}" == "Windows" ]; then - gh release upload ${{ github.ref_name }} ./target/${{ matrix.target }}/release/mk-${GITHUB_REF_NAME#v}-${{ matrix.target }}.exe + gh release upload v0.5.4 ./target/${{ matrix.target }}/release/mk-0.5.4-${{ matrix.target }}.exe else - gh release upload ${{ github.ref_name }} ./target/${{ matrix.target }}/release/mk-${GITHUB_REF_NAME#v}-${{ matrix.target }} + gh release upload v0.5.4 ./target/${{ matrix.target }}/release/mk-0.5.4-${{ matrix.target }} fi shell: bash From 1feb193fc1c4b3d7cdadddd2b14ebf817b832a9f Mon Sep 17 00:00:00 2001 From: Baptiste Roux Date: Sun, 12 Oct 2025 16:39:59 +0200 Subject: [PATCH 3/7] ci: add cache --- .github/workflows/release.yml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 72936c3..1ae665f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,6 +17,24 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - name: Cache cargo registry + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-${{ matrix.target }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo index + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-${{ matrix.target }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo build + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: target + key: ${{ runner.os }}-${{ matrix.target }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} + - name: Install required tools uses: jdx/mise-action@e3d7b8d67a7958d1207f6ed871e83b1ea780e7b0 # v3.3.1 @@ -60,9 +78,6 @@ jobs: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 - - name: Install required tools - uses: jdx/mise-action@e3d7b8d67a7958d1207f6ed871e83b1ea780e7b0 # v3.3.1 - - name: Cache cargo registry uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: From 91bda2a39636a97ef22651e2e9edded30fdd4bd9 Mon Sep 17 00:00:00 2001 From: Baptiste Roux Date: Sun, 12 Oct 2025 16:41:45 +0200 Subject: [PATCH 4/7] fix: apply clippy suggestions --- tests/ansible_tests.rs | 18 +++++++++--------- tests/bump_tests.rs | 2 +- tests/cli_tests.rs | 32 ++++++++++++++++---------------- tests/config_tests.rs | 22 +++++++++++----------- tests/dependency_tests.rs | 16 ++++++++-------- tests/drift_tests.rs | 24 ++++++++++++------------ tests/duplicate_tests.rs | 18 +++++++++--------- tests/recursive_bump_tests.rs | 24 ++++++++++++------------ 8 files changed, 78 insertions(+), 78 deletions(-) diff --git a/tests/ansible_tests.rs b/tests/ansible_tests.rs index f389259..2d9cff6 100644 --- a/tests/ansible_tests.rs +++ b/tests/ansible_tests.rs @@ -26,7 +26,7 @@ fn create_ansible_project(temp_dir: &TempDir, env: &str) -> String { fs::write( inventories_dir.join(format!("{}.yml", env)), - format!("all:\\n hosts:\\n server1:\\n ansible_host: 10.0.0.1\\n"), + "all:\\n hosts:\\n server1:\\n ansible_host: 10.0.0.1\\n", ) .unwrap(); @@ -49,7 +49,7 @@ fn test_ansible_list_command() { Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["list", ".", "dev"]) + .args(["list", ".", "dev"]) .assert() .success(); } @@ -70,7 +70,7 @@ fn test_ansible_list_with_environment() { let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["list", ".", "dev"]) + .args(["list", ".", "dev"]) .output() .unwrap(); @@ -85,7 +85,7 @@ fn test_ansible_list_invalid_environment() { Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["list", ".", "nonexistent"]) + .args(["list", ".", "nonexistent"]) .assert() .failure() .stderr(predicate::str::contains("not found").or(predicate::str::contains("Invalid"))); @@ -99,7 +99,7 @@ fn test_ansible_list_shows_command() { let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["list", ".", "dev"]) + .args(["list", ".", "dev"]) .output() .unwrap(); @@ -118,7 +118,7 @@ fn test_ansible_apply_command() { let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["apply", ".", "dev"]) + .args(["apply", ".", "dev"]) .output() .unwrap(); @@ -139,7 +139,7 @@ fn test_ansible_apply_with_check_option() { let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["apply", ".", "dev", "--", "--check"]) + .args(["apply", ".", "dev", "--", "--check"]) .output() .unwrap(); @@ -161,7 +161,7 @@ fn test_ansible_not_in_ansible_directory() { Command::cargo_bin("mk") .unwrap() .current_dir(temp_dir.path()) - .args(&["list", ".", "dev"]) + .args(["list", ".", "dev"]) .assert() .failure() .stderr( @@ -190,7 +190,7 @@ fn test_ansible_multiple_environments_available() { let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["list", ".", "dev"]) + .args(["list", ".", "dev"]) .output() .unwrap(); diff --git a/tests/bump_tests.rs b/tests/bump_tests.rs index 8fa15cf..7c8ebff 100644 --- a/tests/bump_tests.rs +++ b/tests/bump_tests.rs @@ -186,7 +186,7 @@ resource "google_compute_network" "vpc" { // Run bump command let mut cmd = Command::cargo_bin("mk").unwrap(); - cmd.current_dir(&project_dir) + cmd.current_dir(project_dir) .arg("bump") .arg(".") .arg("--verbose"); diff --git a/tests/cli_tests.rs b/tests/cli_tests.rs index a2e3163..d4bc36d 100644 --- a/tests/cli_tests.rs +++ b/tests/cli_tests.rs @@ -139,7 +139,7 @@ fn test_terraform_detection() { Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .assert() .stderr(predicate::str::contains("Detected terraform")); } @@ -151,7 +151,7 @@ fn test_helm_detection() { Command::cargo_bin("mk") .unwrap() - .args(&["template", &project_path, "dev"]) + .args(["template", &project_path, "dev"]) .assert() .stderr(predicate::str::contains("Detected helm")); } @@ -163,7 +163,7 @@ fn test_kustomize_detection() { Command::cargo_bin("mk") .unwrap() - .args(&["template", &project_path, "dev"]) + .args(["template", &project_path, "dev"]) .assert() .stderr(predicate::str::contains("Detected kustomize")); } @@ -175,7 +175,7 @@ fn test_ansible_detection() { Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .assert() .stderr(predicate::str::contains("Detected ansible")); } @@ -187,7 +187,7 @@ fn test_invalid_environment() { Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "invalid-env"]) + .args(["check", &project_path, "invalid-env"]) .assert() .failure() .stderr(predicate::str::contains("Invalid env")); @@ -200,7 +200,7 @@ fn test_valid_environment_accepted() { Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .assert() .stderr(predicate::str::contains("Invalid env").not()); } @@ -209,7 +209,7 @@ fn test_valid_environment_accepted() { fn test_nonexistent_path() { Command::cargo_bin("mk") .unwrap() - .args(&["check", "/nonexistent/path/12345", "dev"]) + .args(["check", "/nonexistent/path/12345", "dev"]) .assert() .failure() .stderr( @@ -227,7 +227,7 @@ fn test_terraform_check_command_generation() { // but we can check that the correct command is generated let output = Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .output() .unwrap(); @@ -242,7 +242,7 @@ fn test_helm_template_command_generation() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["template", &project_path, "dev"]) + .args(["template", &project_path, "dev"]) .output() .unwrap(); @@ -257,7 +257,7 @@ fn test_kustomize_template_command_generation() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["template", &project_path, "dev"]) + .args(["template", &project_path, "dev"]) .output() .unwrap(); @@ -272,7 +272,7 @@ fn test_ansible_check_command_generation() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .output() .unwrap(); @@ -287,7 +287,7 @@ fn test_verbose_flag() { Command::cargo_bin("mk") .unwrap() - .args(&["--verbose", "check", &project_path, "dev"]) + .args(["--verbose", "check", &project_path, "dev"]) .assert() .stderr(predicate::str::contains("Detected terraform")); } @@ -300,14 +300,14 @@ fn test_multiple_environments_available() { // Test with dev Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .assert() .stderr(predicate::str::contains("Invalid env").not()); // Test with prod Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "prod"]) + .args(["check", &project_path, "prod"]) .assert() .stderr(predicate::str::contains("Invalid env").not()); } @@ -319,7 +319,7 @@ fn test_error_message_shows_valid_environments() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "staging"]) + .args(["check", &project_path, "staging"]) .output() .unwrap(); @@ -339,7 +339,7 @@ fn test_invalid_subcommand() { Command::cargo_bin("mk") .unwrap() - .args(&["invalid-action", &project_path, "dev"]) + .args(["invalid-action", &project_path, "dev"]) .assert() .failure() .stderr(predicate::str::contains("error")); diff --git a/tests/config_tests.rs b/tests/config_tests.rs index bb2b34b..d282e9f 100644 --- a/tests/config_tests.rs +++ b/tests/config_tests.rs @@ -49,7 +49,7 @@ auto_approve = false let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["plan", ".", "dev"]) + .args(["plan", ".", "dev"]) .output() .unwrap(); @@ -93,7 +93,7 @@ backend_vars = "custom-backend" let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_dir) - .args(&["plan", ".", "dev"]) + .args(["plan", ".", "dev"]) .output() .unwrap(); @@ -118,7 +118,7 @@ terraform = "apply" let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["plan", ".", "dev"]) + .args(["plan", ".", "dev"]) .output() .unwrap(); @@ -147,7 +147,7 @@ auto_approve = false let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["terraform", "--env", "dev"]) + .args(["terraform", "--env", "dev"]) .output() .unwrap(); @@ -173,7 +173,7 @@ exclude = ["vendor", "node_modules"] let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["terraform", "--env", "dev"]) + .args(["terraform", "--env", "dev"]) .output() .unwrap(); @@ -211,7 +211,7 @@ fn test_no_config_file_uses_defaults() { let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_dir) - .args(&["terraform", "--env", "dev"]) + .args(["terraform", "--env", "dev"]) .output() .unwrap(); @@ -236,7 +236,7 @@ verbose = true let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["plan", ".", "dev"]) + .args(["plan", ".", "dev"]) .output() .unwrap(); @@ -278,7 +278,7 @@ namespace = "custom-namespace" let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_dir) - .args(&["helm", "--env", "dev"]) + .args(["helm", "--env", "dev"]) .output() .unwrap(); @@ -330,7 +330,7 @@ vault_password_file = ".vault-pass" let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_dir) - .args(&["ansible", "list", "--env", "dev"]) + .args(["ansible", "list", "--env", "dev"]) .output() .unwrap(); @@ -355,7 +355,7 @@ verbose = true let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_path) - .args(&["terraform", "--env", "dev"]) + .args(["terraform", "--env", "dev"]) .output() .unwrap(); @@ -399,7 +399,7 @@ terraform = "plan" let output = Command::cargo_bin("mk") .unwrap() .current_dir(&project_dir) - .args(&["terraform", "--env", "dev"]) + .args(["terraform", "--env", "dev"]) .output() .unwrap(); diff --git a/tests/dependency_tests.rs b/tests/dependency_tests.rs index 4fa1d2f..1e54d9c 100644 --- a/tests/dependency_tests.rs +++ b/tests/dependency_tests.rs @@ -115,7 +115,7 @@ fn test_ansible_deps_command() { // Run deps command let output = Command::cargo_bin("mk") .unwrap() - .args(&["deps", &project_path, "dev"]) + .args(["deps", &project_path, "dev"]) .output() .unwrap(); @@ -148,7 +148,7 @@ fn test_ansible_check_without_deps_fails() { // Try to run check without installing dependencies first let output = Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .output() .unwrap(); @@ -178,14 +178,14 @@ fn test_ansible_check_after_deps_succeeds() { // First install dependencies Command::cargo_bin("mk") .unwrap() - .args(&["deps", &project_path, "dev"]) + .args(["deps", &project_path, "dev"]) .output() .unwrap(); // Now run check - should generate the command successfully let output = Command::cargo_bin("mk") .unwrap() - .args(&["check", &project_path, "dev"]) + .args(["check", &project_path, "dev"]) .output() .unwrap(); @@ -207,7 +207,7 @@ fn test_helm_deps_command() { // Run deps command let output = Command::cargo_bin("mk") .unwrap() - .args(&["deps", &project_path, "dev"]) + .args(["deps", &project_path, "dev"]) .output() .unwrap(); @@ -255,7 +255,7 @@ fn test_helm_template_auto_downloads_deps() { // Run template without explicitly running deps first let output = Command::cargo_bin("mk") .unwrap() - .args(&["template", &project_path, "dev"]) + .args(["template", &project_path, "dev"]) .output() .unwrap(); @@ -294,7 +294,7 @@ fn test_helm_template_after_deleting_charts() { // First run deps to download charts Command::cargo_bin("mk") .unwrap() - .args(&["deps", &project_path, "dev"]) + .args(["deps", &project_path, "dev"]) .output() .unwrap(); @@ -307,7 +307,7 @@ fn test_helm_template_after_deleting_charts() { // Now run template - should re-download let output = Command::cargo_bin("mk") .unwrap() - .args(&["template", &project_path, "dev"]) + .args(["template", &project_path, "dev"]) .output() .unwrap(); diff --git a/tests/drift_tests.rs b/tests/drift_tests.rs index ecd3a56..89e95fd 100644 --- a/tests/drift_tests.rs +++ b/tests/drift_tests.rs @@ -113,7 +113,7 @@ fn test_drift_command_requires_base_path() { fn test_drift_nonexistent_directory() { Command::cargo_bin("mk") .unwrap() - .args(&["drift", "/nonexistent/path/12345"]) + .args(["drift", "/nonexistent/path/12345"]) .assert() .failure(); } @@ -124,7 +124,7 @@ fn test_drift_empty_directory() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap()]) + .args(["drift", temp_dir.path().to_str().unwrap()]) .output() .unwrap(); @@ -143,7 +143,7 @@ fn test_drift_detects_terraform_project() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap()]) + .args(["drift", temp_dir.path().to_str().unwrap()]) .output() .unwrap(); @@ -161,7 +161,7 @@ fn test_drift_detects_helm_project() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap()]) + .args(["drift", temp_dir.path().to_str().unwrap()]) .output() .unwrap(); @@ -180,7 +180,7 @@ fn test_drift_with_tech_filter_terraform() { let output = Command::cargo_bin("mk") .unwrap() - .args(&[ + .args([ "drift", temp_dir.path().to_str().unwrap(), "--tech", @@ -202,7 +202,7 @@ fn test_drift_with_tech_filter_helm() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap(), "--tech", "helm"]) + .args(["drift", temp_dir.path().to_str().unwrap(), "--tech", "helm"]) .output() .unwrap(); @@ -237,7 +237,7 @@ fn test_drift_with_env_filter() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap(), "--env", "dev"]) + .args(["drift", temp_dir.path().to_str().unwrap(), "--env", "dev"]) .output() .unwrap(); @@ -274,7 +274,7 @@ fn test_drift_with_max_depth() { // Test with max-depth that's too shallow let output = Command::cargo_bin("mk") .unwrap() - .args(&[ + .args([ "drift", temp_dir.path().to_str().unwrap(), "--max-depth", @@ -293,7 +293,7 @@ fn test_drift_with_max_depth() { // Test with max-depth that's deep enough let output = Command::cargo_bin("mk") .unwrap() - .args(&[ + .args([ "drift", temp_dir.path().to_str().unwrap(), "--max-depth", @@ -316,7 +316,7 @@ fn test_drift_verbose_flag() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap(), "--verbose"]) + .args(["drift", temp_dir.path().to_str().unwrap(), "--verbose"]) .output() .unwrap(); @@ -332,7 +332,7 @@ fn test_drift_capture_flag_creates_log_dir() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap(), "--capture"]) + .args(["drift", temp_dir.path().to_str().unwrap(), "--capture"]) .output() .unwrap(); @@ -367,7 +367,7 @@ fn test_drift_multiple_projects() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["drift", temp_dir.path().to_str().unwrap()]) + .args(["drift", temp_dir.path().to_str().unwrap()]) .output() .unwrap(); diff --git a/tests/duplicate_tests.rs b/tests/duplicate_tests.rs index 6b7a213..283cccf 100644 --- a/tests/duplicate_tests.rs +++ b/tests/duplicate_tests.rs @@ -71,7 +71,7 @@ fn test_terraform_duplicate_creates_files() { Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "dev", "staging"]) + .args(["duplicate", &project_path, "dev", "staging"]) .assert() .success(); @@ -97,7 +97,7 @@ fn test_terraform_duplicate_replaces_content() { Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "dev", "staging"]) + .args(["duplicate", &project_path, "dev", "staging"]) .assert() .success(); @@ -134,7 +134,7 @@ fn test_helm_duplicate_creates_directory() { Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "dev", "staging"]) + .args(["duplicate", &project_path, "dev", "staging"]) .assert() .success(); @@ -154,7 +154,7 @@ fn test_helm_duplicate_replaces_content() { Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "dev", "staging"]) + .args(["duplicate", &project_path, "dev", "staging"]) .assert() .success(); @@ -187,7 +187,7 @@ fn test_duplicate_with_nonexistent_source_env() { Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "nonexistent", "staging"]) + .args(["duplicate", &project_path, "nonexistent", "staging"]) .assert() .failure() .stderr(predicate::str::contains("Invalid env")); @@ -202,14 +202,14 @@ fn test_duplicate_target_env_already_exists() { // First duplicate Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "dev", "staging"]) + .args(["duplicate", &project_path, "dev", "staging"]) .assert() .success(); // Try to duplicate again to same target let result = Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "dev", "staging"]) + .args(["duplicate", &project_path, "dev", "staging"]) .output() .unwrap(); @@ -231,7 +231,7 @@ fn test_duplicate_preserves_source_files() { Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", &project_path, "dev", "staging"]) + .args(["duplicate", &project_path, "dev", "staging"]) .assert() .success(); @@ -271,7 +271,7 @@ fn test_duplicate_case_sensitive_replacement() { Command::cargo_bin("mk") .unwrap() - .args(&["duplicate", project_path, "dev", "staging"]) + .args(["duplicate", project_path, "dev", "staging"]) .assert() .success(); diff --git a/tests/recursive_bump_tests.rs b/tests/recursive_bump_tests.rs index 31f8a5c..2cac240 100644 --- a/tests/recursive_bump_tests.rs +++ b/tests/recursive_bump_tests.rs @@ -58,7 +58,7 @@ fn test_recursive_bump_finds_single_project() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); @@ -79,7 +79,7 @@ fn test_recursive_bump_finds_multiple_projects() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); @@ -100,7 +100,7 @@ fn test_recursive_bump_mixed_technologies() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); @@ -125,7 +125,7 @@ fn test_recursive_bump_nested_projects() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); @@ -143,7 +143,7 @@ fn test_recursive_bump_with_include_prereleases() { let output = Command::cargo_bin("mk") .unwrap() - .args(&[ + .args([ "bump", temp_dir.path().to_str().unwrap(), "--recursive", @@ -166,7 +166,7 @@ fn test_recursive_bump_empty_directory() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); @@ -188,7 +188,7 @@ fn test_recursive_bump_shows_project_count() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); @@ -220,7 +220,7 @@ fn test_recursive_bump_max_depth_default() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); @@ -236,7 +236,7 @@ fn test_recursive_bump_max_depth_default() { fn test_recursive_bump_nonexistent_directory() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", "/nonexistent/path/12345", "--recursive"]) + .args(["bump", "/nonexistent/path/12345", "--recursive"]) .output() .unwrap(); @@ -259,7 +259,7 @@ fn test_recursive_bump_with_verbose() { let output = Command::cargo_bin("mk") .unwrap() - .args(&[ + .args([ "bump", temp_dir.path().to_str().unwrap(), "--recursive", @@ -286,7 +286,7 @@ fn test_recursive_bump_same_dependency_cached() { let output = Command::cargo_bin("mk") .unwrap() - .args(&[ + .args([ "bump", temp_dir.path().to_str().unwrap(), "--recursive", @@ -315,7 +315,7 @@ fn test_recursive_bump_reports_up_to_date() { let output = Command::cargo_bin("mk") .unwrap() - .args(&["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) + .args(["bump", temp_dir.path().to_str().unwrap(), "--recursive"]) .output() .unwrap(); From 40902f028c785baa7aa6ee07de9e8081cd9722d6 Mon Sep 17 00:00:00 2001 From: Baptiste Roux Date: Sun, 12 Oct 2025 16:51:50 +0200 Subject: [PATCH 5/7] chore: restore workflows after successful test --- .github/workflows/build.yml | 213 +++++++++++++++++++++++++++ .github/workflows/release-please.yml | 19 +++ .github/workflows/release.yml | 7 +- mise.toml | 2 +- 4 files changed, 236 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release-please.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..435246d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,213 @@ +name: Build and Test + +on: + pull_request: + branches: + - main + paths: + - Cargo.lock + - Cargo.toml + - mise.toml + - src/** + - tests/** + +permissions: + pull-requests: write + +jobs: + test: + name: Test + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + steps: + - name: Checkout code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + + - name: Install required tools + uses: jdx/mise-action@e3d7b8d67a7958d1207f6ed871e83b1ea780e7b0 # v3.3.1 + + - name: Cache cargo registry + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo index + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo build + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: target + key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} + + - name: Check formatting + run: cargo fmt --check + + - name: Run clippy + run: cargo clippy -- -D warnings + + - name: Run tests with nextest + id: nextest + env: + NEXTEST_EXPERIMENTAL_LIBTEST_JSON: "1" + run: | + cargo nextest run --profile ci --message-format libtest-json-plus | tee nextest-results.json + # Parse libtest-json-plus output for test results using jq + # Sum up results from all suite completion events + if [ -f nextest-results.json ]; then + PASSED=$(jq -s '[.[] | select(.type=="suite" and .event=="ok") | .passed] | add // 0' nextest-results.json) + FAILED=$(jq -s '[.[] | select(.type=="suite" and .event=="ok") | .failed] | add // 0' nextest-results.json) + SKIPPED=$(jq -s '[.[] | select(.type=="suite" and .event=="ok") | .ignored] | add // 0' nextest-results.json) + TOTAL=$((PASSED + FAILED + SKIPPED)) + else + TOTAL=0 + PASSED=0 + FAILED=0 + SKIPPED=0 + fi + echo "total=$TOTAL" >> $GITHUB_OUTPUT + echo "passed=$PASSED" >> $GITHUB_OUTPUT + echo "failed=$FAILED" >> $GITHUB_OUTPUT + echo "skipped=$SKIPPED" >> $GITHUB_OUTPUT + + - name: Comment PR with results + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const total = '${{ steps.nextest.outputs.total }}'; + const passed = '${{ steps.nextest.outputs.passed }}'; + const failed = '${{ steps.nextest.outputs.failed }}'; + const skipped = '${{ steps.nextest.outputs.skipped }}'; + + const body = `## ๐Ÿงช Test Results + + | Metric | Value | + |--------|-------| + | โœ… Passed | ${passed}/${total} | + | โŒ Failed | ${failed} | + | โญ๏ธ Skipped | ${skipped} | + + --- + *Generated by cargo-nextest*`; + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const botComment = comments.find(comment => + comment.user.type === 'Bot' && + comment.body.includes('๐Ÿงช Test Results') + ); + + if (botComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: body + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: body + }); + } + + coverage: + name: Coverage + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + + - name: Install required tools + uses: jdx/mise-action@e3d7b8d67a7958d1207f6ed871e83b1ea780e7b0 # v3.3.1 + + - name: Cache cargo registry + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo index + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo build + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: target + key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} + + - name: Generate coverage report + id: coverage + run: | + OUTPUT=$(cargo tarpaulin --verbose --all-features --workspace --timeout 120 --out Html --out Xml --output-dir ./coverage 2>&1) + COVERAGE=$(echo "$OUTPUT" | grep -oP '\d+\.\d+(?=% coverage)' | head -1) + echo "percentage=$COVERAGE" >> $GITHUB_OUTPUT + + - name: Upload coverage reports + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: coverage-report + path: | + coverage/ + retention-days: 30 + + - name: Comment PR with results + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const coverage = '${{ steps.coverage.outputs.percentage }}'; + + const body = `## ๐Ÿ“Š Coverage Report + + | Metric | Value | + |--------|-------| + | ๐Ÿ“Š Coverage | ${coverage}% | + + [๐Ÿ“ฅ Download Full Coverage Report](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) + + --- + *Generated by cargo-tarpaulin*`; + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const botComment = comments.find(comment => + comment.user.type === 'Bot' && + comment.body.includes('๐Ÿ“Š Coverage Report') + ); + + if (botComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: body + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: body + }); + } diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..e2c97b0 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,19 @@ +name: Release Please + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - name: Run Release Please + uses: googleapis/release-please-action@c2a5a2bd6a758a0937f1ddb1e8950609867ed15c # v4 + with: + token: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1ae665f..903751d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,15 +1,14 @@ name: Build and publish release artifacts on: - pull_request: - branches: - - main + push: + tags: + - v\d+.\d+.\d+ permissions: contents: write jobs: - # Run checks once before building check: name: Check runs-on: ubuntu-latest diff --git a/mise.toml b/mise.toml index ba43051..ddd42eb 100644 --- a/mise.toml +++ b/mise.toml @@ -18,7 +18,7 @@ run = "cargo build --release --locked" run = "cargo install --path . --force" [tasks.test] -run = "cargo clippy -- -D warnings && cargo nextest run" +run = "cargo clippy --all-targets --all-features -- -D warnings && cargo nextest run" [tasks.coverage] run = "cargo tarpaulin --out Html" From 6512258e372f464d514733f3bc04ffaffec5b21e Mon Sep 17 00:00:00 2001 From: Baptiste Roux Date: Sun, 12 Oct 2025 16:52:47 +0200 Subject: [PATCH 6/7] ci: add windows runner in matrix --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 435246d..e474c77 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] steps: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 From d1f3441ca8d6ba6e3180d548a39712bfe4a2652c Mon Sep 17 00:00:00 2001 From: Baptiste Roux Date: Sun, 12 Oct 2025 16:55:18 +0200 Subject: [PATCH 7/7] Revert "ci: add windows runner in matrix" This reverts commit 6512258e372f464d514733f3bc04ffaffec5b21e. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e474c77..435246d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] steps: - name: Checkout code uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5