name: CI on: push: branches: [main, 'dev/**'] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: emacs_version: ['28.1', '29.4', '30.1'] steps: - uses: actions/checkout@v6 - uses: purcell/setup-emacs@master with: version: ${{ matrix.emacs_version }} - name: Install package-lint from MELPA run: | emacs -Q --batch --eval "(progn \ (require 'package) \ (setq package-user-dir (expand-file-name \".elpa\")) \ (add-to-list 'package-archives '(\"melpa\" . \"https://melpa.org/packages/\")) \ (package-initialize) \ (package-refresh-contents) \ (package-install 'package-lint))" echo "PACKAGE_LINT_LOAD=-L $(ls -d "$PWD"/.elpa/package-lint-*/ | head -1)" >> "$GITHUB_ENV" - name: Byte-compile (warnings are errors) run: make compile-all WERROR=t - name: ERT suite run: make test - name: ERT suite (shuffled order) run: make test-shuffled SHUFFLE_SEED=20260806 - name: README doctests run: | set -o pipefail make doctest 2>&1 | tee doctest.log || { # Surface failing assertions as annotations (job logs are # not readable anonymously; annotations are). grep -E '^(FAIL| expected:| got:)' doctest.log | head -30 \ | while IFS= read -r l; do echo "::error::${l}"; done grep -q '^FAIL' doctest.log || tail -n 8 doctest.log \ | while IFS= read -r l; do echo "::error::${l}"; done exit 1 } - name: Check documentation run: make checkdoc - name: Check package metadata run: make package-lint LOAD_EXTRA="$PACKAGE_LINT_LOAD" - name: Check diff whitespace run: make diff-check