0
0
Fork
You've already forked sharedinbox
0

fix: automate dev container image build via devcontainer.json + CI #552

Closed
opened 2026年06月09日 16:06:47 +02:00 by guettlibot · 1 comment
Collaborator
Copy link

Problem

`Dockerfile.dev` is the source for `ghcr.io/guettli/sharedinbox-dev` but the image was pushed manually. There is no CI workflow that rebuilds and republishes the image when the Dockerfile changes, so the published image can silently drift from its source.

Plan

1. Add `.devcontainer/devcontainer.json`

Create `.devcontainer/devcontainer.json` referencing `../Dockerfile.dev` as the build source. This:

  • Makes the relationship between the Dockerfile and the published image explicit and machine-readable
  • Enables VS Code / Codespaces / any devcontainer-aware tool to build the environment directly from source
  • Serves as the canonical definition that the CI workflow reads

2. Add `.forgejo/workflows/publish-dev-container.yml`

Trigger on push to `main` when `Dockerfile.dev` changes. Build and push the image to the Codeberg container registry (`codeberg.org/guettli/sharedinbox-dev`) using the built-in `FORGEJO_TOKEN` — no extra secrets needed.

Steps:

  • `docker build -t codeberg.org/guettli/sharedinbox-dev:latest -f Dockerfile.dev .`
  • Tag with the short commit SHA for pinnable references
  • `docker push` both tags

3. Update image reference

Update any references from the manually-pushed `ghcr.io/guettli/sharedinbox-dev` to `codeberg.org/guettli/sharedinbox-dev`.

Alternative: Keep GHCR and push from CI using a `GITHUB_PAT_PACKAGES` secret (`write:packages` scope). Codeberg's own registry is simpler since `FORGEJO_TOKEN` works out of the box.

Acceptance criteria

  • `.devcontainer/devcontainer.json` present and valid
  • CI workflow triggers on `Dockerfile.dev` changes and pushes a new image
  • Image tagged with both `latest` and the commit SHA
  • No manual push step required to keep the image in sync


Agentloop runs

# Started (UTC) Ended (UTC) Status Tokens in Tokens out
1 2026年06月09日 14:22:05 2026年06月09日 14:27:03 success 57 11 119
## Problem \`Dockerfile.dev\` is the source for \`ghcr.io/guettli/sharedinbox-dev\` but the image was pushed manually. There is no CI workflow that rebuilds and republishes the image when the Dockerfile changes, so the published image can silently drift from its source. ## Plan ### 1. Add \`.devcontainer/devcontainer.json\` Create \`.devcontainer/devcontainer.json\` referencing \`../Dockerfile.dev\` as the build source. This: - Makes the relationship between the Dockerfile and the published image explicit and machine-readable - Enables VS Code / Codespaces / any devcontainer-aware tool to build the environment directly from source - Serves as the canonical definition that the CI workflow reads ### 2. Add \`.forgejo/workflows/publish-dev-container.yml\` Trigger on push to \`main\` when \`Dockerfile.dev\` changes. Build and push the image to the Codeberg container registry (\`codeberg.org/guettli/sharedinbox-dev\`) using the built-in \`FORGEJO_TOKEN\` — no extra secrets needed. Steps: - \`docker build -t codeberg.org/guettli/sharedinbox-dev:latest -f Dockerfile.dev .\` - Tag with the short commit SHA for pinnable references - \`docker push\` both tags ### 3. Update image reference Update any references from the manually-pushed \`ghcr.io/guettli/sharedinbox-dev\` to \`codeberg.org/guettli/sharedinbox-dev\`. > **Alternative:** Keep GHCR and push from CI using a \`GITHUB_PAT_PACKAGES\` secret (\`write:packages\` scope). Codeberg's own registry is simpler since \`FORGEJO_TOKEN\` works out of the box. ## Acceptance criteria - [ ] \`.devcontainer/devcontainer.json\` present and valid - [ ] CI workflow triggers on \`Dockerfile.dev\` changes and pushes a new image - [ ] Image tagged with both \`latest\` and the commit SHA - [ ] No manual push step required to keep the image in sync --- --- <!-- agentloop-summary --> **Agentloop runs** | # | Started (UTC) | Ended (UTC) | Status | Tokens in | Tokens out | |---|---------------------|---------------------|---------|-----------|------------| | 1 | 2026年06月09日 14:22:05 | 2026年06月09日 14:27:03 | success | 57 | 11 119 |
Author
Collaborator
Copy link

