Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/fix-multiarch-docs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
bump: patch
---

Document all architecture-specific Docker tags in release notes

Fixed release notes template to document all available architecture-specific tags (-amd64, -arm64) for essentials, JS, and language sandboxes. The Docker images were already correctly built and pushed with these tags, but the release notes only mentioned "(multi-arch)".
48 changes: 33 additions & 15 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1628,27 +1628,36 @@ jobs:

### Essentials Sandbox (konard/sandbox-essentials)
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (AMD64)
- [\`${DOCKERHUB_IMAGE}-essentials:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-essentials) (ARM64)

### JS Sandbox (konard/sandbox-js)
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}-amd64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (AMD64)
- [\`${DOCKERHUB_IMAGE}-js:${VERSION}-arm64\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-js) (ARM64)

### Language Sandboxes
- [\`${DOCKERHUB_IMAGE}-python:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-python) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-go:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-go) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-rust:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rust) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-java:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-java) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-kotlin:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-kotlin) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-ruby:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-ruby) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-php:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-php) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-perl:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-perl) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-swift:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-swift) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-lean:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-lean) (multi-arch)
- [\`${DOCKERHUB_IMAGE}-rocq:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rocq) (multi-arch)
Each language sandbox is available in multi-arch, AMD64, and ARM64 variants:

| Language | Multi-arch | AMD64 | ARM64 |
|----------|------------|-------|-------|
| Python | [\`${DOCKERHUB_IMAGE}-python:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-python) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Go | [\`${DOCKERHUB_IMAGE}-go:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-go) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Rust | [\`${DOCKERHUB_IMAGE}-rust:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rust) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Java | [\`${DOCKERHUB_IMAGE}-java:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-java) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Kotlin | [\`${DOCKERHUB_IMAGE}-kotlin:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-kotlin) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Ruby | [\`${DOCKERHUB_IMAGE}-ruby:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-ruby) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| PHP | [\`${DOCKERHUB_IMAGE}-php:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-php) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Perl | [\`${DOCKERHUB_IMAGE}-perl:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-perl) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Swift | [\`${DOCKERHUB_IMAGE}-swift:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-swift) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Lean | [\`${DOCKERHUB_IMAGE}-lean:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-lean) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |
| Rocq | [\`${DOCKERHUB_IMAGE}-rocq:${VERSION}\`](https://hub.docker.com/r/${DOCKERHUB_IMAGE}-rocq) | \`${VERSION}-amd64\` | \`${VERSION}-arm64\` |

### GitHub Container Registry (GHCR)
- [\`${GHCR_IMAGE}:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox) (multi-arch)
- [\`${GHCR_IMAGE}-essentials:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-essentials) (multi-arch)
- [\`${GHCR_IMAGE}-js:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-js) (multi-arch)
All images are also available on GHCR with the same tag patterns:
- [\`${GHCR_IMAGE}:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
- [\`${GHCR_IMAGE}-essentials:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-essentials) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)
- [\`${GHCR_IMAGE}-js:${VERSION}\`](https://github.com/${REPO}/pkgs/container/sandbox-js) (multi-arch, AMD64: \`${VERSION}-amd64\`, ARM64: \`${VERSION}-arm64\`)

## Architecture

Expand All @@ -1664,11 +1673,20 @@ jobs:

## Quick Start

Pull from Docker Hub:
Pull multi-arch (auto-selects your platform):
\`\`\`sh
docker pull ${DOCKERHUB_IMAGE}:${VERSION}
\`\`\`

Pull specific architecture:
\`\`\`sh
# AMD64
docker pull ${DOCKERHUB_IMAGE}:${VERSION}-amd64

# ARM64 (Apple Silicon, Raspberry Pi, etc.)
docker pull ${DOCKERHUB_IMAGE}:${VERSION}-arm64
\`\`\`

Pull from GHCR:
\`\`\`sh
docker pull ${GHCR_IMAGE}:${VERSION}
Expand Down
83 changes: 83 additions & 0 deletions docs/case-studies/issue-39/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Case Study: Issue #39 - Multi-arch Docker Tag Documentation Gap

## Summary

**Issue**: [#39](https://github.com/link-foundation/sandbox/issues/39) - Make sure all docker versions support multi-arch, arm64 only, and amd64 only

**Root Cause**: Documentation gap in release notes template - architecture-specific tags exist on Docker Hub but are not documented in the GitHub release notes.

## Timeline of Events

| Date | Event |
|------|-------|
| 2026-02-01 | v1.3.0 release published |
| 2026-02-01 | All Docker images built with architecture-specific tags (`-amd64`, `-arm64`) |
| 2026-02-02 | Release notes published mentioning only multi-arch for most images |
| 2026-02-13 | Issue #39 reported identifying the documentation gap |

## Investigation Findings

### Docker Hub Tag Verification

All sandbox images actually have architecture-specific tags available:

| Image | Available Tags |
|-------|---------------|
| `konard/sandbox` | `1.3.0`, `1.3.0-amd64`, `1.3.0-arm64`, `latest`, `latest-amd64`, `latest-arm64` |
| `konard/sandbox-essentials` | `1.3.0`, `1.3.0-amd64`, `1.3.0-arm64`, `latest`, `latest-amd64`, `latest-arm64` |
| `konard/sandbox-js` | `1.3.0`, `1.3.0-amd64`, `1.3.0-arm64`, `latest`, `latest-amd64`, `latest-arm64` |
| `konard/sandbox-python` | `1.3.0`, `1.3.0-amd64`, `1.3.0-arm64`, `latest`, `latest-amd64`, `latest-arm64` |
| `konard/sandbox-go` | `1.3.0`, `1.3.0-amd64`, `1.3.0-arm64`, `latest`, `latest-amd64`, `latest-arm64` |
| `konard/sandbox-rust` | `1.3.0`, `1.3.0-amd64`, `1.3.0-arm64`, `latest`, `latest-amd64`, `latest-arm64` |
| (all other languages) | Same pattern: multi-arch + amd64 + arm64 tags |

### Release Notes Analysis

The release notes template in `.github/workflows/release.yml` (lines 1610-1692) shows:

**Full Sandbox Section (correct)**:
```
- konard/sandbox:${VERSION} (multi-arch)
- konard/sandbox:${VERSION}-amd64 (AMD64)
- konard/sandbox:${VERSION}-arm64 (ARM64)
```

**Essentials/JS/Language Sandboxes (incomplete)**:
```
- konard/sandbox-essentials:${VERSION} (multi-arch)
- konard/sandbox-js:${VERSION} (multi-arch)
- konard/sandbox-python:${VERSION} (multi-arch)
... etc
```

## Root Cause

The release notes template was written to only document full sandbox architecture variants in detail. When modular language sandboxes were added in v1.3.0, the workflow correctly builds and pushes architecture-specific tags for all images, but the release notes generation only mentions "(multi-arch)" for the new images.

This is a **documentation-only issue** - the actual Docker images are correctly built and available.

## Solution

Update the release notes template in `.github/workflows/release.yml` to document all available tags for each image:

1. Add `-amd64` and `-arm64` tag documentation for essentials sandbox
2. Add `-amd64` and `-arm64` tag documentation for JS sandbox
3. Add `-amd64` and `-arm64` tag documentation for all language sandboxes

## Verification Commands

```bash
# Verify tags exist for any image
docker manifest inspect konard/sandbox-python:1.3.0-amd64
docker manifest inspect konard/sandbox-python:1.3.0-arm64

# Pull specific architecture
docker pull --platform linux/amd64 konard/sandbox-python:1.3.0-amd64
docker pull --platform linux/arm64 konard/sandbox-python:1.3.0-arm64
```

## References

- Docker Hub API: `https://hub.docker.com/v2/repositories/konard/<image>/tags`
- GitHub workflow: `.github/workflows/release.yml`
- Release v1.3.0: https://github.com/link-foundation/sandbox/releases/tag/v1.3.0