Skip to content

Commit 7e3839a

Browse files
committed
remove docker as a release channel; strip dockerfile + publish-ghcr
Per the brief, the four documented install methods are uv / pipx / brew / pip; Docker was used during development as a testing artifact (notably the adguard-mutating-integration job, which pulls a third-party systemd image — not ours). It was never an intended distribution channel. Removed: - `Dockerfile` (the file itself) - `publish-ghcr` job from `release.yml` - `dockerfile-hadolint` job from `ci.yml` - Dependabot's `docker` ecosystem entry (now just pip + GH Actions) - The PR-template "If I touched Dockerfile" checklist row - Every operative reference to GHCR / publish-ghcr / Dockerfile in installation.md, release.md, shipping-checklist.md, onboarding.md, validation-scope.md, plans/known-issues.md, and the brief's DAG description. The brief below its banner remains intact as historical narrative — the banner already points at the cleanup plan as the source of truth for what shipped. The existing GHCR image at ghcr.io/simtabi/shimkit:0.2.x stays where it is — no auto-deletion. Future tags simply won't push to GHCR. README.md drops the "container image" phrase from its install pointer; installation.md leads with the GitHub-Release wheel and `pip install git+...@tag`. Gates: pytest 233 passed, ruff clean, mypy strict clean, all release.yml + ci.yml + dependabot.yml YAML parses.
1 parent 89cfb35 commit 7e3839a

14 files changed

Lines changed: 77 additions & 238 deletions

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,3 @@ Thanks for your contribution! A few notes:
3636
- [ ] I have not introduced subprocess calls outside `CommandRunner`
3737
- [ ] I have not put logic-critical strings in config (markers, regexes,
3838
atomic-replace semantics stay in code)
39-
- [ ] If I touched `Dockerfile`: image still builds (`docker build .`)

.github/dependabot.yml

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
version: 2
22

3-
# Dependabot watches three ecosystems for shimkit:
3+
# Dependabot watches two ecosystems for shimkit:
44
# 1. Python package dependencies (pyproject.toml)
55
# 2. GitHub Actions used by .github/workflows/
6-
# 3. The Dockerfile's base image
76
#
87
# Weekly is enough for a maintenance project; daily is noise. Security
98
# updates fire immediately regardless of schedule.
@@ -41,13 +40,3 @@ updates:
4140
timezone: "America/New_York"
4241
open-pull-requests-limit: 5
4342
labels: ["dependencies", "ci"]
44-
45-
- package-ecosystem: "docker"
46-
directory: "/"
47-
schedule:
48-
interval: "weekly"
49-
day: "monday"
50-
time: "06:00"
51-
timezone: "America/New_York"
52-
open-pull-requests-limit: 3
53-
labels: ["dependencies", "docker"]

.github/workflows/ci.yml

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,6 @@ jobs:
5454
# invocation still exits non-zero on real vulnerabilities.
5555
run: pip-audit --skip-editable
5656

57-
dockerfile-hadolint:
58-
runs-on: ubuntu-latest
59-
steps:
60-
- uses: actions/checkout@v6
61-
- uses: hadolint/hadolint-action@v3.1.0
62-
with:
63-
dockerfile: Dockerfile
64-
# DL3008 (apt-get install without =version) is intentional for slim images;
65-
# security updates come from rebuilds.
66-
# DL3013 (pin pip versions) fires on `pip install --upgrade pip
67-
# build` in the builder stage — we want the latest pip there.
68-
ignore: DL3008,DL3013
69-
7057
build:
7158
needs: test
7259
runs-on: ubuntu-latest

.github/workflows/release.yml

Lines changed: 6 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ jobs:
7575
path: dist/
7676

7777
# PyPI publishing is deliberately disabled. Distribution for v0.2.x
78-
# is via the container at ghcr.io/simtabi/shimkit and the GitHub
79-
# Release page's wheel + sdist. To re-enable, restore the
80-
# publish-pypi + bump-homebrew-tap jobs from git history and
81-
# configure trusted publishing at https://pypi.org/manage/account/publishing/
82-
# (Owner=simtabi, Repository=shimkit, Workflow=release.yml,
83-
# Environment=pypi, PyPI Project Name=shimkit).
78+
# is via the GitHub Release page's wheel + sdist. To re-enable PyPI,
79+
# restore the publish-pypi + bump-homebrew-tap jobs from git history
80+
# and configure trusted publishing at
81+
# https://pypi.org/manage/account/publishing/ (Owner=simtabi,
82+
# Repository=shimkit, Workflow=release.yml, Environment=pypi,
83+
# PyPI Project Name=shimkit).
8484

8585
github-release:
8686
needs: build
@@ -98,58 +98,4 @@ jobs:
9898
dist/*.whl
9999
dist/*.tar.gz
100100
dist/shimkit-sbom.spdx.json
101-
102-
publish-ghcr:
103-
name: Publish container to GHCR
104-
needs: build
105-
runs-on: ubuntu-latest
106-
permissions:
107-
packages: write
108-
# contents: write so anchore/sbom-action can attach the
109-
# container SBOM to the GitHub Release page (default
110-
# upload-release-assets=true on tag refs). Without write, the
111-
# action errors "Resource not accessible by integration".
112-
contents: write
113-
id-token: write
114-
attestations: write
115-
steps:
116-
- uses: actions/checkout@v6
117-
- uses: docker/setup-qemu-action@v4
118-
- uses: docker/setup-buildx-action@v4
119-
- uses: docker/login-action@v4
120-
with:
121-
registry: ghcr.io
122-
username: ${{ github.actor }}
123-
password: ${{ secrets.GITHUB_TOKEN }}
124-
- id: meta
125-
uses: docker/metadata-action@v6
126-
with:
127-
images: ghcr.io/${{ github.repository }}
128-
tags: |
129-
type=ref,event=tag
130-
type=semver,pattern={{version}}
131-
type=semver,pattern={{major}}.{{minor}}
132-
type=raw,value=latest
133-
- id: build-push
134-
uses: docker/build-push-action@v7
135-
with:
136-
context: .
137-
platforms: linux/amd64,linux/arm64
138-
push: true
139-
tags: ${{ steps.meta.outputs.tags }}
140-
labels: ${{ steps.meta.outputs.labels }}
141-
cache-from: type=gha
142-
cache-to: type=gha,mode=max
143-
- name: Attest container build provenance
144-
uses: actions/attest-build-provenance@v3
145-
with:
146-
subject-name: ghcr.io/${{ github.repository }}
147-
subject-digest: ${{ steps.build-push.outputs.digest }}
148-
push-to-registry: true
149-
- name: Generate container SBOM
150-
uses: anchore/sbom-action@v0
151-
with:
152-
image: ghcr.io/${{ github.repository }}@${{ steps.build-push.outputs.digest }}
153-
format: spdx-json
154-
artifact-name: shimkit-container-sbom.spdx.json
155101
upload-artifact: true

CHANGELOG.md

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,32 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
66

77
## [Unreleased]
88

9+
### Removed
10+
11+
- Container image as a release channel. Docker was a testing
12+
artifact during development (used by the `adguard-mutating-
13+
integration` CI job, which pulls a third-party systemd-capable
14+
image, not ours). The brief's documented install methods are uv /
15+
pipx / brew / pip — Docker was never one of them. Removed:
16+
`Dockerfile`, `publish-ghcr` workflow job, `dockerfile-hadolint`
17+
CI job, Dependabot's `docker` ecosystem entry, the Dockerfile
18+
checklist row in the PR template. The existing
19+
`ghcr.io/simtabi/shimkit:0.2.x` image is left in place but won't
20+
be updated by future tags.
21+
- `publish-pypi` and `bump-homebrew-tap` jobs (deferred). v0.2.2's
22+
`publish-pypi` repeatedly failed with `invalid-publisher` even
23+
with trusted-publishing configured on pypi.org. Restoration
24+
path: [`docs/shipping-checklist.md`](docs/shipping-checklist.md)
25+
Phase 4.
26+
927
### Changed
1028

11-
- Release pipeline: `publish-pypi` and `bump-homebrew-tap` jobs
12-
removed from `release.yml`. Distribution channels for v0.2.x are
13-
the GHCR container (`ghcr.io/simtabi/shimkit`) and the GitHub
14-
Release wheel + sdist. v0.2.2's `publish-pypi` job repeatedly
15-
failed with `invalid-publisher` even with trusted-publishing
16-
configured on pypi.org; rather than chase the OIDC-claim mismatch
17-
further this cycle, the project ships without PyPI for now.
18-
[`docs/shipping-checklist.md`](docs/shipping-checklist.md) Phase
19-
4 documents how to re-enable.
20-
- Docs: `docs/installation.md` now leads with the container and
21-
GitHub-Release wheel; PyPI-style install commands are marked
22-
pending. `docs/release.md` carries a banner noting the deferred
23-
PyPI channel.
29+
- `docs/installation.md` leads with the GitHub-Release wheel +
30+
`pip install git+...@tag`; PyPI-style commands are marked
31+
pending. `docs/release.md`, `docs/shipping-checklist.md`,
32+
`docs/validation-scope.md`, `docs/onboarding.md`,
33+
`docs/plans/known-issues.md`, and `prompt.md` updated to drop
34+
`publish-ghcr` / `dockerfile-hadolint` / Dockerfile references.
2435

2536
## [0.2.2] — 2026-05-14
2637

Dockerfile

Lines changed: 0 additions & 53 deletions
This file was deleted.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ brew install simtabi/tap/shimkit
2222
pip install --user shimkit
2323
```
2424

25-
Full install matrix, container image, optional dependency extras, and
26-
self-update behaviour: [`docs/installation.md`](docs/installation.md).
25+
Full install matrix, optional dependency extras, and self-update
26+
behaviour: [`docs/installation.md`](docs/installation.md).
2727

2828
## Tools
2929

docs/installation.md

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,28 @@
11
# Installation
22

3-
> **As of v0.2.2:** shimkit is distributed via the container at
4-
> `ghcr.io/simtabi/shimkit` and the wheel attached to each
5-
> [GitHub Release](https://github.com/simtabi/shimkit/releases).
3+
> **As of v0.2.2:** shimkit ships via the wheel + sdist attached to
4+
> each [GitHub Release](https://github.com/simtabi/shimkit/releases).
65
> Publishing to PyPI is deferred — the trusted-publisher setup is in
76
> place on the GitHub side (`release.yml` + `pypi` environment) but
8-
> the matching publisher on pypi.org is not configured yet, so
9-
> `pip install shimkit` does not work. Use one of the channels
10-
> below.
7+
> the matching publisher on pypi.org is not configured yet, so the
8+
> bare `pip install shimkit` / `uv tool install shimkit` /
9+
> `pipx install shimkit` / `brew install simtabi/tap/shimkit`
10+
> commands do not work yet. Use one of the install-from-source paths
11+
> below until PyPI is wired up.
1112
12-
## Recommended channels
13+
## Install from a release tag
1314

1415
```bash
15-
# 1. Container (fully attested, multi-arch, no Python toolchain needed on host).
16-
docker pull ghcr.io/simtabi/shimkit:0.2.2
17-
docker run --rm ghcr.io/simtabi/shimkit:0.2.2 --help
18-
19-
# 2. Wheel from the GitHub Release page (works with any Python ≥ 3.10).
16+
# 1. Wheel from the GitHub Release page (works with any Python ≥ 3.10).
2017
pip install --user \
2118
https://github.com/simtabi/shimkit/releases/download/v0.2.2/shimkit-0.2.2-py3-none-any.whl
2219

23-
# 3. Direct from a tag (no release-page step).
20+
# 2. Direct from a tag (no release-page step).
2421
pip install --user git+https://github.com/simtabi/shimkit@v0.2.2
2522
uv tool install git+https://github.com/simtabi/shimkit@v0.2.2
2623
pipx install git+https://github.com/simtabi/shimkit@v0.2.2
2724
```
2825

29-
The container is the most reproducible — pin to a digest
30-
(`ghcr.io/simtabi/shimkit@sha256:…`) for fully deterministic
31-
deploys. The wheel works on any system that already has a Python
32-
≥ 3.10 toolchain.
33-
3426
## PyPI-style channels (pending)
3527

3628
These will become the primary install once PyPI trusted-publishing
@@ -99,19 +91,6 @@ sha256sum /tmp/shimkit-${release}-py3-none-any.whl
9991
pip install --user "/tmp/shimkit-${release}-py3-none-any.whl"
10092
```
10193

102-
For the container image, `gh attestation verify` checks the
103-
provenance signature published to GHCR alongside each tag.
104-
105-
## Container image
106-
107-
```bash
108-
docker run --rm ghcr.io/simtabi/shimkit:latest version
109-
docker run --rm -v "$HOME/.config/shimkit:/home/shimkit/.config/shimkit" \
110-
ghcr.io/simtabi/shimkit:latest doctor
111-
```
112-
113-
Multi-arch (linux/amd64 + linux/arm64) is published per release.
114-
11594
## <a id="updates"></a>Updates
11695

11796
`shimkit self-update` detects how shimkit was installed (`uv` /

docs/onboarding.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ security ← bandit -ll + pip-audit. Fails on medium+.
463463
build ← sdist + wheel. Artifact uploaded.
464464
smoke ← install built wheel on macOS + Ubuntu, run CLI.
465465
adguard-integration ← real AGH on ubuntu-latest. JSON-asserted output.
466-
dockerfile-hadolint ← hadolint on Dockerfile.
466+
adguard-mutating-integration ← real `shimkit adguard fix` inside a privileged systemd container.
467467
```
468468

469469
All must pass before merge to `main` (once branch protection is

docs/plans/known-issues.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,20 +134,18 @@ new logic in the affected paths.
134134

135135
## Optional: `gh attestation verify` smoke test
136136

137-
The release workflow signs the wheel and the container image with
137+
The release workflow signs the wheel and sdist with
138138
`actions/attest-build-provenance@v3`. We don't currently have a CI
139139
job that **verifies** those attestations after publish (the action
140140
publishes them; nothing reads them back).
141141

142142
Low priority — Sigstore's transparency log is the authoritative
143143
record. A post-publish verify job would catch a misconfiguration of
144-
the publish flow, but the bug shape is rare and would be
145-
release-blocking by other means (PyPI upload failures, GHCR push
146-
failures, etc.) before the signature step.
144+
the publish flow, but the bug shape is rare.
147145

148-
If added: a `verify-release` job that runs after `publish-pypi` and
149-
`publish-ghcr`, fetching the published artifacts and running
150-
`gh attestation verify` against them.
146+
If added: a `verify-release` job that runs after `github-release`,
147+
fetching the published artifacts and running `gh attestation verify`
148+
against them.
151149

152150
---
153151

0 commit comments

Comments
 (0)