PR #553 is open against main.

Summary

Implemented #552 in PR #553:

  • .devcontainer/devcontainer.json — references ../Dockerfile.dev so devcontainer-aware tools (VS Code, Codespaces, etc.) build the dev environment from source, and makes the relationship between the Dockerfile and the published image explicit/machine-readable.
  • .forgejo/workflows/publish-dev-container.yml — triggers on push to main when Dockerfile.dev, the devcontainer config, or the workflow itself changes (plus workflow_dispatch). Logs in to codeberg.org with the built-in FORGEJO_TOKEN, builds the image, tags it both :latest and :<short-sha>, and pushes both.

Note on step 3 of the plan: grepping for sharedinbox-dev and ghcr.io showed no existing references to update — Dockerfile.dev is brand new (added in the recent drop-nix commit 517f7a6) and no consumer hardcodes the image yet, so the "update references" step is a no-op for this change.

Verified the new JSON/YAML files parse cleanly with Python.

agentloop · agent: claude

PR #553 is open against `main`. ## Summary Implemented #552 in PR [#553](https://codeberg.org/guettli/sharedinbox/pulls/553): - **`.devcontainer/devcontainer.json`** — references `../Dockerfile.dev` so devcontainer-aware tools (VS Code, Codespaces, etc.) build the dev environment from source, and makes the relationship between the Dockerfile and the published image explicit/machine-readable. - **`.forgejo/workflows/publish-dev-container.yml`** — triggers on push to `main` when `Dockerfile.dev`, the devcontainer config, or the workflow itself changes (plus `workflow_dispatch`). Logs in to `codeberg.org` with the built-in `FORGEJO_TOKEN`, builds the image, tags it both `:latest` and `:<short-sha>`, and pushes both. Note on step 3 of the plan: grepping for `sharedinbox-dev` and `ghcr.io` showed no existing references to update — `Dockerfile.dev` is brand new (added in the recent drop-nix commit `517f7a6`) and no consumer hardcodes the image yet, so the "update references" step is a no-op for this change. Verified the new JSON/YAML files parse cleanly with Python. <sub>agentloop · agent: claude</sub>
Sign in to join this conversation.
No Branch/Tag specified
main
issue-560-fix-firebase-run-url
issue-539-stable-imap-uid
issue-533-shared-email-list
plan-issue-555
drop-nix
plan-issue-484
plan-issue-539
plan-issue-535
plan-issue-474
plan-issue-533
fix-dagger-engineless-precommit
issue-521-fix-deploy-yml-wait-time-api
issue-502-fix-email-id-collision-mailbox
issue-492-eliminate-duplicate-build-runner
issue-494-website-change-detection
issue-491-parallelize-check
issue-478-fix-stalwart-dual-stack-bind
issue-475-allowed-addresses-glob
issue-473-search-result-reorder
issue-453-update-agentloop-defaults
issue-466-structured-search
issue-505-exclude-chaos-monkey-from-regular-ci
issue-509-fix-search-result-sorting
fix-ink-sparkle-remaining-tests
issue-506-fix-search-emails-tests
issue-504-runner-wait-time
issue-488-search-notes
issue-472-changelog-issue-links
issue-501-folder-search-local-sqlite
issue-486-fix-stale-test-shader-mismatch
fix/prevent-settled-search-rerun-473
issue-467-fix-search-stale-results
issue-446-installed-versions-in-changelog
issue-462-fix-pr
issue-448-chaos-monkey-test
issue-436-notes-on-emails
issue-429-unify-mail-display
issue-422-move-to-folder-create-new
issue-414-ensure-not-run-as-root
issue-424-unify-email-list-views
issue-419-trusted-senders-page
issue-425-fix-prs
test-foo
issue-421-bug-report
issue-383-fix-ci
issue-394-fix-deploy-flutter-version
issue-391-fix-ci-double-trigger
issue-376-combined-inbox-v2
issue-376-combined-inbox
issue-384-fix-open-prs
sops-migrate
issue-339-safe-first-on-imap-fetch
issue-340-try-catch-measure-height
issue-342-pin-intl-version
issue-341-guard-threademails-last
issue-335-agentloop-code-test
issue-329-fix
issue-315-fix
issue-320-fix
issue-325-fix
issue-312-fix
issue-311-fix
issue-305-fix
issue-304-fix
issue-299-fix
issue-300-fix
issue-298-fix
issue-296-fix
issue-294-fix
issue-289-fix
issue-288-fix
issue-287-fix
issue-286-fix
issue-277-fix
issue-282-fix
issue-280-fix
issue-272-fix
issue-268-fix
issue-267-fix
issue-266-fix
issue-258-fix
issue-260-fix
issue-257-fix
issue-253-fix
issue-216-fix
issue-251-fix
issue-249-fix
issue-question-fixes
issue-235-fix
issue-236-fix-v2
issue-237-fix
issue-236-fix
issue-228-fix
issue-217-fix
issue-214-fix
issue-213-fix
issue-208-fix
issue-205-fix
issue-204-fix
issue-203-fix
issue-202-fix
issue-129-fix
issue-161-fix
issue-160-fix
issue-201-fix
issue-210-fix
issue-198-fix
issue-200-fix
issue-144-fix
issue-199-fix
fix/playstore-upload-use-requests
issue-193-fix
issue-186-fix
issue-185-fix
issue-192-fix
issue-183-fix
issue-175-fix
issue-172-fix
issue-171-fix
issue-167-fix
issue-136-fix
issue-162-fix
issue-179-fix
issue-155-fix
issue-154-fix
issue-152-fix
issue-151-fix
issue-141-fix
issue-150-fix
issue-164-fix
migrate-to-dagger
task/d1-ci-matrix
task/a4-typeconverter-json
task/u7-onboarding-walkthrough
task/d3-sync-doc
task/a5-layer-boundary-lint
task/t5-golden-tests
task/p5-date-cache
task/s4-link-handling
task/p3-html-parse-isolate
task/u8-mark-all-read
task/u3-recent-searches
task/a3-jmap-injectable-http-client
task/r5-tls-error-handling
fix/playstore-redirect-retry
task/t3-repository-contract-tests
task/p2-email-list-pagination
task/p1-fts5-search
fix/playstore-upload-timeout
task/a1-email-detail-notifier
fix/upgrade-workmanager-0.9
fix/android-core-library-desugaring
task/p4-db-indexes
task/r3-html-error-boundary
task/d2-check-coverage
task/a2-email-tile
task/t4-migration-tests
task/t2-widget-tests
task/t1-email-repo-coverage
task/u6-connection-status
task/u4-push-notifications
task/u2-draft-sync
task/u1-list-unsubscribe
task/s2-hostname-validation
task/r6-reliability-fuzz-tests
task/r4-sync-error-banner
task/r2-force-resync
task/r1-undo-history-persistence
No results found.
Labels
Clear labels
automerge
Eligible for automatic merge by CI
ci-failure
Issue opened by agentloop to track a failing CI workflow; used for deduplication.
do-not-merge
Plan PR — review only, do not merge.
loop
code
Add to run the built-in "code" prompt; override at prompts/code.md.
loop/code-ci-pending
Prompt "code" finished; waiting for the PR's CI to pass before advancing.
loop
code-done
Prompt "code" finished successfully.
loop/code-in-process
Agent for the "code" prompt is currently running on this issue.
loop/merge
Managed by agentloop
loop/merge-done
Managed by agentloop
loop/merge-in-process
Managed by agentloop
loop
plan
Add to run the built-in "plan" prompt; override at prompts/plan.md.
loop
plan-done
Prompt "plan" finished successfully.
loop/plan-in-process
Agent for the "plan" prompt is currently running on this issue.
NeedSupervisor
Issue escalated to a human supervisor; agentloop will skip it until cleared.
State
InProgress
State
Later
State
Planned
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
guettli/sharedinbox#552
Reference in a new issue
guettli/sharedinbox
No description provided.
Delete branch "%!s()"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?