Repository navigation
image pins
Image pins move only through one reviewed pull request a week. See ADR 0030: Image Supply Chain for the reason, and Image Mirror Runbook for the mirror tool this flow calls.
The workflow .github/workflows/image-pin-bump.yml runs every Monday at 06:00 UTC. It can also be started by hand (workflow_dispatch).
-
tools/imagebumpreadsinternal/compose/images.yamland the policy.github/image-bump-policy.yaml. For each entry it lists the registry tags (throughscripts/images/mirror-images.sh --list-tags) and picks the newest tag the policy allows. - It rewrites the
versionof the entries that moved and nothing else in the file. - It runs
go run ./tools/imagelock -resolve, which regeneratesinternal/compose/images.lock.json. This also runs when no version moved, so floating tags such aslatestoralpinerefresh their digests. -
go run ./tools/imagelock -checkverifies the lock. - If nothing changed, the job prints
no pin changesand ends green. - Otherwise it regenerates
internal/reconcile/testdata/fixtures/dev-minimal/golden-tree.txtwithUPDATE_GOLDEN=1 go test -count=1 ./cmd/commands -run '^TestBuildPlanDevGolden$'. A failed regeneration stops the run before a PR is opened. - It runs
go test -count=1 ./internal/compose ./internal/config ./cmd/commands ./tools/imagebump/...against the bumped tree. A failure is recorded; it does not stop the PR from being opened. - The job opens one PR from branch
chore/image-pinswith the labelimage-pins, including the regenerated golden. A PR that is still open is updated in place. - On the branch head the job runs three more checks and writes their results, the lock check and the Go test result into the PR body:
- the image probe (
default-images-pullable.yml), - the stack smoke (
e2e-golden-path.ymlwithsource=local), -
scripts/images/mirror-images.sh --plan(status-line counts and the plan detail).
- the image probe (
- The job fails if the Go tests, the probe, the smoke or the plan failed. The PR body is written first. Go test failures list failing test and package names in the body; the full test log stays in the workflow run log.
If a later run finds no pin changes, a stale open chore/image-pins PR is left untouched. Close it by hand.
The PR is never merged automatically. A person reads the bumps and the check results, then merges.
PRs opened with the workflow token do not start the normal PR checks. Close and reopen the PR to run them.
Nothing is pushed to Docker Hub by the PR or by the weekly job.
Listing tags is slow for one repository: docker.elastic.co/elasticsearch/elasticsearch has about 49000 tags and takes roughly 15 minutes. The job allows 30 minutes per repository by default. Set IMAGEBUMP_LIST_TIMEOUT (a Go duration such as 45m) to change that.
.github/image-bump-policy.yaml has one entry per non-plugin entry of images.yaml. Plugin pins move with plugin releases and are skipped.
schema_version: 1
services:
hasura: {regex: '^v(\d+)\.(\d+)\.(\d+)$', track: patch}-
regexis an anchored RE2 expression (^...$). Its capture groups are the numeric version components. A tag the regex does not match is never chosen, so release candidates and variant tags stay out. -
track: patchkeeps the first two groups equal to the current tag's. Only the rest can grow. -
track: minorkeeps the first group equal. Use it only where upstream ships fixes as minor releases, and give the reason in a comment. - A tag with fewer groups than the track fixes never moves. A regex with no groups (
latest,alpine,pg16) never moves; only its digest refreshes. -
track: manualskips the entry. The committed policy does not use it. - The highest tag by numeric comparison wins (
v1.10.0is newer thanv1.9.0). The tool never proposes a lower version.
tools/imagebump exits 1 and names the entry when an image has no policy entry or its current version does not match its regex. Add the policy entry in the same change that adds the image.
Moving a floating line (for example Postgres 16 to 17) is a deliberate edit of images.yaml, not a weekly bump.
go run ./tools/imagebump --dry-run # prints BUMP lines, writes nothing
bash scripts/images/mirror-images.sh --plan # status lines on stdout, detail on stderrBoth need Docker. A dry run on the throwaway branch chore/image-pins-dry-run runs the whole workflow without a PR:
gh workflow run image-pin-bump.yml -f dry_run_pr=true -R nself-org/cliThe rendered PR body appears in the job summary and the branch is deleted at the end.
After a merge that changes internal/compose/images.lock.json, the job mirror-apply runs. It publishes the mirrors (mirror-images.sh --apply, using the DOCKERHUB_USERNAME and DOCKERHUB_TOKEN secrets) only when the repository variable IMAGE_MIRROR_APPLY is true. Otherwise the run log shows skipped: IMAGE_MIRROR_APPLY != true.
The owner turns it on and off:
gh variable set IMAGE_MIRROR_APPLY --body true -R nself-org/cli
gh variable delete IMAGE_MIRROR_APPLY -R nself-org/cliMirroring is a public push to docker.io/nself. Leave the variable unset until you want that.
Revert the merged PR. The lock returns to the previous pins on the next release. Mirrors are additive: a mirrored tag stays on Docker Hub and nothing needs deleting.
Getting Started
Commands
- Commands, Overview
- Lifecycle: cmd-init · cmd-build · cmd-start · cmd-stop · cmd-restart · cmd-dev
- Monitoring: cmd-status · cmd-logs · cmd-health · cmd-urls · cmd-doctor · cmd-monitor · cmd-alerts · cmd-sentry · cmd-watchdog
- Data: cmd-db · cmd-backup · cmd-dr · cmd-queue · cmd-webhooks
- Config: cmd-config · cmd-service · cmd-env · cmd-promote
- Networking: cmd-ssl · cmd-trust · cmd-dns-setup
- Security: cmd-access · cmd-security · cmd-secrets
- Tenancy: cmd-tenant · cmd-billing
- Plugins: cmd-plugin · cmd-license · cmd-dogfood (extracted, CLI-R11) · cmd-k8s (extracted, CLI-R11) · cmd-encryption (extracted, CLI-R11) · cmd-waf (extracted, CLI-R11) · cmd-federation (extracted, CLI-R11) · cmd-mail (extracted, CLI-R11) · cmd-dlq (extracted, CLI-R11)
- AI: cmd-ai · cmd-claw · cmd-model
- Templates: cmd-template
- Utilities: cmd-exec · cmd-clean · cmd-reset · cmd-update · cmd-upgrade · cmd-version · cmd-admin · cmd-migrate · cmd-migrate-firebase · cmd-migrate-supabase · cmd-completion
Features
- Features, Overview
- Feature-Auth
- Feature-Storage
- Feature-Search
- Feature-Functions
- Feature-Email
- Feature-Monitoring
- Feature-Plugins
- Feature-nClaw, AI Assistant
- Feature-nChat, Messaging
- Feature-nFamily, Family Social
- Feature-nCloud, Managed Hosting
- Feature-Memory-Rooms, Knowledge Organization
- Feature-Agent-Dashboard, Agent Metrics
- Feature-Image-Generation, AI Image Generation
Configuration
- Configuration, Overview
- Config-Env-Vars
- Config-Postgres
- Config-Hasura
- Config-Auth
- Config-Nginx
- Shared-Proxy
- Config-Optional-Services
- Config-Custom-Services
- Config-System
Plugins (87 + 10 monitoring)
- Plugin-Overview
- Plugin-Catalog
- Plugin-Install
- Plugin-Licensing
- Plugin-Architecture
- Plugin-Dev-Guide
- Plugin-Migrations-Contract
Free (25)
- plugin-backup
- plugin-content-acquisition
- plugin-content-progress
- plugin-cron
- plugin-donorbox
- plugin-feature-flags
- plugin-github
- plugin-github-runner
- plugin-invitations
- plugin-jobs
- plugin-link-preview
- plugin-mdns
- plugin-mlflow
- plugin-monitoring
- plugin-notifications
- plugin-notify
- plugin-paypal
- plugin-search
- plugin-shopify
- plugin-stripe
- plugin-subtitle-manager
- plugin-tokens
- plugin-torrent-manager
- plugin-vpn
- plugin-webhooks
Pro (62)
- plugin-access-controls
- plugin-activity-feed
- plugin-admin-api
- plugin-analytics
- plugin-auth
- plugin-bots
- plugin-browser
- plugin-calendar
- plugin-cdn
- plugin-chat
- plugin-claw
- plugin-claw-budget
- plugin-claw-news
- plugin-claw-web
- plugin-cloudflare
- plugin-cms
- plugin-compliance
- plugin-ddns
- plugin-devices
- plugin-documents
- plugin-entitlements
- plugin-file-processing
- plugin-game-metadata
- plugin-geocoding
- plugin-geolocation
- plugin-google
- plugin-home
- plugin-idme
- plugin-knowledge-base
- plugin-linkedin
- plugin-livekit
- plugin-media-processing
- plugin-meetings
- plugin-moderation
- plugin-mux
- plugin-object-storage
- plugin-observability
- plugin-photos
- plugin-podcast
- plugin-post
- plugin-realtime
- plugin-retro-gaming
- plugin-rom-discovery
- plugin-social
- plugin-sports
- plugin-support
- plugin-tmdb
- plugin-voice
- plugin-web3
- plugin-workflows
Planned (26)
plugin-auditplugin-blogplugin-checkoutplugin-commerceplugin-drmplugin-exportplugin-flowplugin-importplugin-ldapplugin-mailgunplugin-mediaplugin-oauth-providersplugin-pagesplugin-postmarkplugin-rate-limitplugin-reportsplugin-samlplugin-schedulerplugin-sendgridplugin-ssoplugin-subscriptionplugin-thumbplugin-transcoderplugin-twilioplugin-wafplugin-watermark
Guides
- Guide-Production-Deployment
- Guide-SSL-Setup
- Guide-Multi-Tenancy
- Guide-Security-Hardening
- Guide-Monitoring-Setup
- Guide-Backup-Restore
- Guide-Custom-Services
- Guide-Migration-from-v1
Architecture
- Architecture
- Architecture-Guardrails
- Service-Graph
- Compose-Generation
- Nginx-Generation
- Plugin-Architecture
Reference
Machine interface
-
JSON-Output,
--jsonenvelope -
Command-Registry,
nself help --json - Exit-Codes
- error-codes, Error Codes
-
Compat-V15,
NSELF_V15gate
Licensing
Security
Brand
Operations
- operations/release-cascade, Release Cascade
- operations/self-healing, Self-Healing Schema
- operations/redis-tuning, Redis Pool Tuning
- operations/meilisearch-warmup, MeiliSearch Warm-Up
- operations/jwt-rotation, JWT Key Rotation
- operations/windows-wsl2-setup, Windows / WSL2 Setup
- operations/gemini-oauth-reauth, Gemini OAuth Reauth
Contributing
Admin
- USER-ACTION-QUEUE, Pending Admin Actions
All commands (21)
- A: cmd-add · cmd-admin
- B: cmd-backup · cmd-build
- C: cmd-clean · cmd-config
- D: cmd-db · cmd-deploy · cmd-doctor
- E: cmd-exec
- I: cmd-init
- L: cmd-license · cmd-logs
- M: cmd-mcp
- R: cmd-remove · cmd-reset · cmd-restart
- S: cmd-start · cmd-status · cmd-stop
- U: cmd-update