fix(docker): restore OTP crypto ABI compatibility - #1509
fix(docker): restore OTP crypto ABI compatibility#1509plural-copilot[bot] wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
This PR was generated by the codex Plural Agent Runtime. Here's some useful information you might want to know to evaluate the ai's perfomance:
| Name | Details |
|---|---|
| 馃挰 Prompt | Create a single focused production-hotfix PR for the confirmed v0.12.48 Docker ABI regression. Do not touch live infrastructure, do not downgrade app/Hex dependencies, do not pin/downgrade merely to a release tag, and do not cherry-pick the broad upgrade-elixir branch.... |
| 馃敆 Run history | View run history |
Greptile SummaryThe PR aligns the Elixir builder and final runtime on the same pinned OTP/Alpine image to restore OpenSSL ABI compatibility. It also adds a final-image crypto smoke test and changes publication workflows to smoke locally loaded images before pushing their tags.
Confidence Score: 5/5The PR appears safe to merge, with no concrete changed-code defect identified in the ABI alignment or smoke-before-push paths. The builder and runtime use the same pinned OTP image, the release receives its application name before packaging, and each workflow smokes the same single-platform local image whose aliases are subsequently pushed.
|
| Filename | Overview |
|---|---|
| Dockerfile | Pins matching builder/runtime images and compiles Elixir 1.13.4 from verified source so packaged OTP NIFs use the runtime OpenSSL ABI. |
| bin/smoke-image | Runs the final image with required VM environment and verifies that the packaged release can initialize the crypto application. |
| .github/workflows/publish.yaml | Loads each release image locally, smokes the loaded artifact, and then pushes all metadata-generated aliases. |
| .github/workflows/test.yaml | Moves backend image publication after the crypto smoke gate while retaining Trivy scanning of the locally loaded image. |
| Makefile | Adds a reusable smoke target and gates pushes for the four root application images. |
| .gitlab-ci.yml | Adds the crypto smoke gate to each legacy root-image build job before publication. |
Reviews (1): Last reviewed commit: "fix(docker): pair OTP runtime and crypto..." | Re-trigger Greptile
Production signature
Root cause
v0.12.48 moved the root final runtime from an OTP/OpenSSL-1.1-era image to
erlang:24.3.4.17-alpinewhile retaining the legacybitwalker/alpine-elixir:1.13.4builder. That builder packaged an OTP crypto NIF with an OpenSSL 1.1 dependency into a final runtime that provides OpenSSL 3, producing the startup failure above.Fix and scope
erlang:24.3.4.17-alpine.hexpm/elixirtag exists for Elixir 1.13.4 with OTP 24.3.4.17, so the builder compiles the unchanged Elixir 1.13.4 source archive (SHA-256 verified) on that exact OTP/Alpine base.Dockerfile.test, cherry-pickupgrade-elixir, or change live infrastructure.Smoke gate and publication ordering
Added
bin/smoke-image, which runs the actual final image withPOD_IPandERLANG_COOKIEand invokes a lightweight Distillery release eval:Application.ensure_all_started(:crypto)It does not foreground-start the application. Root publication paths now build one local artifact, smoke that same artifact, then push it:
.github/workflows/publish.yamlrelease matrix.github/workflows/test.yamlbackend root-image matrix (before its test-image push)Makefilerootpushpath.gitlab-ci.ymlroot image jobsTrivy continues to scan the locally loaded root image in the test workflow.
Validation
hexpm/elixirElixir 1.13.4 / OTP 24.3.4.17 tag is available.plural:abi-smokefor linux/amd64.cron:abi-smokefor linux/amd64.libcrypto.so.3and does not requirelibcrypto.so.1.1.git diff --check,sh -n bin/smoke-image, andmake -n push APP_NAME=plural APP_VSN=testpassed.Compatibility and rollback
This is an image-build and CI-publication ordering change only. It is ABI-safe because build and final OTP crypto artifacts originate from the same pinned runtime base. Roll back by reverting this single commit or republishing the prior working image; no infrastructure state is involved.
Limitations
A worker build attempt reached the deliberate five-minute sandbox timeout, and rtc was not run after that timeout. The sandbox did not provide Ruby for YAML parser validation. CI will execute the new smoke gate for all four root services before any publication.