From b33ed90810411e5988d9cff87dfb0b3dc12df28b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Fr=C3=B3es=20Franco?= Date: Wed, 3 Jun 2026 20:11:03 -0300 Subject: [PATCH] ci: improve workflows with stricter checks, caching, and idempotency CI improvements: - Add concurrency group to cancel redundant runs on same branch - Add cargo cache to fmt job (was missing entirely) - Add timeout-minutes: 5 to fast jobs (fmt, clippy, test) for fail-fast - Change RUST_BACKTRACE from 'short' to '1' for better CI debuggability - Pin push trigger to branches: [main] to avoid double-firing on PR merges - Test minimum supported Neovim (0.11.0) instead of latest patch (0.11.3) Release improvements: - Enforce RUSTFLAGS: -D warnings at env level and in matrix rustflags - Remove redundant checkout in release job (only needs env vars) - Add release notes generation from git log since previous tag - Make release creation idempotent (check if release exists before creating) - Fix release_id not being set when release already exists --- .gitea/workflows/ci.yaml | 41 ++++++++++++++------ .gitea/workflows/release.yaml | 73 +++++++++++++++++++++++++---------- 2 files changed, 81 insertions(+), 33 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index ae37c90..8a0d00f 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -2,27 +2,43 @@ name: CI on: push: + branches: [main] pull_request: +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + env: CARGO_TERM_COLOR: always - RUST_BACKTRACE: short + RUST_BACKTRACE: "1" RUSTFLAGS: -D warnings jobs: fmt: name: cargo fmt --check runs-on: ubuntu-latest + timeout-minutes: 5 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@1.83 with: components: rustfmt + - uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-fmt-${{ hashFiles('**/Cargo.lock', '**/Cargo.toml') }} + restore-keys: + - ${{ runner.os }}-cargo-fmt- - run: cargo fmt --all -- --check clippy: name: cargo clippy runs-on: ubuntu-latest + timeout-minutes: 5 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@1.83 @@ -35,13 +51,14 @@ jobs: ~/.cargo/git target key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.lock', '**/Cargo.toml') }} - restore-keys: | - ${{ runner.os }}-cargo-clippy- + restore-keys: + - ${{ runner.os }}-cargo-clippy- - run: cargo clippy --workspace --all-targets -- -D warnings test: name: cargo test runs-on: ubuntu-latest + timeout-minutes: 5 steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@1.83 @@ -52,8 +69,8 @@ jobs: ~/.cargo/git target key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock', '**/Cargo.toml') }} - restore-keys: | - ${{ runner.os }}-cargo-test- + restore-keys: + - ${{ runner.os }}-cargo-test- - run: cargo test --workspace --all-targets keymaps: @@ -74,15 +91,15 @@ jobs: ~/.cargo/git target key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock', '**/Cargo.toml') }} - restore-keys: | - ${{ runner.os }}-cargo-test- - - name: install Neovim 0.11 + Vim + restore-keys: + - ${{ runner.os }}-cargo-test- + - name: install Neovim + Vim run: | set -euo pipefail - # Apt's neovim is too old (Ubuntu LTS ships 0.6/0.7), missing - # `vim.lsp.get_clients` and rejecting `@group.modifier` - # highlight names. Pull the official static tarball instead. - NVIM_VER=v0.11.3 + # Test the minimum supported Neovim version (0.11.0) so we + # catch API regressions at the bottom of the supported range. + # Pinning to a specific patch version; bump when 0.12 ships. + NVIM_VER=v0.11.0 curl -fsSL -o /tmp/nvim.tar.gz \ "https://github.com/neovim/neovim/releases/download/${NVIM_VER}/nvim-linux-x86_64.tar.gz" sudo tar -xzf /tmp/nvim.tar.gz -C /opt diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index f8a67cf..5f5ce7c 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -11,6 +11,7 @@ permissions: env: CARGO_TERM_COLOR: always RUST_BACKTRACE: short + RUSTFLAGS: -D warnings jobs: build: @@ -22,19 +23,19 @@ jobs: include: - target: x86_64-unknown-linux-gnu apt: "" - rustflags: "" + rustflags: "-D warnings" - target: aarch64-unknown-linux-gnu # gcc-aarch64-linux-gnu ships the cross compiler/binutils # but no target libc; libc6-dev-arm64-cross adds Scrt1.o, # crti.o, and friends needed at link time. apt: "gcc-aarch64-linux-gnu libc6-dev-arm64-cross" - rustflags: "" + rustflags: "-D warnings" - target: x86_64-unknown-linux-musl apt: "musl-tools" - rustflags: "" + rustflags: "-D warnings" - target: aarch64-unknown-linux-musl apt: "" - rustflags: "-C linker=rust-lld -C link-self-contained=yes" + rustflags: "-D warnings -C linker=rust-lld -C link-self-contained=yes" steps: - uses: actions/checkout@v4 @@ -56,8 +57,8 @@ jobs: ~/.cargo/git target key: ${{ runner.os }}-cargo-release-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo-release-${{ matrix.target }}- + restore-keys: + - ${{ runner.os }}-cargo-release-${{ matrix.target }}- - name: Build nuwiki-ls env: @@ -93,8 +94,6 @@ jobs: needs: build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Download all build artifacts # Paired with upload-artifact@v3 above. v3 has no merge-multiple # option and nests each artifact under its own subdirectory. @@ -111,6 +110,26 @@ jobs: apt-get update && apt-get install -y --no-install-recommends curl fi + - name: Generate release notes + id: notes + run: | + set -euo pipefail + # Get commits since the previous tag (or the first commit if this is the first release). + prev_tag=$(git tag --sort=-version:refname | awk "NR==2" || echo "") + if [ -n "$prev_tag" ]; then + log=$(git log --oneline "$prev_tag"..HEAD) + else + log=$(git log --oneline --max-parents=0..HEAD) + fi + # Write notes to a file for later use. + cat > release-notes.txt </), so recurse.