Skip to content

Commit e4122b3

Browse files
wishket-pjwJeremyDev87
authored andcommitted
infra: add quality gates to CI/CD pipeline
- Add CI workflow for PRs with lint, format, typecheck, test, circular, build checks - Update dev.yml to run quality checks before publish - Use parallel execution and dependency caching close #36
1 parent 5e1469b commit e4122b3

2 files changed

Lines changed: 356 additions & 1 deletion

File tree

.github/workflows/ci.yml

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
name: CI
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
paths:
8+
- 'mcp-server/**'
9+
- '.ai-rules/**'
10+
- '.github/workflows/ci.yml'
11+
12+
permissions:
13+
contents: read
14+
15+
jobs:
16+
# ─────────────── Setup Job ───────────────
17+
install-dependencies:
18+
runs-on: ubuntu-latest
19+
defaults:
20+
run:
21+
working-directory: mcp-server
22+
steps:
23+
- name: Checkout code
24+
uses: actions/checkout@v4
25+
26+
- name: Setup node.js
27+
uses: actions/setup-node@v4
28+
with:
29+
node-version: '24'
30+
31+
- name: Restore dependencies from cache
32+
id: cache
33+
uses: actions/cache@v4
34+
with:
35+
path: ./mcp-server/node_modules
36+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
37+
restore-keys: |
38+
${{ runner.os }}-yarn-
39+
40+
- name: Install dependencies
41+
if: steps.cache.outputs.cache-hit != 'true'
42+
run: yarn install --immutable
43+
44+
# ─────────────── CI Jobs (parallel) ───────────────
45+
lint-check:
46+
needs: install-dependencies
47+
runs-on: ubuntu-latest
48+
defaults:
49+
run:
50+
working-directory: mcp-server
51+
steps:
52+
- name: Checkout code
53+
uses: actions/checkout@v4
54+
55+
- name: Setup node.js
56+
uses: actions/setup-node@v4
57+
with:
58+
node-version: '24'
59+
60+
- name: Restore dependencies from cache
61+
uses: actions/cache@v4
62+
with:
63+
path: ./mcp-server/node_modules
64+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
65+
66+
- name: Lint
67+
run: yarn lint
68+
69+
prettier-check:
70+
needs: install-dependencies
71+
runs-on: ubuntu-latest
72+
defaults:
73+
run:
74+
working-directory: mcp-server
75+
steps:
76+
- name: Checkout code
77+
uses: actions/checkout@v4
78+
79+
- name: Setup node.js
80+
uses: actions/setup-node@v4
81+
with:
82+
node-version: '24'
83+
84+
- name: Restore dependencies from cache
85+
uses: actions/cache@v4
86+
with:
87+
path: ./mcp-server/node_modules
88+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
89+
90+
- name: Format check
91+
run: yarn format:check
92+
93+
type-check:
94+
needs: install-dependencies
95+
runs-on: ubuntu-latest
96+
defaults:
97+
run:
98+
working-directory: mcp-server
99+
steps:
100+
- name: Checkout code
101+
uses: actions/checkout@v4
102+
103+
- name: Setup node.js
104+
uses: actions/setup-node@v4
105+
with:
106+
node-version: '24'
107+
108+
- name: Restore dependencies from cache
109+
uses: actions/cache@v4
110+
with:
111+
path: ./mcp-server/node_modules
112+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
113+
114+
- name: Type check
115+
run: yarn typecheck
116+
117+
unit-test-check:
118+
needs: install-dependencies
119+
runs-on: ubuntu-latest
120+
defaults:
121+
run:
122+
working-directory: mcp-server
123+
steps:
124+
- name: Checkout code
125+
uses: actions/checkout@v4
126+
127+
- name: Setup node.js
128+
uses: actions/setup-node@v4
129+
with:
130+
node-version: '24'
131+
132+
- name: Restore dependencies from cache
133+
uses: actions/cache@v4
134+
with:
135+
path: ./mcp-server/node_modules
136+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
137+
138+
- name: Test
139+
run: yarn test
140+
141+
circular-check:
142+
needs: install-dependencies
143+
runs-on: ubuntu-latest
144+
defaults:
145+
run:
146+
working-directory: mcp-server
147+
steps:
148+
- name: Checkout code
149+
uses: actions/checkout@v4
150+
151+
- name: Setup node.js
152+
uses: actions/setup-node@v4
153+
with:
154+
node-version: '24'
155+
156+
- name: Restore dependencies from cache
157+
uses: actions/cache@v4
158+
with:
159+
path: ./mcp-server/node_modules
160+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
161+
162+
- name: Circular dependency check
163+
run: yarn circular
164+
165+
build-check:
166+
needs: install-dependencies
167+
runs-on: ubuntu-latest
168+
defaults:
169+
run:
170+
working-directory: mcp-server
171+
steps:
172+
- name: Checkout code
173+
uses: actions/checkout@v4
174+
175+
- name: Setup node.js
176+
uses: actions/setup-node@v4
177+
with:
178+
node-version: '24'
179+
180+
- name: Restore dependencies from cache
181+
uses: actions/cache@v4
182+
with:
183+
path: ./mcp-server/node_modules
184+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
185+
186+
- name: Build
187+
run: yarn build

