name: CI on: push: branches: [main] pull_request: branches: [main] # emacs-eask/setup-eask@master still declares the node20 runtime, which # GitHub force-migrates to node24 on 2026-06-02. Opt in now so the # action runs under node24 ahead of the forced switch — surfacing any # incompatibility on our schedule rather than theirs. env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true jobs: test: name: Test (Emacs ${{ matrix.emacs-version }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: emacs-version: # Emacs 29 is the practical floor: it ships Org 9.6 (our # declared dep) built-in. Earlier versions need Cask to # pull a newer Org over the built-in, which has been # unreliable in CI. Tests pass locally on 30.x and on # the snapshot runner; the scheduler cl-assert error-case # tests (sm2/sm5/simple8) are skipped on 29 due to an ERT # signal-hook quirk (skip-unless guard inside the helper macro). - '29.4' - 'snapshot' steps: - uses: actions/checkout@v5 - name: Set up Emacs uses: jcs090218/setup-emacs@master with: version: ${{ matrix.emacs-version }} - name: Set up Eask uses: emacs-eask/setup-eask@master - name: Install dependencies run: | for attempt in 1 2 3; do if make setup; then exit 0 fi if [ "$attempt" -lt 3 ]; then echo "::warning::setup attempt $attempt failed, retrying in 15s" sleep 15 fi done echo "::error::setup failed after 3 attempts" exit 1 - name: Run unit tests run: make test-unit lint: name: Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Set up Emacs uses: jcs090218/setup-emacs@master with: version: '29.4' - name: Set up Eask uses: emacs-eask/setup-eask@master - name: Install dependencies run: | for attempt in 1 2 3; do if make setup; then exit 0 fi if [ "$attempt" -lt 3 ]; then echo "::warning::setup attempt $attempt failed, retrying in 15s" sleep 15 fi done echo "::error::setup failed after 3 attempts" exit 1 # `make lint' is informational right now (the source has known # docstring/style debt); kept here so warnings show up in PRs. - name: Run linters run: make lint - name: Byte-compile run: make compile - name: Validate parens run: make validate-parens coverage: name: Coverage runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Set up Emacs uses: jcs090218/setup-emacs@master with: version: '29.4' - name: Set up Eask uses: emacs-eask/setup-eask@master - name: Install dependencies run: | for attempt in 1 2 3; do if make setup; then exit 0 fi if [ "$attempt" -lt 3 ]; then echo "::warning::setup attempt $attempt failed, retrying in 15s" sleep 15 fi done echo "::error::setup failed after 3 attempts" exit 1 - name: Run coverage run: make coverage - name: Print coverage summary run: python3 scripts/coverage-summary.py - name: Upload coverage report uses: actions/upload-artifact@v4 with: name: coverage-simplecov path: .coverage/simplecov.json if-no-files-found: error retention-days: 30 - name: Send coverage to Coveralls uses: coverallsapp/github-action@v2 continue-on-error: true with: file: .coverage/simplecov.json format: simplecov env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}