Validation: T3 Arch Linux Ruby Base Image
Ticket
pal-e-platform#360 — Create shared Arch Linux Ruby base image in Harbor with weekly rebuild pipeline.
Environment
Harbor project
pal-e (id=42). Woodpecker pipeline 547 (manual trigger on main). Image: harbor.tail5b443a.ts.net/pal-e/ruby-arch:latest.Post-merge infra steps performed
- Created
pal-eHarbor project (HTTP 201) - Created Harbor robot
robot$pal-e+pal-e-ciwith push/pull permissions - Added
harbor_usernameandharbor_passwordrepo secrets (manual+cron events) - Moved pipelines to
.woodpecker/for multi-pipeline discovery (PR #362, merged) - Updated all 25 repo secrets to allow manual+cron events (Woodpecker validates secrets across all discovered pipelines)
- Created Woodpecker cron
ruby-arch-weekly-rebuild(Sunday 6am UTC)
Checks
| # | Criterion | How to Verify | Result | Evidence |
|---|---|---|---|---|
| 1 | Harbor project exists | Harbor API query | PASS | <code>pal-e</code> project created, id=42 |
| 2 | Pipeline builds and pushes image | Woodpecker pipeline 547 manual trigger | PASS | All steps success: clone, build-and-push |
| 3 | Image exists in Harbor | Harbor API: <code>/projects/pal-e/repositories</code> | PASS | <code>pal-e/ruby-arch:latest</code>, 366MB, 1 artifact |
| 4 | Ruby works | <code>docker run ... ruby --version</code> | PASS | ruby 3.4.8 (2025-12-17) |
| 5 | Bundler installed | <code>docker run ... gem list bundler</code> | PASS | bundler 4.0.11 installed; executable at <code>/root/.local/share/gem/ruby/3.4.0/bin/bundler</code> |
| 6 | jemalloc preloaded | <code>docker run ... ruby -e "puts :ok"</code> (LD_PRELOAD set in image ENV) | PASS | Runs without error, jemalloc loaded |
| 7 | Weekly cron configured | Woodpecker cron list | PASS | <code>ruby-arch-weekly-rebuild</code>, schedule <code>0 6 * * 0</code>, branch main |
Verdict
PASS — image builds, pushes, and runs correctly. All components verified: Ruby 3.4.8, Bundler 4.0.11, jemalloc preload, weekly cron.
Discovered Issues
- Gem bin not in PATH: Arch's Ruby puts
gem installbinaries in/root/.local/share/gem/ruby/3.4.0/bin/rather than/usr/bin/. Thebundlercommand isn't in PATH by default. Fix: addENV PATH="/root/.local/share/gem/ruby/3.4.0/bin:${PATH}"to the Dockerfile, or usegem install --no-user-install bundler. Minor — downstream Dockerfiles can work around it. - Multi-pipeline secret validation: Woodpecker validates secrets from ALL discovered
.woodpecker/*.yamlfiles against the event type, even for pipelines whosewhenconditions exclude that event. Required updating all 25 existing secrets to allow manual+cron events. This is a Woodpecker quirk worth documenting.