Skip to content

Commit cda87f4

Browse files
committed
ci(release): prepare stable Docker version aliases
Prepare Path Header Scanner's production image workflows for the stable `v1.0.0` release after the published `v1.0.0-rc.1` validation boundary. ### 🐋 Stable image aliases - Publish one stable image under the exact `v1.0.0` tag and the coordinated `v1.0`, `v1`, and `latest` aliases on GitHub and GitLab. - Keep prereleases exact-only so candidate images cannot move stable aliases. - Derive major and minor aliases from the validated release tag and keep all aliases attached to the same built image. - Apply the same stable-versus-prerelease alias classification on GitHub and GitLab while preserving the package gate's rejection of build metadata. ### 🧪 Regression protection and documentation - Add structural workflow tests for alias generation, provider parity, and prerelease isolation. - Document immutable exact tags, moving minor and major aliases, and the stable-only `latest` policy in repository and public documentation. - Preserve the existing annotated-tag, package-version, protected-publication, and provider-registry safeguards. Release phase: post-RC stabilization Tag: none Previous release: v1.0.0-rc.1 Target release: v1.0.0 🔖 **Tags**: - Type: `#ci`, `#release` - Delivery: `#docker`, `#github-actions`, `#gitlab-ci` - Scope: `#stable-aliases`, `#regression-tests`, `#documentation`
1 parent 8a1eba4 commit cda87f4

11 files changed

Lines changed: 405 additions & 242 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
ci(release): prepare stable Docker version aliases
2+
3+
Prepare Path Header Scanner's production image workflows for the stable
4+
`v1.0.0` release after the published `v1.0.0-rc.1` validation boundary.
5+
6+
### 🐋 Stable image aliases
7+
8+
- Publish one stable image under the exact `v1.0.0` tag and the coordinated
9+
`v1.0`, `v1`, and `latest` aliases on GitHub and GitLab.
10+
- Keep prereleases exact-only so candidate images cannot move stable aliases.
11+
- Derive major and minor aliases from the validated release tag and keep all
12+
aliases attached to the same built image.
13+
- Apply the same stable-versus-prerelease alias classification on GitHub and
14+
GitLab while preserving the package gate's rejection of build metadata.
15+
16+
### 🧪 Regression protection and documentation
17+
18+
- Add structural workflow tests for alias generation, provider parity, and
19+
prerelease isolation.
20+
- Document immutable exact tags, moving minor and major aliases, and the
21+
stable-only `latest` policy in repository and public documentation.
22+
- Preserve the existing annotated-tag, package-version, protected-publication,
23+
and provider-registry safeguards.
24+
25+
Release phase: post-RC stabilization
26+
Tag: none
27+
Previous release: v1.0.0-rc.1
28+
Target release: v1.0.0
29+
30+
🔖 **Tags**:
31+
- Type: `#ci`, `#release`
32+
- Delivery: `#docker`, `#github-actions`, `#gitlab-ci`
33+
- Scope: `#stable-aliases`, `#regression-tests`, `#documentation`
Lines changed: 25 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,33 @@
1-
release(rc): promote Path Header Scanner v1.0.0-rc.1
1+
ci(release): prepare stable Docker version aliases
22

3-
Promote the combined implementation from four untagged development checkpoints
4-
to the first Path Header Scanner 1.0 release candidate. This is the promotion
5-
and validation boundary, not another implementation checkpoint.
3+
Prepare Path Header Scanner's production image workflows for the stable
4+
`v1.0.0` release after the published `v1.0.0-rc.1` validation boundary.
65

7-
### 🧭 Checkpoint lineage
6+
### 🐋 Stable image aliases
87

9-
- Checkpoint 1 owns the complete application foundation, general GitHub and
10-
GitLab CI/CD corrections, runtime compatibility, Docker build-version
11-
resolution, ignore rules, quality tooling, regression tests, and documentation.
12-
- Checkpoint 2 owns private GitLab Python distribution, canonical PEP 440
13-
package metadata, protected-tag publication, validation-only unprotected
14-
tags, and immutable package safeguards.
15-
- Checkpoint 3 owns the optional source-checkout repository-metadata helper and
16-
related README/TODO maintenance. It remains outside the installed CLI and
17-
automated release workflow; its recorded follow-ups remain subject to review.
18-
- Checkpoint 4 owns safe GitHub release-note rendering, populated release
19-
metadata, literal Docker examples, and regression protection.
8+
- Publish one stable image under the exact `v1.0.0` tag and the coordinated
9+
`v1.0`, `v1`, and `latest` aliases on GitHub and GitLab.
10+
- Keep prereleases exact-only so candidate images cannot move stable aliases.
11+
- Derive major and minor aliases from the validated release tag and keep all
12+
aliases attached to the same built image.
13+
- Apply the same stable-versus-prerelease alias classification on GitHub and
14+
GitLab while preserving the package gate's rejection of build metadata.
2015

21-
### ✅ Release-candidate contract
16+
### 🧪 Regression protection and documentation
2217

23-
- Establish the first supported release line; there is no earlier published
24-
stable version to migrate from.
25-
- Keep `path-header-scanner init` and `path-header-scanner scan <target>` as
26-
the supported public commands.
27-
- Preserve preview-first scanning, explicit apply control, language-aware
28-
headers, deterministic targets, ignores, and concise command errors.
29-
- Keep `--dry-run` authoritative over CLI or configured apply mode and keep
30-
initialization dry-run non-writing and non-interactive.
31-
- Preserve Python 3.11+ compatibility and Python 3.14 as the standard
32-
development and container runtime.
33-
- Carry forward active-repository registry naming, root multi-stage builds,
34-
non-empty annotated release-tag checks, package/tag version agreement,
35-
complete provider release notes, exact prerelease images, and stable-only
36-
`latest`.
37-
- Use `path-header-scanner==1.0.0rc1` as the canonical RC Python package version while
38-
retaining `v1.0.0-rc.1` as the SemVer Git tag.
39-
- Preserve `CI_JOB_TOKEN` publication, authorized deploy-token installation,
40-
and the package validation → production image → private package → release
41-
ordering established by checkpoint 2.
18+
- Add structural workflow tests for alias generation, provider parity, and
19+
prerelease isolation.
20+
- Document immutable exact tags, moving minor and major aliases, and the
21+
stable-only `latest` policy in repository and public documentation.
22+
- Preserve the existing annotated-tag, package-version, protected-publication,
23+
and provider-registry safeguards.
4224

43-
### 🧪 Recorded validation and final RC gates
44-
45-
- Treat the validation recorded in checkpoints 1 and 2 as historical evidence,
46-
not a substitute for checks against the exact RC commit.
47-
- Re-run the approved test, lint, formatting, pre-commit, packaging,
48-
documentation, CLI-help, dry-run, Make, Docker, Compose, and workflow checks.
49-
- Confirm the reviewed target paths, output or mutation boundaries, package
50-
metadata, image destinations, annotated tag message, and release links.
51-
- Review the maintainer helper's pending follow-ups separately; this promotion
52-
message does not assert that live metadata synchronization was validated.
53-
- Document and validate release-blocking fixes discovered during candidate
54-
review before promoting the stable release.
55-
56-
Tag: v1.0.0-rc.1
57-
Previous release: none — first formal release
58-
Checkpoints:
59-
- commit-message-v1.0.0-development-checkpoint.txt
60-
- commit-message-v1.0.0-development-checkpoint-2.txt
61-
- commit-message-v1.0.0-development-checkpoint-3.txt
62-
- commit-message-v1.0.0-development-checkpoint-4.txt
25+
Release phase: post-RC stabilization
26+
Tag: none
27+
Previous release: v1.0.0-rc.1
28+
Target release: v1.0.0
6329

6430
🔖 **Tags**:
65-
- Type: `#release`, `#validation`
66-
- Delivery: `#release-candidate`, `#semver`, `#github`, `#gitlab`
67-
- Quality: `#tests`, `#dry-run`, `#packaging`, `#compatibility`
68-
- Safety: `#annotated-tags`, `#protected-tags`, `#stable-latest`
31+
- Type: `#ci`, `#release`
32+
- Delivery: `#docker`, `#github-actions`, `#gitlab-ci`
33+
- Scope: `#stable-aliases`, `#regression-tests`, `#documentation`
Lines changed: 11 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -1,155 +1,11 @@
1-
🚧 Path Header Scanner v1.0.0-rc.1 — First Production Release Candidate
2-
3-
Path Header Scanner v1.0.0-rc.1 is the first formal release candidate for a
4-
configuration-driven CLI that previews, validates, inserts, and updates
5-
repository-relative path headers across supported source and documentation
6-
files.
7-
8-
There is no previous production release to upgrade from. This candidate defines
9-
the initial supported CLI, configuration, safety model, language coverage, and
10-
automation foundation that will become v1.0.0 after release-candidate validation.
11-
12-
### 🌟 Highlights
13-
14-
- Preview-first scanning: files remain unchanged unless `--apply` is selected.
15-
- Recursive discovery and validation of missing, valid, and stale path headers.
16-
- Language-aware support for Python, JavaScript and TypeScript, Shell, PHP, HTML, and Markdown.
17-
- Explicit target and working-directory selection for predictable repository-relative headers.
18-
- Configurable ignore rules for Git metadata, environments, caches, dependencies, and build output.
19-
- `path-header-scanner init` for generating the namespaced project configuration.
20-
- `path-header-scanner scan <target>` for previewing or applying reviewed corrections.
21-
- Rich command help, banners, progress, summaries, and failure reporting.
22-
- Concise, actionable command errors with reliable nonzero exits and debug-only implementation tracebacks.
23-
- Console and rotating-file logging for troubleshooting.
24-
- Local, Docker, Docker Compose, and modular Make workflows.
25-
- Automated tests, MkDocs documentation, GitHub Actions, and GitLab CI support.
26-
- Hardened delivery pipelines that use the active repository's registry namespace, require non-empty annotated release tags, preserve safely rendered complete tag-message release notes with populated metadata and literal Docker commands, keep RC images on their exact tag, and reserve `latest` for stable releases.
27-
- Private GitLab PyPI delivery for `path-header-scanner`, with the RC tag
28-
published as canonical package version `1.0.0rc1` only after the protected
29-
release pipeline passes.
30-
31-
### 📦 Install the private RC package
32-
33-
Authorized users can install the candidate from the private GitLab package
34-
registry. Configure pip authentication with a deploy token limited to
35-
`read_package_registry`, then use the token-free project index URL:
36-
37-
```bash
38-
python -m pip install \
39-
--index-url "https://gitlab.com/api/v4/projects/<project-id>/packages/pypi/simple" \
40-
"path-header-scanner==1.0.0rc1"
41-
```
42-
43-
Supply the deploy-token username and token through an approved protected pip
44-
credential mechanism or its interactive authentication flow. Never place tokens
45-
in committed configuration or shared command history. Unprotected tags validate
46-
the same artifacts but cannot publish them.
47-
48-
### 🛡️ Safety model
49-
50-
Path Header Scanner is intentionally conservative:
51-
52-
- A normal scan is a preview and does not change target files.
53-
- `--apply` is required before eligible files are updated.
54-
- `--dry-run` prevents mutations even if `--apply` or configured apply mode is present.
55-
- Initialization dry-run does not create configuration directories or files and does not prompt for overwrite.
56-
- Read-only discovery and validation still run during dry-run so the preview remains useful.
57-
- Diagnostic logs may be written to the configured log destination, but target-project files remain unchanged.
58-
59-
### 🧭 Core workflows
60-
61-
Preview a target:
62-
63-
```bash
64-
path-header-scanner scan app
65-
```
66-
67-
Apply reviewed corrections:
68-
69-
```bash
70-
path-header-scanner scan app --apply
71-
```
72-
73-
Force an explicit simulation, including when apply mode is configured:
74-
75-
```bash
76-
path-header-scanner scan app --apply --dry-run
77-
```
78-
79-
Preview project initialization:
80-
81-
```bash
82-
path-header-scanner init --dry-run
83-
```
84-
85-
### ⚙️ Configuration
86-
87-
Project settings live in:
88-
89-
```text
90-
.config/path_header_scanner/config.toml
91-
```
92-
93-
Configuration can define scan defaults, ignored content, logging, banner
94-
behavior, apply mode, and dry-run mode. Explicit CLI options take precedence for
95-
the current invocation.
96-
97-
### 🧩 Language behavior
98-
99-
Each supported language uses syntax appropriate to that file type. The scanner
100-
preserves relevant leading content, including shebangs and language-specific
101-
special lines, while inserting or replacing only the managed path header.
102-
103-
Markdown path headers use HTML comments intentionally so generated documentation
104-
remains readable without displaying internal header metadata.
105-
106-
### 🧰 For contributors and integrators
107-
108-
- CLI parsing and presentation are separated from scan and update behavior.
109-
- Language strategies provide focused extension points for additional file types.
110-
- Scanner, processor, and updater responsibilities can be tested independently.
111-
- Initialization planning is separated from persistence to enforce dry-run safety.
112-
- Modular Make, Docker, Compose, CI, lint, format, test, package, and documentation workflows support repeatable development.
113-
114-
### 🧪 Recommended RC validation
115-
116-
Please validate the candidate on a disposable or version-controlled test project:
117-
118-
1. Install v1.0.0-rc.1 in an isolated Python environment.
119-
2. Run `path-header-scanner --help` and command-specific help.
120-
3. Preview initialization with `path-header-scanner init --dry-run`.
121-
4. Initialize and review `.config/path_header_scanner/config.toml`.
122-
5. Preview representative source and documentation targets.
123-
6. Verify `--apply --dry-run` leaves every target file unchanged.
124-
7. Apply a reviewed scan and inspect the resulting path headers and summary.
125-
8. Report unsupported syntax, incorrect relative paths, unsafe writes, or confusing output before v1.0.0 is promoted.
126-
127-
### 🚧 Release-candidate status
128-
129-
This release candidate brings together four untagged development checkpoints.
130-
The product and general delivery foundation belongs to checkpoint 1; private
131-
GitLab package delivery belongs to checkpoint 2; source-checkout maintenance
132-
belongs to checkpoint 3; and safe GitHub Release rendering belongs to checkpoint
133-
4. RC.1 promotes their reviewed, cumulative result rather than introducing a
134-
separate implementation checkpoint.
135-
136-
Recorded development validation is not final release sign-off. Complete the
137-
RC checks against the exact candidate commit before publishing its tag, and
138-
validate the workflows relevant to your project before production use.
139-
140-
- Version: `v1.0.0-rc.1`
141-
- Previous version: none — first formal release
142-
- Strategy: Semantic Versioning
143-
- Package compatibility: Python 3.11+
144-
- Standard development/container runtime: Python 3.14
145-
- Stability: Release candidate; validate before production automation
146-
- Stable target: `v1.0.0`
147-
148-
The stable release may include final cleanup, documentation corrections, and
149-
fixes discovered during RC validation, without changing the documented safety
150-
model unexpectedly.
151-
152-
Thank you for validating the first Path Header Scanner production release line.
153-
154-
_Release candidate: v1.0.0-rc.1_
155-
_Author: Devalltect / Rizky Fernandes_
1+
✅ Final Release path-header-scanner v1.0.0
2+
3+
**path-header-scanner v1.0.0** is now stable and production-ready. All feature and fixes from pre-releases (alpha, beta, rc) are included.
4+
5+
### ✨ Highlights
6+
7+
- *(Nothing yet)*
8+
9+
---
10+
11+
✅ This version is **stable** and **suitable** for production use.

‎.github/workflows/docker-prod.yml‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ name: 🐋 Docker Production Image
55
run-name: 🐋 Production Docker Build • ${{ inputs.tag || github.ref_name }}
66

77
# Production images are release artifacts. They are built only from existing,
8-
# non-empty annotated SemVer tags. Stable tags update `latest`; prerelease
9-
# tags publish only their exact version.
8+
# non-empty annotated SemVer tags. Stable tags update the matching major,
9+
# minor, and `latest` aliases; prerelease tags publish only their exact version.
1010

1111
on:
1212
push:
@@ -49,8 +49,9 @@ jobs:
4949
python -m pip install --disable-pip-version-check packaging
5050
5151
TAG_REGEX='^v[0-9]+\.[0-9]+\.[0-9]+([.-](alpha|beta|rc|dev|post)\.[0-9]+)?(\+[0-9A-Za-z.]+)?$'
52-
STABLE_TAG_REGEX='^v[0-9]+\.[0-9]+\.[0-9]+(\+[0-9A-Za-z.]+)?$'
52+
STABLE_TAG_REGEX='^v[0-9]+\.[0-9]+\.[0-9]+$'
5353
TAG="$RELEASE_TAG"
54+
PUBLISH_ALIASES=false
5455
PUBLISH_LATEST=false
5556
5657
if [[ ! "$TAG" =~ $TAG_REGEX ]]; then
@@ -83,14 +84,21 @@ jobs:
8384
fi
8485
8586
if [[ "$TAG" =~ $STABLE_TAG_REGEX ]]; then
87+
PUBLISH_ALIASES=true
8688
PUBLISH_LATEST=true
8789
fi
8890
8991
IMAGE_TAG="${TAG//+/-}"
92+
VERSION_CORE="${TAG#v}"
93+
VERSION_CORE="${VERSION_CORE%%+*}"
94+
IFS='.' read -r MAJOR MINOR _ <<< "$VERSION_CORE"
9095
9196
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
9297
echo "image_tag=$IMAGE_TAG" >> "$GITHUB_OUTPUT"
9398
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
99+
echo "major=$MAJOR" >> "$GITHUB_OUTPUT"
100+
echo "minor=$MINOR" >> "$GITHUB_OUTPUT"
101+
echo "publish_aliases=$PUBLISH_ALIASES" >> "$GITHUB_OUTPUT"
94102
echo "publish_latest=$PUBLISH_LATEST" >> "$GITHUB_OUTPUT"
95103
96104
- name: 🐳 Set up Docker Buildx
@@ -117,6 +125,8 @@ jobs:
117125
ghcr.io/${{ steps.vars.outputs.image_name }}
118126
tags: |
119127
type=raw,value=${{ steps.version.outputs.image_tag }}
128+
type=raw,value=v${{ steps.version.outputs.major }}.${{ steps.version.outputs.minor }},enable=${{ steps.version.outputs.publish_aliases }}
129+
type=raw,value=v${{ steps.version.outputs.major }},enable=${{ steps.version.outputs.publish_aliases }}
120130
type=raw,value=latest,enable=${{ steps.version.outputs.publish_latest }}
121131
122132
- name: 🏗️ Build and push production image

0 commit comments

Comments
 (0)