Skip to content

Release rotation (auto)#760

Open
openemr-release-bot[bot] wants to merge 1 commit into
masterfrom
release-rotation/auto
Open

Release rotation (auto)#760
openemr-release-bot[bot] wants to merge 1 commit into
masterfrom
release-rotation/auto

Conversation

@openemr-release-bot

@openemr-release-bot openemr-release-bot Bot commented May 30, 2026

Copy link
Copy Markdown

Automated rotation triggered by workflow_dispatch.

Run: https://github.com/openemr/openemr-devops/actions/runs/27280145169

Slot assignments applied:

  • current=8.1

@kojiromike kojiromike force-pushed the release-rotation/auto branch from 33e6c77 to e6e4ae7 Compare June 1, 2026 17:10
@openemr-release-bot openemr-release-bot Bot force-pushed the release-rotation/auto branch from e6e4ae7 to c839d56 Compare June 1, 2026 17:19
kojiromike added a commit that referenced this pull request Jun 1, 2026
…ck paths (#770)

## Summary

Fixes #769. The `env.stub` shellcheck directive in the 8.0.0 init
scripts was written as a repo-relative path carrying a version token (`#
shellcheck source=docker/openemr/8.0.0/env.stub`). Because the scripts
were registered as `current`-slot pins, advancing `current` 8.0.0 →
8.1.0 rewrote that directive to point at a sibling dir that never
exists, breaking shellcheck CI on the auto rotation PR (#760).

A `# shellcheck source=` comment is a path to the script's own sibling
file, not a version pin — it should never carry a rotating token.

## Changes

- `docker/openemr/8.0.0/openemr.sh`, `ssl.sh`: use the version-agnostic
`SCRIPTDIR/env.stub` form (matching the existing convention already used
for `devtoolsLibrary.source`). `SCRIPTDIR` resolves to the script's own
dir at lint time and contains no token for the rotator to match.
- `tools/release/versions.yml`: drop the two `shellcheck_source`
entries. After the change above the files hold no version pin, so the
linter no longer flags them — no `excludes:` entry needed.
- `tools/release/tests/SlotRotatorTest.php`: regression test seeding a
`*.sh` with a `SCRIPTDIR` directive plus a genuine rotating token,
asserting the directive survives rotation byte-for-byte.

## Test plan

- [x] `php bin/lint-versions.php` — `openemr.sh`/`ssl.sh` no longer
flagged (the two remaining `rel_branch_ref` findings pre-exist on
`master`, unrelated)
- [x] `vendor/bin/phpunit` — 175 tests green, including the new
regression
- [x] Dry-run rotation reproducing #760 (`--current=8.1 --dry-run`) no
longer touches the `# shellcheck source=` line in either script
- [x] `shellcheck docker/openemr/8.0.0/openemr.sh ssl.sh` — clean
@openemr-release-bot openemr-release-bot Bot force-pushed the release-rotation/auto branch from c839d56 to 23b66da Compare June 1, 2026 19:01
@kojiromike kojiromike marked this pull request as ready for review June 3, 2026 17:21
Copilot AI review requested due to automatic review settings June 3, 2026 17:21
@kojiromike kojiromike marked this pull request as draft June 3, 2026 17:21

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Automated release-rotation update intended to promote the current slot to OpenEMR 8.1.0 (and update the production build workflow + Dependabot config accordingly).

Changes:

  • Bump tools/release/versions.yml slots.current from 8.0.0 → 8.1.0 (including removing the legacy 4-part patch pin).
  • Update the “current” production Docker build workflow to build from docker/openemr/8.1.0 and publish 8.1.0 tags.
  • Rotate Docker/Dependabot references from the 8.0.0 directory to 8.1.0.

Reviewed changes

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

File Description
tools/release/versions.yml Promotes current slot to 8.1.0 and drops the legacy patch field.
docker/openemr/8.0.0/Dockerfile Changes the cloned upstream OpenEMR release branch.
.github/workflows/build-800.yml Retargets the “current” production build to the 8.1.0 Docker context and tags.
.github/dependabot.yml Updates a Dependabot Docker directory entry for rotation.

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

Comment thread docker/openemr/8.0.0/Dockerfile Outdated
Comment thread .github/workflows/build-800.yml Outdated
Comment thread .github/dependabot.yml
Comment on lines +15 to 19
# Docker - docker/openemr/8.1.0
- package-ecosystem: "docker"
directory: "/docker/openemr/8.0.0"
directory: "/docker/openemr/8.1.0"
schedule:
interval: "daily"
kojiromike added a commit to kojiromike/openemr-devops that referenced this pull request Jun 8, 2026
…-derived tags

Collapse build-800/810/811.yml into a single build-openemr.yml whose
matrix is the stable slot names [current, next, dev] x platform, never
rotated. Each job resolves its version at runtime from the
docker/openemr/{current,next,dev} symlinks, so the workflow holds zero
version strings and SlotRotator only re-points the symlink.

Publish each slot's true version.php-derived tag instead of the bare
symlink dir name: current -> 8.0.0.3, next -> 8.1.0, dev -> 8.1.1-dev.
This fixes current (really the 8.0.0.3 patch release) and prevents dev
from publishing a bare :8.1.1 that would collide with the eventual real
8.1.1 release.

Supporting changes: standardize 8.0.0/Dockerfile to
ARG OPENEMR_VERSION=rel-800; update versions.yml (current.full ->
8.0.0.3, dev.full -> 8.1.1-dev); update Docker Hub overview template +
renderer test; document the derivation in release-automation-plan.md.

This is the build-workflow half of step #5 (workflow consolidation,
openemr#638 follow-on) and unblocks the release-rotation PR (openemr#760).

Assisted-by: Claude Code
kojiromike added a commit to kojiromike/openemr-devops that referenced this pull request Jun 8, 2026
…-derived tags

Collapse build-800/810/811.yml into a single build-openemr.yml whose
matrix is the stable slot names [current, next, dev] x platform, never
rotated. Each job resolves its version at runtime from the
docker/openemr/{current,next,dev} symlinks, so the workflow holds zero
version strings and SlotRotator only re-points the symlink.

Publish each slot's true version.php-derived tag instead of the bare
symlink dir name: current -> 8.0.0.3, next -> 8.1.0, dev -> 8.1.1-dev.
This fixes current (really the 8.0.0.3 patch release) and prevents dev
from publishing a bare :8.1.1 that would collide with the eventual real
8.1.1 release.

Supporting changes: standardize 8.0.0/Dockerfile to
ARG OPENEMR_VERSION=rel-800; update versions.yml (current.full ->
8.0.0.3, dev.full -> 8.1.1-dev); update Docker Hub overview template +
renderer test; document the derivation in release-automation-plan.md.

This is the build-workflow half of step #5 (workflow consolidation,
openemr#638 follow-on) and unblocks the release-rotation PR (openemr#760).

Assisted-by: Claude Code
kojiromike added a commit that referenced this pull request Jun 9, 2026
…-derived tags (#777)

## Summary

Collapse the three version-named rotating build workflows into one
slot-named matrix workflow, then make that workflow publish each slot's
**true** OpenEMR version (derived from `version.php`) instead of the
bare symlink directory name.

### 1. Consolidate to a single slot-matrix workflow

`build-800.yml` / `build-810.yml` / `build-811.yml` become a single
`build-openemr.yml` whose matrix is the **stable slot names** `[current,
next, dev]` × platform — never rotated. Each job resolves the slot's
version at runtime from the `docker/openemr/{current,next,dev}`
symlinks, so the workflow holds zero version strings and rotation never
rewrites it (`SlotRotator` just re-points the symlink).

Docker dirs (`docker/openemr/{8.0.0,8.1.0,8.1.1}`) stay version-named —
they hold real per-version Dockerfiles and are honest targets.

### 2. Publish version.php-derived tags per slot

The merge job derives each slot's published version from the OpenEMR
`version.php` at the slot Dockerfile's `OPENEMR_VERSION` ref, composing
`major.minor.patch[.realpatch][tag]`:

| Slot | ref | Published `:ver` | Was (bare dir) |
|---|---|---|---|
| current | `rel-800` | **8.0.0.3** | 8.0.0 |
| next | `rel-810` | 8.1.0 | 8.1.0 |
| dev | `master` | **8.1.1-dev** | 8.1.1 |

This fixes two bugs: `current` is really 8.0.0.3 (a genuine patch
release), and `dev` would otherwise publish a bare `:8.1.1` that
collides with the eventual real 8.1.1 release.

**Tag set per slot:** `:<float>` (latest/next/dev) + `:<ver>` +
`:<ver>-<date>`, plus the bare-dir tag (`8.0.0` / `8.1.0`) for
**current/next only** (never dev) when it differs from `:<ver>`.

### Supporting changes

- Standardize `docker/openemr/8.0.0/Dockerfile` to `ARG
OPENEMR_VERSION=rel-800` so the merge-job grep is uniform across all
three slots.
- Registry `tools/release/versions.yml`: `current.full` → `8.0.0.3`
(drop vestigial `patch`), `dev.full` → `8.1.1-dev`, 8.0.0 Dockerfile
`kinds` → `docker_arg_branch`.
- Docker Hub overview template + renderer test updated to the
`docker_dir` + `full` model.
- `docs/release-automation-plan.md` documents the version.php derivation
and per-slot tag set.

This is the build-workflow half of step #5 (workflow consolidation, #638
follow-on) in `docs/release-automation-plan.md`, and unblocks the
release-rotation PR (#760).

## Test plan

- [x] `composer test` — 179 tests pass
- [x] `composer phpcs` — clean
- [x] `composer phpstan` — no errors
- [x] `actionlint` on `build-openemr.yml` — clean (shellcheck SC2016
suppressed for the PHP one-liner, matching `build-release.yml`)
- [x] `yq` lint on the registry
- [x] Version-composition dry-run against all three refs → 8.0.0.3 /
8.1.0 / 8.1.1-dev
- [ ] CI green on this PR
@openemr-release-bot openemr-release-bot Bot force-pushed the release-rotation/auto branch from 25f477b to 718587f Compare June 10, 2026 13:36
@kojiromike kojiromike marked this pull request as ready for review June 10, 2026 18:28

@kojiromike kojiromike Jun 10, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We shouldn't change 8.0.0 to release 8.1.0, and 8.1.0 already exists.

bradymiller added a commit to bradymiller/openemr-devops that referenced this pull request Jun 25, 2026
Atomic deletion of the rotation slice and collapse of ship-release.yml
from 3 PRs (Infra + Conductor + Docs) to 2 PRs (Conductor + Docs).

The docker-pipeline migration to openemr/openemr (openemr#790, completed
2026-06-20) moved all of rotation's live targets out of this repo.
versions.yml's 13 entries all point at paths that no longer exist
(docker/openemr/**, utilities/container_benchmarking/**, two deleted
workflows); SlotRotator's last run on 2026-06-10 left the
release-rotation/auto PR (openemr-devops#760) frozen with patches that
edit files which now return 404 on master. Subsequent
release-rotation.yml runs no-op because the diff against the existing
branch is empty.

This makes shipping today's 8.1.1 release impossible through
ship-release.yml: preflight blocks on PR openemr#760's unmergeable state, or
merging it would silently resurrect the deleted docker/openemr/* tree.
Collapsing to 2-PR removes the Infra slot from PullRequestTarget +
ShipReleaseOrchestrator entirely; PR openemr#760 becomes a dangling OPEN PR
(close manually as cosmetic cleanup after this PR merges).

Coordinated companion: openemr/openemr#12631 updates the cross-repo
docs (RELEASE_PROCESS.md + release-automation-plan.md) to the 2-PR
shape. Order: land #12631 first (docs match imminent code), then this
PR (code catches up).

DELETED (16 files, ~2625 LOC):

- tools/release/versions.yml (registry pointing at deleted paths)
- tools/release/src/SlotRotator.php, SlotAssignmentParser.php,
  SlotRotationResult.php, RotationPrPublisher.php,
  VersionsRegistryLinter.php, LintIssue.php
- tools/release/bin/rotate.php, lint-versions.php,
  open-rotation-pr.php, derive-slots-from-dispatch.php
- tools/release/tests/SlotRotatorTest.php,
  SlotAssignmentParserTest.php, VersionsRegistryLinterTest.php,
  RotationPrPublisherTest.php
- .github/workflows/release-rotation.yml
- docs/release-automation-plan.md (devops-side rotation slice
  pre-implementation design doc — misleading once the rotation code
  is gone)

MODIFIED (13 files):

- tools/release/src/PullRequestTarget.php: forRelease() drops the
  Infra row; Conductor mergeOrder 2->1, Docs mergeOrder 3->2;
  docblock updated
- tools/release/src/RoleLabel.php: drop Infra enum case; docblock
  three->two
- tools/release/src/ShipReleaseOrchestrator.php: three docblocks
  updated (class header, ship() targets list, sortByMergeOrder
  comment); no runtime code changes (orchestrator already used only
  RoleLabel::Conductor and RoleLabel::Docs in its logic)
- tools/release/tests/PullRequestTargetTest.php: test renamed +
  rewritten for 2-target shape
- tools/release/tests/ShipReleaseOrchestratorTest.php: full rewrite -
  dropped INFRA_REPO/INFRA_BRANCH constants, removed all infra
  fixture setup, renumbered step assertions, renamed test methods,
  dropped testInfraAlreadyMergedSkipsThenContinues (no 2-PR analog;
  SKIPPED_ALREADY_MERGED coverage preserved by
  testConductorAlreadyMergedRefetchesDocsBeforeMerging)
- tools/release/tests/ShipReleaseSummaryRendererTest.php: dropped
  Infra fixture entries; first two tests now exercise Conductor
  rows; helper updated
- tools/release/Taskfile.yml: dropped release:rotate,
  release:lint-versions, release:open-rotation-pr,
  release:derive-slots-from-dispatch, release:push-rotation-branch
  tasks (~80 lines); release:ship desc updated three->two
- tools/release/bin/ship-release.php: header docblock + Symfony
  setDescription updated three->two
- tools/release/README.md: dropped versions.yml row from the
  directory-tree diagram
- tools/release/src/AppPermissionProbe.php: comment updated to drop
  the rotation-specific motivation (workflows:write probe still
  needed for other release-mechanism workflows)
- .github/workflows/release-permissions-check.yml: header comment
  updated to drop the 'only what rotation needs' framing
- .github/workflows/ship-release.yml: header comment updated for
  2-PR shape

NOT TOUCHED (intentional):

- The cross-repo docs in openemr/openemr (covered by #12631)
- Anything outside the release-mechanism + permissions-check
  surfaces (kubernetes, packages, raspberrypi, etc.)

Tests not run locally (devops repo has no docker dev-stack); CI will
exercise the test rewrites.

Workstream 1 PR 1a in the release-mechanism migration plan.

Assisted-by: Claude Code
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.

2 participants