ci: migrate GitHub Actions from Lua/Luarocks to Nix-based build system #36
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Tests | |
on: | |
push: | |
branches: [main] | |
pull_request: | |
branches: [main] | |
permissions: | |
contents: read | |
# Cancel in-progress runs for pull requests when developers push | |
# additional changes | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} | |
jobs: | |
unit-tests: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
neovim-version: ["stable", "nightly"] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
fetch-depth: 0 | |
persist-credentials: false | |
- name: Setup Nix | |
uses: nixbuild/nix-quick-install-action@5bb6a3b3abe66fd09bbf250dce8ada94f856a703 # v30 | |
- uses: nix-community/cache-nix-action@135667ec418502fa5a3598af6fb9eb733888ce6a # v6.1.3 | |
with: | |
primary-key: nix-claudecode-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock') }} | |
restore-prefixes-first-match: nix-claudecode-${{ runner.os }}- | |
gc-max-store-size-linux: 2G | |
purge: true | |
purge-prefixes: nix-claudecode-${{ runner.os }}- | |
purge-created: 0 | |
purge-primary-key: never | |
- name: Setup Neovim | |
uses: rhysd/action-setup-vim@8e931b9954b19d4203d5caa5ff5521f3bc21dcc7 # v1.4.2 | |
with: | |
neovim: true | |
version: ${{ matrix.neovim-version }} | |
- name: Run Luacheck | |
run: nix develop .#ci -c luacheck lua/ tests/ --no-unused-args --no-max-line-length | |
- name: Run tests | |
run: nix develop .#ci -c ./run_tests.sh | |
- name: Check formatting | |
run: nix flake check | |
- name: Generate coverage report | |
run: | | |
# Check if stats file exists (created by busted --coverage) | |
if [ -f "luacov.stats.out" ]; then | |
# Generate the regular luacov report | |
nix develop .#ci -c luacov | |
# Create simple lcov.info from luacov.report.out | |
echo "Creating lcov.info from luacov.report.out" | |
{ | |
echo "TN:" | |
grep -E "^Summary$" -A1000 luacov.report.out | grep -E "^[^ ].*:" | while read -r line; do | |
file=$(echo "$line" | cut -d':' -f1) | |
echo "SF:$file" | |
percent=$(echo "$line" | grep -oE "[0-9\.]+%" | tr -d '%') | |
if [ -n "$percent" ]; then | |
echo "DA:1,1" | |
echo "LF:1" | |
echo "LH:$percent" | |
fi | |
echo "end_of_record" | |
done | |
} > lcov.info | |
else | |
echo "No coverage data found in luacov.stats.out" | |
touch lcov.info | |
fi | |
- name: Upload coverage report | |
uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4 | |
with: | |
files: ./lcov.info | |
fail_ci_if_error: false | |
integration-tests: | |
runs-on: ubuntu-latest | |
needs: unit-tests | |
strategy: | |
matrix: | |
neovim-version: ["stable"] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
fetch-depth: 0 | |
persist-credentials: false | |
- name: Setup Nix | |
uses: nixbuild/nix-quick-install-action@5bb6a3b3abe66fd09bbf250dce8ada94f856a703 # v30 | |
- uses: nix-community/cache-nix-action@135667ec418502fa5a3598af6fb9eb733888ce6a # v6.1.3 | |
with: | |
primary-key: nix-claudecode-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock') }} | |
restore-prefixes-first-match: nix-claudecode-${{ runner.os }}- | |
gc-max-store-size-linux: 2G | |
purge: true | |
purge-prefixes: nix-claudecode-${{ runner.os }}- | |
purge-created: 0 | |
purge-primary-key: never | |
- name: Setup Neovim | |
uses: rhysd/action-setup-vim@8e931b9954b19d4203d5caa5ff5521f3bc21dcc7 # v1.4.2 | |
with: | |
neovim: true | |
version: ${{ matrix.neovim-version }} | |
- name: Install test dependencies | |
run: | | |
git clone --depth 1 https://github.com/nvim-lua/plenary.nvim ~/.local/share/nvim/site/pack/vendor/start/plenary.nvim | |
ln -s "$(pwd)" ~/.local/share/nvim/site/pack/vendor/start/claudecode.nvim | |
- name: Run integration tests | |
run: nix develop .#ci -c nvim --headless -u tests/minimal_init.lua -c "lua require('plenary.test_harness').test_directory('tests/integration', {minimal_init = 'tests/minimal_init.lua'})" |