.github/workflows/dev.yml

Lines changed: 169 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ permissions:
2020
contents: read
2121

2222
jobs:
23-
publish-dev:
23+
# ─────────────── Setup Job ───────────────
24+
install-dependencies:
2425
if: github.repository == 'JeremyDev87/codingbuddy'
2526
runs-on: ubuntu-latest
2627
defaults:
@@ -48,6 +49,173 @@ jobs:
4849
if: steps.cache.outputs.cache-hit != 'true'
4950
run: yarn install --immutable
5051

52+
# ─────────────── CI Jobs (parallel) ───────────────
53+
lint-check:
54+
needs: install-dependencies
55+
runs-on: ubuntu-latest
56+
defaults:
57+
run:
58+
working-directory: mcp-server
59+
steps:
60+
- name: Checkout code
61+
uses: actions/checkout@v4
62+
63+
- name: Setup node.js
64+
uses: actions/setup-node@v4
65+
with:
66+
node-version: '24'
67+
68+
- name: Restore dependencies from cache
69+
uses: actions/cache@v4
70+
with:
71+
path: ./mcp-server/node_modules
72+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
73+
74+
- name: Lint
75+
run: yarn lint
76+
77+
prettier-check:
78+
needs: install-dependencies
79+
runs-on: ubuntu-latest
80+
defaults:
81+
run:
82+
working-directory: mcp-server
83+
steps:
84+
- name: Checkout code
85+
uses: actions/checkout@v4
86+
87+
- name: Setup node.js
88+
uses: actions/setup-node@v4
89+
with:
90+
node-version: '24'
91+
92+
- name: Restore dependencies from cache
93+
uses: actions/cache@v4
94+
with:
95+
path: ./mcp-server/node_modules
96+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
97+
98+
- name: Format check
99+
run: yarn format:check
100+
101+
type-check:
102+
needs: install-dependencies
103+
runs-on: ubuntu-latest
104+
defaults:
105+
run:
106+
working-directory: mcp-server
107+
steps:
108+
- name: Checkout code
109+
uses: actions/checkout@v4
110+
111+
- name: Setup node.js
112+
uses: actions/setup-node@v4
113+
with:
114+
node-version: '24'
115+
116+
- name: Restore dependencies from cache
117+
uses: actions/cache@v4
118+
with:
119+
path: ./mcp-server/node_modules
120+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
121+
122+
- name: Type check
123+
run: yarn typecheck
124+
125+
unit-test-check:
126+
needs: install-dependencies
127+
runs-on: ubuntu-latest
128+
defaults:
129+
run:
130+
working-directory: mcp-server
131+
steps:
132+
- name: Checkout code
133+
uses: actions/checkout@v4
134+
135+
- name: Setup node.js
136+
uses: actions/setup-node@v4
137+
with:
138+
node-version: '24'
139+
140+
- name: Restore dependencies from cache
141+
uses: actions/cache@v4
142+
with:
143+
path: ./mcp-server/node_modules
144+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
145+
146+
- name: Test
147+
run: yarn test
148+
149+
circular-check:
150+
needs: install-dependencies
151+
runs-on: ubuntu-latest
152+
defaults:
153+
run:
154+
working-directory: mcp-server
155+
steps:
156+
- name: Checkout code
157+
uses: actions/checkout@v4
158+
159+
- name: Setup node.js
160+
uses: actions/setup-node@v4
161+
with:
162+
node-version: '24'
163+
164+
- name: Restore dependencies from cache
165+
uses: actions/cache@v4
166+
with:
167+
path: ./mcp-server/node_modules
168+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
169+
170+
- name: Circular dependency check
171+
run: yarn circular
172+
173+
build-check:
174+
needs: install-dependencies
175+
runs-on: ubuntu-latest
176+
defaults:
177+
run:
178+
working-directory: mcp-server
179+
steps:
180+
- name: Checkout code
181+
uses: actions/checkout@v4
182+
183+
- name: Setup node.js
184+
uses: actions/setup-node@v4
185+
with:
186+
node-version: '24'
187+
188+
- name: Restore dependencies from cache
189+
uses: actions/cache@v4
190+
with:
191+
path: ./mcp-server/node_modules
192+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
193+
194+
- name: Build
195+
run: yarn build
196+
197+
# ─────────────── CD Job ───────────────
198+
publish-dev:
199+
needs: [lint-check, prettier-check, type-check, unit-test-check, circular-check, build-check]
200+
runs-on: ubuntu-latest
201+
defaults:
202+
run:
203+
working-directory: mcp-server
204+
steps:
205+
- name: Checkout code
206+
uses: actions/checkout@v4
207+
208+
- name: Setup node.js
209+
uses: actions/setup-node@v4
210+
with:
211+
node-version: '24'
212+
213+
- name: Restore dependencies from cache
214+
uses: actions/cache@v4
215+
with:
216+
path: ./mcp-server/node_modules
217+
key: ${{ runner.os }}-yarn-${{ hashFiles(format('{0}{1}', github.workspace, '/mcp-server/yarn.lock')) }}
218+
51219
- name: Build
52220
run: yarn build
53221

0 commit comments

Comments
 (0)