Skip to content

Commit 9f62b5f

Browse files
committed
chore(release): bump to v0.3.1 + CHANGELOG closeout
Round 1 Phase L (.env-file loader) + Round 2 Phase H (hardening pass) plus the bundle reproducibility / Windows / Docker / CI matrix fixes that surfaced after the ARM-runner queue cleared. Builds clean: get_installer-0.3.1-py3-none-any.whl + get_installer-0.3.1.tar.gz. 118 tests pass on macOS local; CI matrix green on Linux + macOS + Windows × Python 3.10/3.11/3.12/3.13 plus the Docker multiarch + bundle reproducibility + shellcheck jobs. Tag not pushed yet — awaiting explicit publish authorization + confirmation that the PyPI trusted publisher for `get-installer` is configured.
1 parent c3fceb0 commit 9f62b5f

2 files changed

Lines changed: 67 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,72 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
66

77
## [Unreleased]
88

9+
## [0.3.1] - 2026-05-16
10+
11+
### Added — SPEC Phase L
12+
13+
- **`--env-file PATH`** flag + auto-discovery: load `KEY=VALUE`
14+
env vars from a file before reading any `$GET_INSTALLER_*` var.
15+
Search order: explicit flag → `$GET_INSTALLER_ENV_FILE``./.env`.
16+
Existing shell env vars take precedence (Docker Compose / Foreman
17+
semantics).
18+
- New stdlib-only loader at `get_installer/env_file.py`. Bundled
19+
into the single-file `installer.py` via the existing bundler.
20+
21+
### Added — SPEC Phase H (hardening)
22+
23+
- Explicit `ssl.SSLContext` with `minimum_version=TLSv1_2`,
24+
`check_hostname=True`, `verify_mode=CERT_REQUIRED` on every
25+
`fetch_https` call. Modern Python defaults to this; pinning
26+
removes a downgrade-attack surface.
27+
- 600s (10-minute) timeouts on every long-running
28+
`subprocess.run()` (`git clone`, post-install steps, install
29+
commands). A hung child surfaces as an error instead of blocking
30+
forever.
31+
32+
### Fixed
33+
34+
- **`Registry.from_url` cache-age clamp**: Windows mtime skew can
35+
put a freshly-renamed file slightly in the future of
36+
`time.time()`. The age comparison now clamps negative values to
37+
0 ("just-written = fresh"). `cache_max_age_seconds=0` still
38+
bypasses the cache (`0 < 0 = False`).
39+
- **`scripts/bundle.py` writes bytes, not text**: previous
40+
`write_text` translated `\n``\r\n` on Windows and produced an
41+
on-disk SHA that mismatched the recorded sidecar. Now uses
42+
`write_bytes()` for byte-identical output across platforms.
43+
- **CI matrix cleanup**: dropped `ubuntu-24.04-arm` (paid-tier
44+
runner leaving runs queued indefinitely; Docker job covers
45+
linux/arm64 via cross-compile) and `macos-13` (Intel retired).
46+
- **Release workflow fixes**:
47+
- `shasum -a 256 dist/*` was choking on `dist/__pycache__/` from
48+
`python -m build`. Switched to explicit-file glob:
49+
`(cd dist && shasum -a 256 *.whl *.tar.gz installer.py)`.
50+
- `softprops/action-gh-release` files glob aligned: tarball
51+
name is `get_installer-*.tar.gz` (underscore, not hyphen).
52+
- **Docker base-image fixes** (Ubuntu 26.04 default):
53+
- Pinned `python3.12` → meta `python3` (Ubuntu 26.04 ships 3.13
54+
as default; 3.12 is no longer in resolute's repos).
55+
- Removed pre-existing `ubuntu` user at UID 1000 before
56+
`useradd -u 1000 installer` (otherwise exits 4 = UID-in-use).
57+
- **Windows test fixes**:
58+
- `test_write_log_uses_strict_mode` skipped on Windows (POSIX
59+
permission semantics don't apply).
60+
- Two `bash -n` syntax-check tests skipped on Windows (Git-Bash
61+
can't reliably parse Windows-style paths).
62+
- Job-level `PYTHONIOENCODING=utf-8` + `PYTHONUTF8=1` so
63+
subprocess captures round-trip the installer's UTF-8 output.
64+
65+
### Changed
66+
67+
- Node.js 20-deprecated actions bumped past the 2026-06-02 cutoff.
68+
- README badges (CI, PyPI, Python, license).
69+
- CodeQL workflow + issue/PR templates added.
70+
- Repository security toggles enabled.
71+
- SECURITY.md "Threat model" section: TLS 1.2 min + subprocess
72+
timeout guarantees + "no `shell=True` anywhere" confirmed by
73+
audit.
74+
975
## [0.3.0] - 2026-05-14
1076

1177
### Added: Docker PUID/PGID handling + entrypoint privilege drop

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "get-installer"
7-
version = "0.3.0"
7+
version = "0.3.1"
88
description = "Reusable, registry-driven curl-pipe-sh-style installer for distributing dev tools across public, private, enterprise, and government contexts."
99
readme = "README.md"
1010
license = { file = "LICENSE" }

0 commit comments

Comments
 (0)