66 pull_request :
77 branches : [main]
88
9+ concurrency :
10+ group : ci-${{ github.workflow }}-${{ github.ref }}
11+ cancel-in-progress : ${{ github.event_name == 'pull_request' }}
12+
913env :
1014 MIX_ENV : test
15+ ELIXIR_VERSION : " 1.19"
16+ OTP_VERSION : " 28"
1117
1218jobs :
13- test :
14- name : Test (Elixir ${{ matrix.elixir }} / OTP ${{ matrix.otp }})
19+ changes :
20+ name : Detect changes
1521 runs-on : ubuntu-latest
22+ outputs :
23+ durable : ${{ steps.filter.outputs.durable }}
24+ dashboard : ${{ steps.filter.outputs.dashboard }}
25+ ci : ${{ steps.filter.outputs.ci }}
26+ steps :
27+ - uses : actions/checkout@v6
1628
17- strategy :
18- matrix :
19- elixir : ["1.19"]
20- otp : ["28"]
29+ - uses : dorny/paths-filter@v3
30+ id : filter
31+ with :
32+ filters : |
33+ durable:
34+ - 'durable/**'
35+ dashboard:
36+ - 'durable/**'
37+ - 'durable_dashboard/**'
38+ ci:
39+ - '.github/workflows/**'
40+
41+ durable :
42+ name : Durable
43+ needs : changes
44+ if : needs.changes.outputs.durable == 'true' || needs.changes.outputs.ci == 'true' || github.event_name == 'push'
45+ runs-on : ubuntu-latest
2146
2247 services :
2348 postgres :
@@ -33,28 +58,32 @@ jobs:
3358 --health-timeout=5s
3459 --health-retries=5
3560
61+ defaults :
62+ run :
63+ working-directory : durable
64+
3665 steps :
3766 - uses : actions/checkout@v6
3867
3968 - name : Set up Elixir
4069 uses : erlef/setup-beam@v1
4170 with :
42- elixir-version : ${{ matrix.elixir }}
43- otp-version : ${{ matrix.otp }}
71+ elixir-version : ${{ env.ELIXIR_VERSION }}
72+ otp-version : ${{ env.OTP_VERSION }}
4473
4574 - name : Restore dependencies cache
4675 uses : actions/cache@v4
4776 with :
48- path : deps
49- key : ${{ runner.os }}-mix-${{ hashFiles('** /mix.lock') }}
50- restore-keys : ${{ runner.os }}-mix-
77+ path : durable/ deps
78+ key : ${{ runner.os }}-durable- mix-${{ hashFiles('durable /mix.lock') }}
79+ restore-keys : ${{ runner.os }}-durable- mix-
5180
5281 - name : Restore build cache
53- uses : actions/cache@v5
82+ uses : actions/cache@v4
5483 with :
55- path : _build
56- key : ${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles('** /mix.lock') }}
57- restore-keys : ${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-
84+ path : durable/ _build
85+ key : ${{ runner.os }}-durable- build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-${{ hashFiles('durable /mix.lock') }}
86+ restore-keys : ${{ runner.os }}-durable- build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-
5887
5988 - name : Install dependencies
6089 run : mix deps.get
@@ -65,31 +94,86 @@ jobs:
6594 - name : Compile
6695 run : mix compile --warnings-as-errors
6796
97+ - name : Credo
98+ run : mix credo --strict
99+
68100 - name : Run tests
69101 run : mix test
70102
71- credo :
72- name : Credo
103+ dashboard :
104+ name : Dashboard
105+ needs : changes
106+ if : needs.changes.outputs.dashboard == 'true' || needs.changes.outputs.ci == 'true' || github.event_name == 'push'
73107 runs-on : ubuntu-latest
74108
109+ defaults :
110+ run :
111+ working-directory : durable_dashboard
112+
75113 steps :
76- - uses : actions/checkout@v4
114+ - uses : actions/checkout@v6
77115
78116 - name : Set up Elixir
79117 uses : erlef/setup-beam@v1
80118 with :
81- elixir-version : " 1.19"
82- otp-version : " 28"
119+ elixir-version : ${{ env.ELIXIR_VERSION }}
120+ otp-version : ${{ env.OTP_VERSION }}
121+
122+ - name : Set up pnpm
123+ uses : pnpm/action-setup@v4
124+ with :
125+ version : 9
126+
127+ - name : Set up Node
128+ uses : actions/setup-node@v4
129+ with :
130+ node-version : " 20"
131+ cache : pnpm
132+ cache-dependency-path : durable_dashboard/assets/pnpm-lock.yaml
83133
84134 - name : Restore dependencies cache
85135 uses : actions/cache@v4
86136 with :
87- path : deps
88- key : ${{ runner.os }}-mix-${{ hashFiles('** /mix.lock') }}
89- restore-keys : ${{ runner.os }}-mix-
137+ path : durable_dashboard/ deps
138+ key : ${{ runner.os }}-dashboard- mix-${{ hashFiles('durable_dashboard/mix.lock', 'durable /mix.lock') }}
139+ restore-keys : ${{ runner.os }}-dashboard- mix-
90140
91- - name : Install dependencies
141+ - name : Restore build cache
142+ uses : actions/cache@v4
143+ with :
144+ path : durable_dashboard/_build
145+ key : ${{ runner.os }}-dashboard-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-${{ hashFiles('durable_dashboard/mix.lock', 'durable/mix.lock') }}
146+ restore-keys : ${{ runner.os }}-dashboard-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-
147+
148+ - name : Install Elixir dependencies
92149 run : mix deps.get
93150
94- - name : Run Credo
95- run : mix credo --strict
151+ - name : Install JS dependencies
152+ working-directory : durable_dashboard/assets
153+ run : pnpm install --frozen-lockfile
154+
155+ - name : Check formatting
156+ run : mix format --check-formatted
157+
158+ - name : Build assets
159+ working-directory : durable_dashboard/assets
160+ run : pnpm build
161+
162+ - name : Compile
163+ run : mix compile --warnings-as-errors
164+
165+ - name : Run tests
166+ run : mix test
167+
168+ ci-status :
169+ name : CI status
170+ needs : [changes, durable, dashboard]
171+ if : always()
172+ runs-on : ubuntu-latest
173+ steps :
174+ - name : Verify all required jobs passed
175+ run : |
176+ set -e
177+ [[ "${{ needs.changes.result }}" == "success" ]] || exit 1
178+ [[ "${{ needs.durable.result }}" =~ ^(success|skipped)$ ]] || exit 1
179+ [[ "${{ needs.dashboard.result }}" =~ ^(success|skipped)$ ]] || exit 1
0 commit comments