Skip to content

Commit 234e0a2

Browse files
Docs: Drop GitHub Releases from AI docs pipeline; redirect users (#3288)
Drop GitHub Releases from AI docs pipeline; redirect users to container/MCP Immutable releases (org ruleset) made the cleanup step fail on every run, and the high dispatch frequency was accumulating releases without bound. GCS and the container are already the live distribution layer, so GitHub Releases were a redundant channel causing errors with no path to fix. Changes: - `compile-ai-docs-from-gcs.yaml`: remove Create Release and Clean Up Old Releases steps; move Sign step before GCS upload; add .bundle files to GCS upload; drop contents:write permission; remove release-related egress endpoints; remove dead create_release dispatch input - `developer-resources.md`: remove GitHub Release table row; update intro and standalone script link to point to MCP docs - `mcp-server-ai-docs.md`: replace release curl commands with raw.githubusercontent.com for scripts + container extract for docs - `ai-docs-security.md`: replace direct-download verification block with container image verification Fixes #3286 and Fixes chainguard-dev/internal#5823 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a4121e5 commit 234e0a2

4 files changed

Lines changed: 44 additions & 94 deletions

File tree

.github/workflows/compile-ai-docs-from-gcs.yaml

Lines changed: 28 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,13 @@ on:
88
types: [ai-docs-source-updated]
99

1010
workflow_dispatch:
11-
inputs:
12-
create_release:
13-
description: 'Create a GitHub release with the bundle'
14-
required: false
15-
default: 'false'
16-
type: choice
17-
options:
18-
- 'true'
19-
- 'false'
2011

2112
concurrency:
2213
group: compile-ai-docs-${{ github.ref }}
2314
cancel-in-progress: false
2415

2516
permissions:
26-
contents: write # For creating/updating releases
17+
contents: read
2718
id-token: write # For GCP workload identity federation
2819
packages: write # For pushing to GHCR
2920
# TODO: Split into separate compile (read-only) and publish (write) jobs
@@ -56,15 +47,13 @@ jobs:
5647
objects.githubusercontent.com:443
5748
pypi.org:443
5849
raw.githubusercontent.com:443
59-
release-assets.githubusercontent.com:443
6050
rekor.sigstore.dev:443
6151
run.googleapis.com:443
6252
us-central1-run.googleapis.com:443
6353
sts.googleapis.com:443
6454
storage.googleapis.com:443
6555
timestamp.sigstore.dev:443
6656
tuf-repo-cdn.sigstore.dev:443
67-
uploads.github.com:443
6857
6958
- name: Checkout edu repository
7059
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -295,23 +284,45 @@ jobs:
295284
--role "roles/run.invoker" \
296285
--project "$PROJECT_ID" || true
297286
287+
- name: Sign bundle files
288+
if: github.ref == 'refs/heads/main'
289+
run: |
290+
cd static/downloads
291+
cosign sign-blob chainguard-ai-docs.tar.gz \
292+
--yes \
293+
--bundle=chainguard-ai-docs.tar.gz.bundle
294+
cosign sign-blob chainguard-ai-docs.md \
295+
--yes \
296+
--bundle=chainguard-ai-docs.md.bundle
297+
echo "Bundle files signed"
298+
298299
- name: Upload bundle back to GCS for distribution
299300
env:
300301
COMMIT_SHA: ${{ github.sha }}
301302
EVENT_NAME: ${{ github.event_name }}
302303
run: |
303304
echo "Uploading compiled bundle to GCS..."
304-
305+
305306
# Upload the compiled bundle for easy distribution
306307
gcloud storage cp static/downloads/chainguard-ai-docs.tar.gz \
307308
gs://academy-all-docs/compiled/chainguard-ai-docs.tar.gz \
308309
--project=chainguard-academy
309-
310+
310311
# Upload checksums
311312
gcloud storage cp static/downloads/checksums.txt \
312313
gs://academy-all-docs/compiled/checksums.txt \
313314
--project=chainguard-academy
314-
315+
316+
# Upload cosign bundle files for artifact verification (only present on main branch builds)
317+
if [ -f "static/downloads/chainguard-ai-docs.tar.gz.bundle" ]; then
318+
gcloud storage cp static/downloads/chainguard-ai-docs.tar.gz.bundle \
319+
gs://academy-all-docs/compiled/chainguard-ai-docs.tar.gz.bundle \
320+
--project=chainguard-academy
321+
gcloud storage cp static/downloads/chainguard-ai-docs.md.bundle \
322+
gs://academy-all-docs/compiled/chainguard-ai-docs.md.bundle \
323+
--project=chainguard-academy
324+
fi
325+
315326
# Create and upload compilation metadata
316327
python3 -c "
317328
import json, datetime, os
@@ -324,58 +335,9 @@ jobs:
324335
with open('/tmp/compilation-metadata.json', 'w') as f:
325336
json.dump(meta, f, indent=2)
326337
"
327-
338+
328339
gcloud storage cp /tmp/compilation-metadata.json \
329340
gs://academy-all-docs/compiled/metadata.json \
330341
--project=chainguard-academy
331-
332-
echo "✓ Bundle uploaded to GCS"
333-
334-
- name: Sign bundle files
335-
if: github.ref == 'refs/heads/main'
336-
run: |
337-
cd static/downloads
338-
cosign sign-blob chainguard-ai-docs.tar.gz \
339-
--yes \
340-
--bundle=chainguard-ai-docs.tar.gz.bundle
341-
cosign sign-blob chainguard-ai-docs.md \
342-
--yes \
343-
--bundle=chainguard-ai-docs.md.bundle
344-
echo "Bundle files signed"
345342
346-
- name: Create GitHub Release
347-
if: github.ref == 'refs/heads/main'
348-
env:
349-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
350-
run: |
351-
TAG="ai-docs-$(date -u +%Y%m%d-%H%M%S)"
352-
353-
gh release create "$TAG" \
354-
--title "AI Documentation Bundle $TAG" \
355-
--notes "Chainguard AI documentation bundle for use with AI coding assistants." \
356-
--latest \
357-
static/downloads/chainguard-ai-docs.tar.gz \
358-
static/downloads/chainguard-ai-docs.tar.gz.bundle \
359-
static/downloads/chainguard-ai-docs.md \
360-
static/downloads/chainguard-ai-docs.md.bundle \
361-
static/downloads/chainguard-ai-docs.zip \
362-
static/downloads/image-catalog.json \
363-
static/downloads/checksums.txt \
364-
scripts/mcp-server.py \
365-
scripts/mcp-requirements.txt
366-
367-
echo "Release $TAG created"
368-
369-
- name: Clean up old releases
370-
if: github.ref == 'refs/heads/main'
371-
env:
372-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
373-
run: |
374-
# Keep only the 10 most recent dated releases; delete older ones
375-
gh release list --limit 100 --json tagName,createdAt \
376-
| jq -r '[.[] | select(.tagName | test("^ai-docs-[0-9]{8}-[0-9]{6}$"))] | sort_by(.createdAt) | reverse | .[10:] | .[].tagName' \
377-
| while read -r tag; do
378-
echo "Deleting old release: $tag"
379-
gh release delete "$tag" --yes --cleanup-tag
380-
done
381-
echo "Release cleanup complete"
343+
echo "✓ Bundle uploaded to GCS"

content/ai-docs-security.md

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,14 @@ Example patterns we redact:
8686

8787
## Verification Guide
8888

89-
### Direct Download Verification
89+
### Container Image Verification
9090

91-
```bash
92-
# 1. Download files
93-
curl -LO https://github.com/chainguard-dev/edu/releases/latest/download/chainguard-ai-docs.tar.gz
94-
curl -LO https://github.com/chainguard-dev/edu/releases/latest/download/chainguard-ai-docs.tar.gz.bundle
91+
Verify the container image signature before pulling documentation:
9592

96-
# 2. Verify signature (using cosign v3 bundle format)
97-
cosign verify-blob \
98-
--bundle chainguard-ai-docs.tar.gz.bundle \
93+
```bash
94+
cosign verify ghcr.io/chainguard-dev/ai-docs:latest \
9995
--certificate-identity-regexp ".*github.com/chainguard-dev/edu.*" \
100-
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
101-
chainguard-ai-docs.tar.gz
102-
103-
# 3. Extract contents
104-
tar -xzf chainguard-ai-docs.tar.gz
96+
--certificate-oidc-issuer https://token.actions.githubusercontent.com
10597
```
10698

10799
## Build Frequency

content/developer-resources.md

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ toc: false
1313

1414
## AI-Ready Documentation Bundle
1515

16-
This page provides compiled Chainguard documentation optimized for use with AI coding assistants like Claude, ChatGPT, GitHub Copilot, and others. Choose between our cryptographically signed direct downloads or our secure container distribution.
16+
This page provides compiled Chainguard documentation optimized for use with AI coding assistants like Claude, ChatGPT, GitHub Copilot, and others. Access it through our secure container image or as a standalone Python MCP server.
1717

1818
### What's Included
1919

@@ -40,12 +40,6 @@ Choose your preferred distribution method:
4040
For enhanced security and verification, we recommend using the Chainguard container image. It includes built-in verification, runs as non-root, and is built on our secure <code>wolfi-base</code> image.
4141
</div>
4242

43-
### GitHub Release
44-
45-
| Format | Description | Verification |
46-
|--------|-------------|-------------|
47-
| [Latest Release](https://github.com/chainguard-dev/edu/releases/latest) | Cryptographically signed documentation bundle | Includes Cosign signatures and certificates |
48-
4943
### Container Distribution
5044

5145
Pull the secure, Chainguard-based container with embedded documentation:
@@ -119,7 +113,7 @@ Add to your `claude_desktop_config.json`:
119113
- Searchable and queryable documentation
120114
- Perfect for automated workflows
121115
- Works with Claude Desktop, Cursor, and other MCP-compatible tools
122-
- Also available as a [standalone Python script](https://github.com/chainguard-dev/edu/releases/latest) (no Docker required)
116+
- Also available as a [standalone Python script](/mcp-server-ai-docs/#standalone-installation-without-docker) (no Docker required)
123117

124118
[**Full MCP Server Documentation →**](/mcp-server-ai-docs/)
125119

@@ -137,7 +131,7 @@ docker run --rm -v $(pwd):/output ghcr.io/chainguard-dev/ai-docs:latest extract
137131
<div style="border: 2px solid #4CAF50; padding: 20px; border-radius: 8px; margin: 20px 0;">
138132
<h4>Available Security Features</h4>
139133
<ul>
140-
<li>Signed releases with Sigstore/Cosign</li>
134+
<li>Container image signed with Sigstore/Cosign</li>
141135
<li>Container distribution via GitHub Container Registry</li>
142136
<li>Automated updates via GitHub Actions</li>
143137
<li>Security scanning with gitleaks</li>

content/mcp-server-ai-docs.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,16 @@ latest, latest-dev, 3.13, 3.13-dev, ...
242242

243243
## Standalone Installation (without Docker)
244244

245-
The MCP server is also available as a standalone Python script from the [latest GitHub release](https://github.com/chainguard-dev/edu/releases/latest):
245+
The MCP server script and its dependencies are available directly from the repository. The documentation files are distributed via the container image.
246246

247247
```bash
248-
# Download the MCP server, requirements, docs, and catalog
249-
curl -LO https://github.com/chainguard-dev/edu/releases/latest/download/mcp-server.py
250-
curl -LO https://github.com/chainguard-dev/edu/releases/latest/download/mcp-requirements.txt
251-
curl -LO https://github.com/chainguard-dev/edu/releases/latest/download/chainguard-ai-docs.md
252-
curl -LO https://github.com/chainguard-dev/edu/releases/latest/download/image-catalog.json
248+
# Download the MCP server script and requirements
249+
curl -LO https://raw.githubusercontent.com/chainguard-dev/edu/main/scripts/mcp-server.py
250+
curl -LO https://raw.githubusercontent.com/chainguard-dev/edu/main/scripts/mcp-requirements.txt
251+
252+
# Extract the documentation bundle from the container image
253+
docker run --rm -v $(pwd):/output ghcr.io/chainguard-dev/ai-docs:latest extract /output
254+
# Writes chainguard-ai-docs.md and image-catalog.json to the current directory
253255

254256
# Install dependencies
255257
pip install -r mcp-requirements.txt

0 commit comments

Comments
 (0)