Skip to content

chore(ci): parametrize release workflows with an OTP matrix#246

Merged
thiagoesteves merged 1 commit into
mainfrom
thiagoesteves/parametrize-release-otp-matrix
Jul 8, 2026
Merged

chore(ci): parametrize release workflows with an OTP matrix#246
thiagoesteves merged 1 commit into
mainfrom
thiagoesteves/parametrize-release-otp-matrix

Conversation

@thiagoesteves

Copy link
Copy Markdown
Owner

What changed and why

The releases.yaml and testing-release.yaml workflows duplicated the whole build job per OTP version (buildUbuntu2404Otp27 / buildUbuntu2404Otp28), so every toolchain change had to be applied to four places. Both now use a single build job with:

strategy:
  fail-fast: false
  matrix:
    otp: [27, 28]

All OTP-specific values derive from matrix.otp (devops/releases/otp-${{ matrix.otp }}/.tool-versions, artifact name). Supporting OTP 29 later is a one-line change per workflow.

Design notes:

  • Matrix legs cannot expose per-leg job outputs (they overwrite each other), so checksums now travel as <artifact>.sha256 files uploaded alongside each tarball; the aggregate checksum.txt is built with cat *.sha256. Content is the same as before (line order may differ).
  • testing-release: the standalone checksum job is merged into upload_aws, and the per-file prewk/s3-cp-action steps became a single aws s3 cp loop - the same command that action runs internally, using the preinstalled AWS CLI (one less third-party action).
  • fail-fast: false keeps the matrix legs independent, matching the old separate-jobs behavior.
  • checksum.txt is no longer stored as a workflow artifact in testing-release (it is still uploaded to S3 as before).

Risk assessment

  • Impact: identical release artifacts, names and checksum content; OTP additions become a one-line matrix change.
  • Blast radius: releases.yaml and testing-release.yaml only; PR CI and hot upgrade workflows untouched.
  • Regression risk: medium - these workflows trigger only on tag pushes, so PR CI cannot exercise them. YAML syntax validated locally. Recommend pushing a non-main test tag (e.g. an -rc tag from a branch) to run testing-release end to end before the next real release.
  • Rollback: revert the commit.

🤖 Generated with Claude Code

Replace the duplicated per-OTP build jobs in releases.yaml and
testing-release.yaml with a single build job using a strategy matrix
(otp: [27, 28]). Adding or removing an OTP version is now a one-line
change per workflow.

Since matrix legs cannot expose per-leg job outputs, checksums now
travel as <artifact>.sha256 files uploaded next to each tarball, and the
aggregate checksum.txt is built by concatenating them. This also allowed
merging the testing-release checksum job into upload_aws and replacing
the per-file prewk/s3-cp-action steps with a single aws s3 cp loop (the
same command that action runs internally, using the preinstalled CLI).

Risk assessment:
- Impact: identical artifacts, names and checksum.txt content for
  releases; adding OTP versions becomes a one-line matrix change.
- Blast radius: releases.yaml and testing-release.yaml only. PR CI and
  hot upgrade workflows untouched.
- Regression risk: medium. These workflows only run on tag pushes, so
  the change cannot be validated by PR CI. Behavior differences:
  checksum.txt line order may differ, testing-release no longer stores
  checksum.txt as a workflow artifact (it is still uploaded to S3), and
  fail-fast is disabled to keep matrix legs independent like the old
  separate jobs. Recommend pushing a non-main test tag to exercise
  testing-release before the next real release.
- Rollback: revert this commit.
@thiagoesteves thiagoesteves self-assigned this Jul 8, 2026
@thiagoesteves thiagoesteves moved this to In Progress in DeployEx Project Jul 8, 2026
@thiagoesteves thiagoesteves merged commit eb749dd into main Jul 8, 2026
3 checks passed
@thiagoesteves thiagoesteves deleted the thiagoesteves/parametrize-release-otp-matrix branch July 8, 2026 12:22
@github-project-automation github-project-automation Bot moved this from In Progress to Done in DeployEx Project Jul 8, 2026
thiagoesteves added a commit that referenced this pull request Jul 8, 2026
Add the 0.9.5 enhancement entries for the merged PRs #245 (checkout
action v7) and #246 (OTP matrix for release workflows).

Risk assessment:
- Impact: documentation only.
- Blast radius: CHANGELOG.md.
- Regression risk: none.
- Rollback: revert this commit.
thiagoesteves added a commit that referenced this pull request Jul 8, 2026
- Set version to 0.9.5 in mix/shared.exs (drop the rc suffix)
- Remove the 🔜 marker from the 0.9.5 row in the README version
  table (OTP columns already match devops/releases pins)
- Bump the default installer YAMLs (aws/gcp) and the YAML guide example
  to 0.9.5
- Set the changelog release date: 0.9.5 (2026-07-08)
- Regenerate published docs via mix docs
- Document the release preparation checklist in AGENTS.md

Risk assessment:
- Impact: version metadata and docs only, no code changes. Tagging
  0.9.5 from main after merge triggers the release build.
- Blast radius: version pins, README table, installer defaults,
  changelog heading, generated docs tarball, AGENTS.md.
