Skip to content

Comments

feat: switch base image to GitHub runner and add DevOps tools#1

Merged
miragecentury merged 15 commits intomainfrom
claude/update-base-image-tools-xNZ9h
Feb 19, 2026
Merged

feat: switch base image to GitHub runner and add DevOps tools#1
miragecentury merged 15 commits intomainfrom
claude/update-base-image-tools-xNZ9h

Conversation

@miragecentury
Copy link
Contributor

Replace ubuntu:24.04 base with ghcr.io/actions/runner for native
GitHub Actions runner support. Add skopeo, Argo Workflows CLI,
HashiCorp Packer, and Cloud Native Buildpacks (pack) CLI as
configurable build args.

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W

Replace ubuntu:24.04 base with ghcr.io/actions/runner for native
GitHub Actions runner support. Add skopeo, Argo Workflows CLI,
HashiCorp Packer, and Cloud Native Buildpacks (pack) CLI as
configurable build args.

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
Swap out HashiCorp Packer for Kargo CLI (v1.9.2) for application
lifecycle orchestration support.

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
Runs weekly (Monday 08:00 UTC) and on manual dispatch. Checks
latest releases for Argo, Kargo, and pack CLIs and opens a PR
when updates are available.

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
- Add build tools to image (dive, trivy, buildah, yq, hadolint) so
  the image can build itself as a self-hosted runner
- Configure buildah vfs storage driver for container/rootless usage
- Create semantic-release config for automated versioning from
  conventional commits with changelog generation
- Add release workflow: semantic-release -> buildah build -> dive
  filesystem scan -> trivy vulnerability scan -> skopeo push with
  semver tags (major, major.minor, full, latest)
- Add CI workflow: commitlint, hadolint lint, and build test on PRs
- Update scheduled update-tools workflow with new tools (dive,
  hadolint, yq)
- Add best practice configs: .hadolint.yaml (trusted registries),
  .commitlintrc.yaml (conventional commits), .containerignore
  (minimal build context)

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
Install pre-commit in the container image and add
.pre-commit-config.yaml with hooks for trailing whitespace,
YAML validation, hadolint, shellcheck, and commitlint.

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request transitions the container image from a basic Ubuntu base to the official GitHub Actions runner image, adding comprehensive DevOps tooling to create a self-hosted runner capable of building itself. The changes establish a complete CI/CD pipeline with automated version management, security scanning, and tool updates.

Changes:

  • Replaced ubuntu:24.04 base image with ghcr.io/actions/runner for native GitHub Actions support
  • Added DevOps CLI tools (Argo Workflows, Kargo, pack, skopeo) and build pipeline tools (buildah, dive, trivy, hadolint, yq, pre-commit)
  • Implemented automated release workflow with semantic versioning, vulnerability scanning, and multi-tag publishing to GHCR

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
Containerfile Switched to GitHub runner base image; added skopeo, buildah, trivy, dive, hadolint, yq, Argo CLI, Kargo CLI, pack CLI, and pre-commit; added Python 3.12/3.13/3.14 with Poetry and UV
manifest.yaml Updated build args from Ubuntu-specific to tool version args (RUNNER_VERSION, ARGO_VERSION, KARGO_VERSION, PACK_VERSION, DIVE_VERSION, HADOLINT_VERSION, YQ_VERSION)
README.md Complete documentation rewrite covering included tools, CI/CD workflows, release process, local development setup, and project structure
.github/workflows/release.yaml New semantic release workflow with buildah build, hadolint/dive/trivy scanning, and multi-tag push to GHCR
.github/workflows/ci.yaml New CI workflow with commitlint, hadolint linting, and test build validation
.github/workflows/update-tools.yaml New automated tool version checker that creates PRs when updates are available
.releaserc.yaml Semantic release configuration for automated versioning and changelog generation
.pre-commit-config.yaml Pre-commit hooks for code quality, linting, and commit message validation
.hadolint.yaml Hadolint configuration defining trusted container registries
.commitlintrc.yaml Commitlint configuration extending conventional commit rules
.containerignore Build context exclusions for CI artifacts and configuration files
Comments suppressed due to low confidence (1)

Containerfile:114

  • Poetry and UV are installed twice - once in the base stage as root (lines 105-114) and again in the runtime stage as the runner user (lines 127-136). This duplication is wasteful and increases image size unnecessarily. The base stage installations as root won't be available to the runner user anyway. Consider removing lines 105-114 from the base stage since they are properly installed in the runtime stage where they will actually be used.
# Install Poetry latest version and add it to PATH
# hadolint ignore=DL4006
RUN curl -sSL https://install.python-poetry.org | python3 -

# Install UV
# hadolint ignore=DL4006
RUN curl -LsSf https://astral.sh/uv/install.sh | sh

# Add Poetry and UV to PATH
RUN echo "export PATH=\"${APP_HOME}/.local/bin:\$PATH\"" >> ~/.bashrc

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

claude and others added 9 commits February 19, 2026 06:51
- Pin RUNNER_VERSION to 2.321.0 instead of latest for reproducible builds
- Combine skopeo and buildah into a single RUN/apt-get layer
- Remove silent || true from docker load/tag in release workflow
- Mount .hadolint.yaml in release workflow validation step
- Fix semver parsing with proper validation in release push step
- Pass manifest build args in CI test build to match release build
- Fix malformed hadolint pre-commit hook entry
- Track RUNNER_VERSION in update-tools workflow
- Remove duplicate Poetry/UV installs from base stage (only needed for runner user)

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
Replace the hand-rolled update-tools.yaml GitHub Actions workflow with
a Renovate configuration. Renovate handles version updates for all tools
(Runner, Argo, Kargo, pack, dive, hadolint, yq) across both Containerfile
and manifest.yaml via regex custom managers. It also natively handles
GitHub Actions and pre-commit hook updates.

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
- Switch all branch references from `master` to `main` to match the
  repo's actual default branch (ci.yaml, release.yaml, .releaserc.yaml,
  README.md). Without this, CI won't trigger on PRs and releases won't
  run on merge.

- Replace nondeterministic `docker load | docker tag $(head -1)` with
  `skopeo copy oci-archive:... docker-daemon:...` for a deterministic
  image load into the Docker daemon.

- Combine the first three apt-get RUN layers (system upgrade,
  deadsnakes Python, skopeo/buildah) into a single layer to reduce
  image size and redundant apt-get update calls.

- Fix README: pin RUNNER_VERSION=2.321.0 in the example manifest
  (was `latest`), replace update-tools workflow reference with
  Renovate, update project structure tree.

https://claude.ai/code/session_01RofXXAMZxK4irobNYjYn3W
- Change base image from ghcr.io/actions/runner to ghcr.io/actions/actions-runner to fix 403 on pull
- Use uppercase AS for stage aliases (AS base, AS runtime) to satisfy hadolint
- Update README base image reference

Co-authored-by: Cursor <cursoragent@cursor.com>
- Install python3.12-pip, python3.13-pip for pip on PATH
- Install build-essential and python3.12-dev, python3.13-dev to build C extensions

Co-authored-by: Cursor <cursoragent@cursor.com>
deadsnakes PPA does not provide python3.12-pip or python3.13-pip.
Bootstrap pip for both interpreters using ensurepip instead.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Use Containerfile terminology in builder.sh hadolint message
- Fix comment typos (trailing backslashes) in builder.sh and install_tools.sh
- Reorder README release workflow so hadolint runs before build
- Run hadolint with .hadolint.yaml in builder.sh to match release workflow
- Add files: ^Containerfile$ to pre-commit hadolint hook
- Add CHANGELOG.md and install-man-page.sh to project structure
- Note that local install may use different tool versions than image/CI

Co-authored-by: Cursor <cursoragent@cursor.com>
deadsnakes PPA does not ship ensurepip; use PyPA get-pip.py instead.

Co-authored-by: Cursor <cursoragent@cursor.com>
@miragecentury miragecentury self-assigned this Feb 19, 2026
@miragecentury miragecentury merged commit 201d914 into main Feb 19, 2026
3 checks passed
@miragecentury miragecentury deleted the claude/update-base-image-tools-xNZ9h branch February 19, 2026 20:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants