mcp-rubber-duck 1.2.1 โ 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -7,6 +7,18 @@ on:
|
|
|
7
7
|
- main
|
|
8
8
|
workflow_dispatch:
|
|
9
9
|
|
|
10
|
+
env:
|
|
11
|
+
REGISTRY: ghcr.io
|
|
12
|
+
IMAGE_NAME: ${{ github.repository }}
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
issues: write
|
|
17
|
+
pull-requests: write
|
|
18
|
+
packages: write
|
|
19
|
+
security-events: write
|
|
20
|
+
actions: read
|
|
21
|
+
|
|
10
22
|
jobs:
|
|
11
23
|
test:
|
|
12
24
|
name: ๐งช Test Before Release
|
|
@@ -37,15 +49,103 @@ jobs:
|
|
|
37
49
|
# - name: ๐งช Test
|
|
38
50
|
# run: npm test
|
|
39
51
|
|
|
52
|
+
security-scan:
|
|
53
|
+
name: ๐ Security Scan
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
|
|
56
|
+
steps:
|
|
57
|
+
- name: ๐ฅ Checkout
|
|
58
|
+
uses: actions/checkout@v4
|
|
59
|
+
|
|
60
|
+
- name: ๐ Run Trivy vulnerability scanner
|
|
61
|
+
uses: aquasecurity/trivy-action@master
|
|
62
|
+
with:
|
|
63
|
+
scan-type: 'fs'
|
|
64
|
+
scan-ref: '.'
|
|
65
|
+
format: 'sarif'
|
|
66
|
+
output: 'trivy-results.sarif'
|
|
67
|
+
|
|
68
|
+
- name: ๐ค Upload Trivy scan results to GitHub Security
|
|
69
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
70
|
+
if: always()
|
|
71
|
+
with:
|
|
72
|
+
sarif_file: 'trivy-results.sarif'
|
|
73
|
+
category: 'trivy-filesystem'
|
|
74
|
+
|
|
75
|
+
- name: ๐ณ Build Docker image for security scan
|
|
76
|
+
run: |
|
|
77
|
+
docker build -t security-scan-image .
|
|
78
|
+
|
|
79
|
+
- name: ๐ Run Trivy on Docker image
|
|
80
|
+
uses: aquasecurity/trivy-action@master
|
|
81
|
+
with:
|
|
82
|
+
image-ref: 'security-scan-image'
|
|
83
|
+
format: 'sarif'
|
|
84
|
+
output: 'trivy-docker-results.sarif'
|
|
85
|
+
|
|
86
|
+
- name: ๐ค Upload Docker scan results
|
|
87
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
88
|
+
if: always()
|
|
89
|
+
with:
|
|
90
|
+
sarif_file: 'trivy-docker-results.sarif'
|
|
91
|
+
category: 'trivy-docker'
|
|
92
|
+
|
|
93
|
+
dependency-check:
|
|
94
|
+
name: ๐ฆ Dependency Check
|
|
95
|
+
runs-on: ubuntu-latest
|
|
96
|
+
|
|
97
|
+
steps:
|
|
98
|
+
- name: ๐ฅ Checkout
|
|
99
|
+
uses: actions/checkout@v4
|
|
100
|
+
|
|
101
|
+
- name: ๐ฆ Setup Node.js
|
|
102
|
+
uses: actions/setup-node@v4
|
|
103
|
+
with:
|
|
104
|
+
node-version: '20'
|
|
105
|
+
cache: 'npm'
|
|
106
|
+
|
|
107
|
+
- name: ๐ฅ Install dependencies
|
|
108
|
+
run: npm ci
|
|
109
|
+
|
|
110
|
+
- name: ๐ Audit dependencies
|
|
111
|
+
run: npm audit --audit-level=moderate
|
|
112
|
+
|
|
113
|
+
- name: ๐ Check for outdated packages
|
|
114
|
+
run: npm outdated || true
|
|
115
|
+
|
|
116
|
+
- name: ๐ Check for known vulnerabilities
|
|
117
|
+
run: npx audit-ci --config audit-ci.json || true
|
|
118
|
+
|
|
119
|
+
dockerfile-lint:
|
|
120
|
+
name: ๐ณ Dockerfile Lint
|
|
121
|
+
runs-on: ubuntu-latest
|
|
122
|
+
|
|
123
|
+
steps:
|
|
124
|
+
- name: ๐ฅ Checkout
|
|
125
|
+
uses: actions/checkout@v4
|
|
126
|
+
|
|
127
|
+
- name: ๐ Lint Dockerfile
|
|
128
|
+
uses: hadolint/hadolint-action@v3.1.0
|
|
129
|
+
with:
|
|
130
|
+
dockerfile: Dockerfile
|
|
131
|
+
format: sarif
|
|
132
|
+
output-file: hadolint-results.sarif
|
|
133
|
+
no-fail: true
|
|
134
|
+
|
|
135
|
+
- name: ๐ค Upload Dockerfile lint results
|
|
136
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
137
|
+
if: always()
|
|
138
|
+
with:
|
|
139
|
+
sarif_file: hadolint-results.sarif
|
|
140
|
+
category: 'hadolint'
|
|
141
|
+
|
|
40
142
|
release:
|
|
41
143
|
name: ๐ฆ Release
|
|
42
|
-
needs: test
|
|
144
|
+
needs: [test, security-scan, dependency-check, dockerfile-lint]
|
|
43
145
|
runs-on: ubuntu-latest
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
pull-requests: write
|
|
48
|
-
packages: write
|
|
146
|
+
outputs:
|
|
147
|
+
release-version: ${{ steps.get-version.outputs.version }}
|
|
148
|
+
new-release-published: ${{ steps.check-release.outputs.released }}
|
|
49
149
|
|
|
50
150
|
steps:
|
|
51
151
|
- name: ๐ฅ Checkout
|
|
@@ -66,12 +166,49 @@ jobs:
|
|
|
66
166
|
- name: ๐๏ธ Build
|
|
67
167
|
run: npm run build
|
|
68
168
|
|
|
169
|
+
- name: ๐ท๏ธ Get latest tag before release
|
|
170
|
+
id: tag-before
|
|
171
|
+
run: |
|
|
172
|
+
latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
|
|
173
|
+
echo "tag=$latest_tag" >> $GITHUB_OUTPUT
|
|
174
|
+
echo "Latest tag before release: $latest_tag"
|
|
175
|
+
|
|
69
176
|
- name: ๐ฆ Run semantic-release
|
|
70
177
|
env:
|
|
71
178
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
72
179
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
73
180
|
run: npx semantic-release
|
|
74
181
|
|
|
182
|
+
- name: ๐ท๏ธ Get latest tag after release
|
|
183
|
+
id: tag-after
|
|
184
|
+
run: |
|
|
185
|
+
git fetch --tags
|
|
186
|
+
latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
|
|
187
|
+
echo "tag=$latest_tag" >> $GITHUB_OUTPUT
|
|
188
|
+
echo "Latest tag after release: $latest_tag"
|
|
189
|
+
|
|
190
|
+
- name: ๐ฆ Extract version from new tag
|
|
191
|
+
id: get-version
|
|
192
|
+
run: |
|
|
193
|
+
if [ "${{ steps.tag-after.outputs.tag }}" != "none" ]; then
|
|
194
|
+
version=$(echo "${{ steps.tag-after.outputs.tag }}" | sed 's/^v//')
|
|
195
|
+
echo "version=$version" >> $GITHUB_OUTPUT
|
|
196
|
+
echo "Extracted version: $version"
|
|
197
|
+
else
|
|
198
|
+
echo "version=" >> $GITHUB_OUTPUT
|
|
199
|
+
fi
|
|
200
|
+
|
|
201
|
+
- name: ๐ Check if new release was published
|
|
202
|
+
id: check-release
|
|
203
|
+
run: |
|
|
204
|
+
if [ "${{ steps.tag-before.outputs.tag }}" != "${{ steps.tag-after.outputs.tag }}" ] && [ "${{ steps.tag-after.outputs.tag }}" != "none" ]; then
|
|
205
|
+
echo "released=true" >> $GITHUB_OUTPUT
|
|
206
|
+
echo "New release detected: ${{ steps.tag-after.outputs.tag }}"
|
|
207
|
+
else
|
|
208
|
+
echo "released=false" >> $GITHUB_OUTPUT
|
|
209
|
+
echo "No new release"
|
|
210
|
+
fi
|
|
211
|
+
|
|
75
212
|
- name: ๐ Release Summary
|
|
76
213
|
if: success()
|
|
77
214
|
run: |
|
|
@@ -82,8 +219,100 @@ jobs:
|
|
|
82
219
|
echo "- ๐ Generated changelog entries" >> $GITHUB_STEP_SUMMARY
|
|
83
220
|
echo "- ๐ท๏ธ Created git tag (if new version)" >> $GITHUB_STEP_SUMMARY
|
|
84
221
|
echo "- ๐ฆ Updated package.json version" >> $GITHUB_STEP_SUMMARY
|
|
85
|
-
|
|
222
|
+
if [ "${{ steps.check-release.outputs.released }}" == "true" ]; then
|
|
223
|
+
echo "- โ
**New version released:** ${{ steps.get-version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
|
224
|
+
echo "- ๐ณ Docker images will be built next" >> $GITHUB_STEP_SUMMARY
|
|
225
|
+
else
|
|
226
|
+
echo "- โน๏ธ **No new version:** No changes warranted a release" >> $GITHUB_STEP_SUMMARY
|
|
227
|
+
fi
|
|
228
|
+
|
|
229
|
+
docker:
|
|
230
|
+
name: ๐ณ Build & Push Docker Images
|
|
231
|
+
needs: release
|
|
232
|
+
runs-on: ubuntu-latest
|
|
233
|
+
if: needs.release.outputs.new-release-published == 'true'
|
|
234
|
+
|
|
235
|
+
steps:
|
|
236
|
+
- name: ๐ฅ Checkout release tag
|
|
237
|
+
uses: actions/checkout@v4
|
|
238
|
+
with:
|
|
239
|
+
ref: v${{ needs.release.outputs.release-version }}
|
|
240
|
+
fetch-depth: 0
|
|
241
|
+
|
|
242
|
+
- name: ๐ ๏ธ Set up QEMU
|
|
243
|
+
uses: docker/setup-qemu-action@v3
|
|
244
|
+
|
|
245
|
+
- name: ๐ ๏ธ Set up Docker Buildx
|
|
246
|
+
uses: docker/setup-buildx-action@v3
|
|
247
|
+
|
|
248
|
+
- name: ๐ Login to Container Registry
|
|
249
|
+
uses: docker/login-action@v3
|
|
250
|
+
with:
|
|
251
|
+
registry: ${{ env.REGISTRY }}
|
|
252
|
+
username: ${{ github.actor }}
|
|
253
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
254
|
+
|
|
255
|
+
- name: ๐ท๏ธ Extract metadata
|
|
256
|
+
id: meta
|
|
257
|
+
uses: docker/metadata-action@v5
|
|
258
|
+
with:
|
|
259
|
+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
260
|
+
tags: |
|
|
261
|
+
type=semver,pattern={{version}},value=${{ needs.release.outputs.release-version }}
|
|
262
|
+
type=semver,pattern={{major}}.{{minor}},value=${{ needs.release.outputs.release-version }}
|
|
263
|
+
type=semver,pattern={{major}},value=${{ needs.release.outputs.release-version }}
|
|
264
|
+
type=raw,value=latest
|
|
265
|
+
labels: |
|
|
266
|
+
org.opencontainers.image.title=MCP Rubber Duck
|
|
267
|
+
org.opencontainers.image.description=Multi-platform MCP server for multiple OpenAI-compatible LLMs
|
|
268
|
+
org.opencontainers.image.version=${{ needs.release.outputs.release-version }}
|
|
269
|
+
|
|
270
|
+
- name: ๐ณ Build and push Docker image
|
|
271
|
+
id: build
|
|
272
|
+
uses: docker/build-push-action@v5
|
|
273
|
+
with:
|
|
274
|
+
context: .
|
|
275
|
+
platforms: linux/amd64,linux/arm64
|
|
276
|
+
push: true
|
|
277
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
278
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
279
|
+
cache-from: type=gha
|
|
280
|
+
cache-to: type=gha,mode=max
|
|
281
|
+
build-args: |
|
|
282
|
+
BUILDKIT_INLINE_CACHE=1
|
|
283
|
+
|
|
284
|
+
- name: ๐ง Make package public
|
|
285
|
+
if: success()
|
|
286
|
+
run: |
|
|
287
|
+
# Wait a moment for package to appear
|
|
288
|
+
sleep 10
|
|
289
|
+
|
|
290
|
+
# Try to make package public (may fail if already public)
|
|
291
|
+
gh api --method PATCH \
|
|
292
|
+
"user/packages/container/${{ github.event.repository.name }}" \
|
|
293
|
+
--field visibility=public \
|
|
294
|
+
--silent || echo "Package may already be public or visibility change failed"
|
|
295
|
+
env:
|
|
296
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
297
|
+
|
|
298
|
+
- name: ๐ Docker Success Summary
|
|
299
|
+
if: success()
|
|
300
|
+
run: |
|
|
301
|
+
echo "๐ **Docker Images Built Successfully!**" >> $GITHUB_STEP_SUMMARY
|
|
302
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
303
|
+
echo "๐ฆ **Built for version:** ${{ needs.release.outputs.release-version }}" >> $GITHUB_STEP_SUMMARY
|
|
304
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
305
|
+
echo "๐ณ **Docker Images Published:**" >> $GITHUB_STEP_SUMMARY
|
|
306
|
+
for tag in $(echo '${{ steps.meta.outputs.tags }}' | tr ',' '\n'); do
|
|
307
|
+
echo "- \`$tag\`" >> $GITHUB_STEP_SUMMARY
|
|
308
|
+
done
|
|
309
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
310
|
+
echo "๐๏ธ **Platforms:** AMD64, ARM64" >> $GITHUB_STEP_SUMMARY
|
|
311
|
+
echo "๐ **Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
|
|
312
|
+
echo "๐ **Package URL:** https://github.com/${{ github.repository }}/pkgs/container/${{ github.event.repository.name }}" >> $GITHUB_STEP_SUMMARY
|
|
86
313
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
87
|
-
echo "
|
|
88
|
-
echo "
|
|
89
|
-
echo "
|
|
314
|
+
echo "๐ **Quick Test:**" >> $GITHUB_STEP_SUMMARY
|
|
315
|
+
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
|
|
316
|
+
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.release.outputs.release-version }}" >> $GITHUB_STEP_SUMMARY
|
|
317
|
+
echo "docker run --rm -e OPENAI_API_KEY=your-key ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.release.outputs.release-version }}" >> $GITHUB_STEP_SUMMARY
|
|
318
|
+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
## [1.2.3](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.2.2...v1.2.3) (2025-11-17)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* resolve js-yaml security vulnerability with package override ([822a550](https://github.com/nesquikm/mcp-rubber-duck/commit/822a550397cb9b3e3966a8c5335c2ab1182bfd91))
|
|
7
|
+
|
|
8
|
+
## [1.2.2](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.2.1...v1.2.2) (2025-09-17)
|
|
9
|
+
|
|
1
10
|
## [1.2.1](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.2.0...v1.2.1) (2025-09-17)
|
|
2
11
|
|
|
3
12
|
# [1.2.0](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.1.1...v1.2.0) (2025-09-17)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-rubber-duck",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "An MCP server that bridges to multiple OpenAI-compatible LLMs - your AI rubber duck debugging panel",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -61,5 +61,8 @@
|
|
|
61
61
|
"ts-jest": "^29.0.0",
|
|
62
62
|
"tsx": "^4.0.0",
|
|
63
63
|
"typescript": "^5.0.0"
|
|
64
|
+
},
|
|
65
|
+
"overrides": {
|
|
66
|
+
"js-yaml": "^4.1.1"
|
|
64
67
|
}
|
|
65
68
|
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
name: ๐ณ Docker Build & Deploy
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ master, main ]
|
|
6
|
-
paths-ignore:
|
|
7
|
-
- '**.md'
|
|
8
|
-
- 'docs/**'
|
|
9
|
-
- '.gitignore'
|
|
10
|
-
pull_request:
|
|
11
|
-
branches: [ master, main ]
|
|
12
|
-
paths-ignore:
|
|
13
|
-
- '**.md'
|
|
14
|
-
- 'docs/**'
|
|
15
|
-
- '.gitignore'
|
|
16
|
-
|
|
17
|
-
env:
|
|
18
|
-
REGISTRY: ghcr.io
|
|
19
|
-
IMAGE_NAME: ${{ github.repository }}
|
|
20
|
-
|
|
21
|
-
jobs:
|
|
22
|
-
test:
|
|
23
|
-
name: ๐งช Test
|
|
24
|
-
runs-on: ubuntu-latest
|
|
25
|
-
steps:
|
|
26
|
-
- name: ๐ฅ Checkout
|
|
27
|
-
uses: actions/checkout@v4
|
|
28
|
-
|
|
29
|
-
- name: ๐ฆ Setup Node.js
|
|
30
|
-
uses: actions/setup-node@v4
|
|
31
|
-
with:
|
|
32
|
-
node-version: '20'
|
|
33
|
-
cache: 'npm'
|
|
34
|
-
|
|
35
|
-
- name: ๐ฅ Install dependencies
|
|
36
|
-
run: npm ci
|
|
37
|
-
|
|
38
|
-
# Temporarily disabled lint to fix deployment
|
|
39
|
-
# - name: ๐ Lint
|
|
40
|
-
# run: npm run lint
|
|
41
|
-
|
|
42
|
-
- name: ๐๏ธ Build
|
|
43
|
-
run: npm run build
|
|
44
|
-
|
|
45
|
-
- name: ๐ฌ Type check
|
|
46
|
-
run: npm run typecheck
|
|
47
|
-
|
|
48
|
-
# Temporarily disabled tests to fix deployment
|
|
49
|
-
# - name: ๐งช Test
|
|
50
|
-
# run: npm test
|
|
51
|
-
|
|
52
|
-
build-and-push:
|
|
53
|
-
name: ๐ณ Build & Push
|
|
54
|
-
needs: test
|
|
55
|
-
runs-on: ubuntu-latest
|
|
56
|
-
# Only build images on push to master (not PRs)
|
|
57
|
-
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
|
58
|
-
permissions:
|
|
59
|
-
contents: read
|
|
60
|
-
packages: write
|
|
61
|
-
|
|
62
|
-
steps:
|
|
63
|
-
- name: ๐ฅ Checkout
|
|
64
|
-
uses: actions/checkout@v4
|
|
65
|
-
|
|
66
|
-
- name: ๐ ๏ธ Set up QEMU
|
|
67
|
-
uses: docker/setup-qemu-action@v3
|
|
68
|
-
|
|
69
|
-
- name: ๐ ๏ธ Set up Docker Buildx
|
|
70
|
-
uses: docker/setup-buildx-action@v3
|
|
71
|
-
|
|
72
|
-
- name: ๐ Login to Container Registry
|
|
73
|
-
uses: docker/login-action@v3
|
|
74
|
-
with:
|
|
75
|
-
registry: ${{ env.REGISTRY }}
|
|
76
|
-
username: ${{ github.actor }}
|
|
77
|
-
password: ${{ secrets.GITHUB_TOKEN }}
|
|
78
|
-
|
|
79
|
-
- name: ๐ท๏ธ Extract metadata
|
|
80
|
-
id: meta
|
|
81
|
-
uses: docker/metadata-action@v5
|
|
82
|
-
with:
|
|
83
|
-
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
84
|
-
tags: |
|
|
85
|
-
type=ref,event=branch
|
|
86
|
-
type=ref,event=pr
|
|
87
|
-
type=raw,value=latest,enable={{is_default_branch}}
|
|
88
|
-
type=raw,value={{date 'YYYY-MM-DD'}},enable={{is_default_branch}}
|
|
89
|
-
labels: |
|
|
90
|
-
org.opencontainers.image.title=MCP Rubber Duck
|
|
91
|
-
org.opencontainers.image.description=Multi-platform MCP server for multiple OpenAI-compatible LLMs
|
|
92
|
-
|
|
93
|
-
- name: ๐ณ Build and push Docker image
|
|
94
|
-
id: build
|
|
95
|
-
uses: docker/build-push-action@v5
|
|
96
|
-
with:
|
|
97
|
-
context: .
|
|
98
|
-
platforms: linux/amd64,linux/arm64
|
|
99
|
-
push: true
|
|
100
|
-
tags: ${{ steps.meta.outputs.tags }}
|
|
101
|
-
labels: ${{ steps.meta.outputs.labels }}
|
|
102
|
-
cache-from: type=gha
|
|
103
|
-
cache-to: type=gha,mode=max
|
|
104
|
-
build-args: |
|
|
105
|
-
BUILDKIT_INLINE_CACHE=1
|
|
106
|
-
|
|
107
|
-
- name: ๐ Image digest
|
|
108
|
-
run: echo ${{ steps.build.outputs.digest }}
|
|
109
|
-
|
|
110
|
-
- name: ๐ง Make package public
|
|
111
|
-
if: success()
|
|
112
|
-
run: |
|
|
113
|
-
# Wait a moment for package to appear
|
|
114
|
-
sleep 10
|
|
115
|
-
|
|
116
|
-
# Try to make package public (may fail if already public)
|
|
117
|
-
gh api --method PATCH \
|
|
118
|
-
"user/packages/container/${{ github.event.repository.name }}" \
|
|
119
|
-
--field visibility=public \
|
|
120
|
-
--silent || echo "Package may already be public or visibility change failed"
|
|
121
|
-
env:
|
|
122
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
123
|
-
|
|
124
|
-
- name: ๐ Image size
|
|
125
|
-
if: success()
|
|
126
|
-
run: |
|
|
127
|
-
echo "๐ **Docker Image Built Successfully!**" >> $GITHUB_STEP_SUMMARY
|
|
128
|
-
echo "" >> $GITHUB_STEP_SUMMARY
|
|
129
|
-
echo "๐ฆ **Image Details:**" >> $GITHUB_STEP_SUMMARY
|
|
130
|
-
echo "- ๐ท๏ธ **Tags:** \`${{ steps.meta.outputs.tags }}\`" >> $GITHUB_STEP_SUMMARY
|
|
131
|
-
echo "- ๐๏ธ **Platforms:** AMD64, ARM64" >> $GITHUB_STEP_SUMMARY
|
|
132
|
-
echo "- ๐ **Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
|
|
133
|
-
echo "" >> $GITHUB_STEP_SUMMARY
|
|
134
|
-
echo "๐ **Quick Start:**" >> $GITHUB_STEP_SUMMARY
|
|
135
|
-
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
|
|
136
|
-
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY
|
|
137
|
-
echo "docker compose up -d" >> $GITHUB_STEP_SUMMARY
|
|
138
|
-
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
name: ๐ Release & Deploy
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
tags:
|
|
6
|
-
- 'v*'
|
|
7
|
-
|
|
8
|
-
env:
|
|
9
|
-
REGISTRY: ghcr.io
|
|
10
|
-
IMAGE_NAME: ${{ github.repository }}
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
test:
|
|
14
|
-
name: ๐งช Test
|
|
15
|
-
runs-on: ubuntu-latest
|
|
16
|
-
steps:
|
|
17
|
-
- name: ๐ฅ Checkout
|
|
18
|
-
uses: actions/checkout@v4
|
|
19
|
-
|
|
20
|
-
- name: ๐ฆ Setup Node.js
|
|
21
|
-
uses: actions/setup-node@v4
|
|
22
|
-
with:
|
|
23
|
-
node-version: '20'
|
|
24
|
-
cache: 'npm'
|
|
25
|
-
|
|
26
|
-
- name: ๐ฅ Install dependencies
|
|
27
|
-
run: npm ci
|
|
28
|
-
|
|
29
|
-
- name: ๐ Lint
|
|
30
|
-
run: npm run lint
|
|
31
|
-
|
|
32
|
-
- name: ๐๏ธ Build
|
|
33
|
-
run: npm run build
|
|
34
|
-
|
|
35
|
-
- name: ๐ฌ Type check
|
|
36
|
-
run: npm run typecheck
|
|
37
|
-
|
|
38
|
-
# Temporarily disabled tests to fix deployment
|
|
39
|
-
# - name: ๐งช Test
|
|
40
|
-
# run: npm test
|
|
41
|
-
|
|
42
|
-
build-and-push:
|
|
43
|
-
name: ๐ณ Build & Push Release
|
|
44
|
-
needs: test
|
|
45
|
-
runs-on: ubuntu-latest
|
|
46
|
-
permissions:
|
|
47
|
-
contents: write
|
|
48
|
-
packages: write
|
|
49
|
-
|
|
50
|
-
steps:
|
|
51
|
-
- name: ๐ฅ Checkout
|
|
52
|
-
uses: actions/checkout@v4
|
|
53
|
-
|
|
54
|
-
- name: ๐ ๏ธ Set up QEMU
|
|
55
|
-
uses: docker/setup-qemu-action@v3
|
|
56
|
-
|
|
57
|
-
- name: ๐ ๏ธ Set up Docker Buildx
|
|
58
|
-
uses: docker/setup-buildx-action@v3
|
|
59
|
-
|
|
60
|
-
- name: ๐ Login to Container Registry
|
|
61
|
-
uses: docker/login-action@v3
|
|
62
|
-
with:
|
|
63
|
-
registry: ${{ env.REGISTRY }}
|
|
64
|
-
username: ${{ github.actor }}
|
|
65
|
-
password: ${{ secrets.GITHUB_TOKEN }}
|
|
66
|
-
|
|
67
|
-
- name: ๐ท๏ธ Extract metadata
|
|
68
|
-
id: meta
|
|
69
|
-
uses: docker/metadata-action@v5
|
|
70
|
-
with:
|
|
71
|
-
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
72
|
-
tags: |
|
|
73
|
-
type=ref,event=tag
|
|
74
|
-
type=semver,pattern={{version}}
|
|
75
|
-
type=semver,pattern={{major}}.{{minor}}
|
|
76
|
-
type=semver,pattern={{major}}
|
|
77
|
-
type=raw,value=latest
|
|
78
|
-
labels: |
|
|
79
|
-
org.opencontainers.image.title=MCP Rubber Duck
|
|
80
|
-
org.opencontainers.image.description=Multi-platform MCP server for multiple OpenAI-compatible LLMs
|
|
81
|
-
org.opencontainers.image.version=${{ github.ref_name }}
|
|
82
|
-
|
|
83
|
-
- name: ๐ณ Build and push Docker image
|
|
84
|
-
id: build
|
|
85
|
-
uses: docker/build-push-action@v5
|
|
86
|
-
with:
|
|
87
|
-
context: .
|
|
88
|
-
platforms: linux/amd64,linux/arm64
|
|
89
|
-
push: true
|
|
90
|
-
tags: ${{ steps.meta.outputs.tags }}
|
|
91
|
-
labels: ${{ steps.meta.outputs.labels }}
|
|
92
|
-
cache-from: type=gha
|
|
93
|
-
cache-to: type=gha,mode=max
|
|
94
|
-
build-args: |
|
|
95
|
-
BUILDKIT_INLINE_CACHE=1
|
|
96
|
-
|
|
97
|
-
- name: ๐ง Make package public
|
|
98
|
-
if: success()
|
|
99
|
-
run: |
|
|
100
|
-
# Wait a moment for package to appear
|
|
101
|
-
sleep 10
|
|
102
|
-
|
|
103
|
-
# Try to make package public (may fail if already public)
|
|
104
|
-
gh api --method PATCH \
|
|
105
|
-
"user/packages/container/${{ github.event.repository.name }}" \
|
|
106
|
-
--field visibility=public \
|
|
107
|
-
--silent || echo "Package may already be public or visibility change failed"
|
|
108
|
-
env:
|
|
109
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
110
|
-
|
|
111
|
-
- name: ๐ Generate Release Notes
|
|
112
|
-
id: release_notes
|
|
113
|
-
run: |
|
|
114
|
-
echo "## ๐ฆ MCP Rubber Duck ${{ github.ref_name }}" > release_notes.md
|
|
115
|
-
echo "" >> release_notes.md
|
|
116
|
-
echo "### ๐ณ Docker Images" >> release_notes.md
|
|
117
|
-
echo "" >> release_notes.md
|
|
118
|
-
echo "**Multi-platform support:** AMD64, ARM64 (works on Mac, Linux, Windows, Raspberry Pi 3+)" >> release_notes.md
|
|
119
|
-
echo "" >> release_notes.md
|
|
120
|
-
echo "\`\`\`bash" >> release_notes.md
|
|
121
|
-
echo "# Pull the latest release" >> release_notes.md
|
|
122
|
-
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}" >> release_notes.md
|
|
123
|
-
echo "" >> release_notes.md
|
|
124
|
-
echo "# Or use latest tag" >> release_notes.md
|
|
125
|
-
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> release_notes.md
|
|
126
|
-
echo "" >> release_notes.md
|
|
127
|
-
echo "# Quick start" >> release_notes.md
|
|
128
|
-
echo "cp .env.template .env" >> release_notes.md
|
|
129
|
-
echo "# Edit .env with your API keys" >> release_notes.md
|
|
130
|
-
echo "docker compose up -d" >> release_notes.md
|
|
131
|
-
echo "\`\`\`" >> release_notes.md
|
|
132
|
-
echo "" >> release_notes.md
|
|
133
|
-
echo "### ๐ฆ Available Tags" >> release_notes.md
|
|
134
|
-
echo "" >> release_notes.md
|
|
135
|
-
for tag in $(echo '${{ steps.meta.outputs.tags }}' | tr ',' '\n'); do
|
|
136
|
-
echo "- \`$tag\`" >> release_notes.md
|
|
137
|
-
done
|
|
138
|
-
echo "" >> release_notes.md
|
|
139
|
-
echo "### ๐ Deployment Options" >> release_notes.md
|
|
140
|
-
echo "" >> release_notes.md
|
|
141
|
-
echo "- **๐ฅ๏ธ Desktop/Server:** Use \`.env.desktop.example\` for optimal performance" >> release_notes.md
|
|
142
|
-
echo "- **๐ฅง Raspberry Pi:** Use \`.env.pi.example\` for memory-optimized settings" >> release_notes.md
|
|
143
|
-
echo "- **โ๏ธ Remote:** Deploy via SSH with \`./scripts/deploy.sh --mode ssh\`" >> release_notes.md
|
|
144
|
-
echo "" >> release_notes.md
|
|
145
|
-
echo "### โจ Features" >> release_notes.md
|
|
146
|
-
echo "" >> release_notes.md
|
|
147
|
-
echo "- ๐ฆ **Multiple AI Ducks:** Query OpenAI, Gemini, Groq, Ollama, and more" >> release_notes.md
|
|
148
|
-
echo "- ๐ฌ **Conversation Management:** Maintain context across messages" >> release_notes.md
|
|
149
|
-
echo "- ๐๏ธ **Duck Council:** Get responses from all configured LLMs" >> release_notes.md
|
|
150
|
-
echo "- ๐ **MCP Bridge:** Connect to external MCP servers" >> release_notes.md
|
|
151
|
-
echo "- ๐ **Universal Deployment:** Same image works on all platforms" >> release_notes.md
|
|
152
|
-
|
|
153
|
-
- name: ๐ Create GitHub Release
|
|
154
|
-
uses: actions/create-release@v1
|
|
155
|
-
env:
|
|
156
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
157
|
-
with:
|
|
158
|
-
tag_name: ${{ github.ref_name }}
|
|
159
|
-
release_name: MCP Rubber Duck ${{ github.ref_name }}
|
|
160
|
-
body_path: release_notes.md
|
|
161
|
-
draft: false
|
|
162
|
-
prerelease: false
|
|
163
|
-
|
|
164
|
-
- name: ๐ Success Summary
|
|
165
|
-
if: success()
|
|
166
|
-
run: |
|
|
167
|
-
echo "๐ **Release ${{ github.ref_name }} Published Successfully!**" >> $GITHUB_STEP_SUMMARY
|
|
168
|
-
echo "" >> $GITHUB_STEP_SUMMARY
|
|
169
|
-
echo "๐ฆ **Docker Images Built:**" >> $GITHUB_STEP_SUMMARY
|
|
170
|
-
for tag in $(echo '${{ steps.meta.outputs.tags }}' | tr ',' '\n'); do
|
|
171
|
-
echo "- \`$tag\`" >> $GITHUB_STEP_SUMMARY
|
|
172
|
-
done
|
|
173
|
-
echo "" >> $GITHUB_STEP_SUMMARY
|
|
174
|
-
echo "๐๏ธ **Platforms:** AMD64, ARM64" >> $GITHUB_STEP_SUMMARY
|
|
175
|
-
echo "๐ **Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
|
|
176
|
-
echo "๐ **Package URL:** https://github.com/${{ github.repository }}/pkgs/container/${{ github.event.repository.name }}" >> $GITHUB_STEP_SUMMARY
|
|
177
|
-
echo "" >> $GITHUB_STEP_SUMMARY
|
|
178
|
-
echo "๐ **Quick Test:**" >> $GITHUB_STEP_SUMMARY
|
|
179
|
-
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
|
|
180
|
-
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
|
|
181
|
-
echo "docker run --rm -e OPENAI_API_KEY=your-key ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
|
|
182
|
-
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
|