- Regression risk: low. The release itself is exercised by the
  tag-triggered workflows (now matrix-based, see #246), recommend a
  quick rc test tag if extra caution is wanted.
- Rollback: revert this commit before tagging.
thiagoesteves added a commit that referenced this pull request Jul 8, 2026
Workflow fixes:
- The rebase onto the matrix-based release workflows (#246) left them
  in a hybrid state: matrix still [27, 28] plus an appended old-style
  buildUbuntu2404Otp29 job referencing env vars that no longer exist.
  The matrix is now [28, 29] and the orphaned jobs are removed.

Library updates (no vulnerabilities reported by mix deps.audit):
- phoenix_live_view 1.0.18 -> 1.2.6 (requirement relaxed to ~> 1.2)
- gettext 0.26.2 -> 1.0.2 (already using the Gettext.Backend pattern)
- briefly 0.4.1 -> 0.5.1, swoosh 1.26.3, mint 1.9.1
- lazy_html added as a test dependency (required by LiveView 1.2 test
  helpers), which needed elixir_make 0.10.0 -> 0.9.0
- HEEx templates reformatted by the LiveView 1.2 formatter

Test updates:
- mode_test option assertions made tolerant to attribute order and
  boolean attribute serialization (lazy_html renders differently)
- Foundation catalog test modules are no longer async: they share the
  /tmp/var/lib/deployex tree and raced with each other's rm_rf cleanup

Docs consistency:
- Changelog 0.10.0 section: baseline corrected to 0.9.5, the OTP-27
  drop moved under backwards incompatible changes, host binary labels
  fixed (OTP 28/29)
- README version table: OTP-29 column added, 0.10.0 🔜 row with
  28.5.0.3 / 29.0.3

Validated under OTP 29 (Erlang 29.0.1, Elixir 1.20.1-otp-29): full test
suite with coverage above threshold in all apps, credo --strict, format
check, unused deps check, sobelow and dialyzer all pass. CI pins
erlang 29.0.3 / elixir 1.20.2-otp-29, both verified to exist upstream.

Risk assessment:
- Impact: completes the OTP-29 rollover so PR CI runs on OTP 29 and
  releases build for OTP 28/29.
- Blast radius: release workflows, dependency versions (LiveView minor
  jump 1.0 -> 1.2 is the largest), HEEx formatting, test suite, docs.
- Regression risk: medium. LiveView 1.2 changes DOM test serialization
  and formatting; the full suite plus static checks pass, but the
  tag-triggered release workflows still need a real run, recommend a
  non-main rc tag before the 0.10.0 release.
- Rollback: revert this commit (the branch remains on the previous
  library set via mix.lock history).
thiagoesteves added a commit that referenced this pull request Jul 14, 2026
Workflow fixes:
- The rebase onto the matrix-based release workflows (#246) left them
  in a hybrid state: matrix still [27, 28] plus an appended old-style
  buildUbuntu2404Otp29 job referencing env vars that no longer exist.
  The matrix is now [28, 29] and the orphaned jobs are removed.

Library updates (no vulnerabilities reported by mix deps.audit):
- phoenix_live_view 1.0.18 -> 1.2.6 (requirement relaxed to ~> 1.2)
- gettext 0.26.2 -> 1.0.2 (already using the Gettext.Backend pattern)
- briefly 0.4.1 -> 0.5.1, swoosh 1.26.3, mint 1.9.1
- lazy_html added as a test dependency (required by LiveView 1.2 test
  helpers), which needed elixir_make 0.10.0 -> 0.9.0
- HEEx templates reformatted by the LiveView 1.2 formatter

Test updates:
- mode_test option assertions made tolerant to attribute order and
  boolean attribute serialization (lazy_html renders differently)
- Foundation catalog test modules are no longer async: they share the
  /tmp/var/lib/deployex tree and raced with each other's rm_rf cleanup

Docs consistency:
- Changelog 0.10.0 section: baseline corrected to 0.9.5, the OTP-27
  drop moved under backwards incompatible changes, host binary labels
  fixed (OTP 28/29)
- README version table: OTP-29 column added, 0.10.0 🔜 row with
  28.5.0.3 / 29.0.3

Validated under OTP 29 (Erlang 29.0.1, Elixir 1.20.1-otp-29): full test
suite with coverage above threshold in all apps, credo --strict, format
check, unused deps check, sobelow and dialyzer all pass. CI pins
erlang 29.0.3 / elixir 1.20.2-otp-29, both verified to exist upstream.

Risk assessment:
- Impact: completes the OTP-29 rollover so PR CI runs on OTP 29 and
  releases build for OTP 28/29.
- Blast radius: release workflows, dependency versions (LiveView minor
  jump 1.0 -> 1.2 is the largest), HEEx formatting, test suite, docs.
- Regression risk: medium. LiveView 1.2 changes DOM test serialization
  and formatting; the full suite plus static checks pass, but the
  tag-triggered release workflows still need a real run, recommend a
  non-main rc tag before the 0.10.0 release.
- Rollback: revert this commit (the branch remains on the previous
  library set via mix.lock history).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant