aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/ci.yml
blob: fd1d357d042f6e26d3f860a4dc7f585cf2a3e1e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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 }}