Skip to content

Commit 38d5849

Browse files
Recover v1.3.1 release publishing (#133)
Signed-off-by: Sherif Mansour <13433538+kerberosmansour@users.noreply.github.com>
1 parent 4a96210 commit 38d5849

23 files changed

Lines changed: 101 additions & 85 deletions

File tree

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ body:
6262
attributes:
6363
label: Package version(s)
6464
description: Output of `pnpm list @hulumi/baseline @hulumi/policies @hulumi/drift @hulumi/k8s-baseline @hulumi/cloudflare-baseline @hulumi/platform-patterns @pulumi/aws @pulumi/pulumi @pulumi/kubernetes @pulumi/cloudflare`.
65-
placeholder: e.g. `@hulumi/baseline 1.3.0`, `@pulumi/aws 7.27.0`, `@pulumi/pulumi 3.232.0`
65+
placeholder: e.g. `@hulumi/baseline 1.3.1`, `@pulumi/aws 7.27.0`, `@pulumi/pulumi 3.232.0`
6666
validations:
6767
required: true
6868
- type: input

.github/attestations/README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ covers verification via `gh attestation verify` and `cosign`.
88

99
```sh
1010
# Download the tarball
11-
pnpm pack @hulumi/baseline@1.3.0 --pack-destination .
11+
pnpm pack @hulumi/baseline@1.3.1 --pack-destination .
1212

1313
# Verify the attestation
14-
gh attestation verify ./hulumi-baseline-1.3.0.tgz \
14+
gh attestation verify ./hulumi-baseline-1.3.1.tgz \
1515
--repo kerberosmansour/hulumi
1616
```
1717

1818
Expected output:
1919

2020
```
21-
Loaded digest sha256:<sha> for file://./hulumi-baseline-1.3.0.tgz
21+
Loaded digest sha256:<sha> for file://./hulumi-baseline-1.3.1.tgz
2222
Loaded 1 attestation from GitHub API
2323
✓ Verification succeeded!
2424
@@ -44,18 +44,18 @@ If you can't reach the GitHub API:
4444

4545
```sh
4646
# Download the tarball + the attestation
47-
pnpm pack @hulumi/baseline@1.3.0 --pack-destination .
48-
gh release download v1.3.0 \
47+
pnpm pack @hulumi/baseline@1.3.1 --pack-destination .
48+
gh release download v1.3.1 \
4949
--repo kerberosmansour/hulumi \
50-
--pattern "hulumi-baseline-1.3.0.tgz.intoto.jsonl" \
50+
--pattern "hulumi-baseline-1.3.1.tgz.intoto.jsonl" \
5151
--dir .
5252

5353
# Verify with cosign (assumes a recent cosign + Sigstore root)
5454
cosign verify-blob \
55-
--bundle ./hulumi-baseline-1.3.0.tgz.intoto.jsonl \
55+
--bundle ./hulumi-baseline-1.3.1.tgz.intoto.jsonl \
5656
--certificate-identity-regexp '^https://github.com/kerberosmansour/hulumi/' \
5757
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
58-
./hulumi-baseline-1.3.0.tgz
58+
./hulumi-baseline-1.3.1.tgz
5959
```
6060

6161
## What attestation guarantees

.github/workflows/release.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,14 @@ jobs:
6363
version: 9.12.0
6464
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
6565
with:
66-
node-version: 20
66+
node-version: 22.14.0
6767
cache: pnpm
6868
registry-url: https://registry.npmjs.org
69+
- name: Use npm CLI with trusted publishing OIDC support
70+
run: |
71+
npm install -g npm@11.5.1
72+
node --version
73+
npm --version
6974
- run: pnpm install --frozen-lockfile
7075
- run: pnpm -r build
7176

@@ -113,12 +118,9 @@ jobs:
113118
- name: npm publish (atomic — any failure aborts before subsequent publishes)
114119
run: |
115120
set -euo pipefail
116-
pnpm --filter @hulumi/baseline publish --no-git-checks --provenance --access public
117-
pnpm --filter @hulumi/policies publish --no-git-checks --provenance --access public
118-
pnpm --filter @hulumi/drift publish --no-git-checks --provenance --access public
119-
pnpm --filter @hulumi/k8s-baseline publish --no-git-checks --provenance --access public
120-
pnpm --filter @hulumi/cloudflare-baseline publish --no-git-checks --provenance --access public
121-
pnpm --filter @hulumi/platform-patterns publish --no-git-checks --provenance --access public
121+
for pkg in baseline policies drift k8s-baseline cloudflare-baseline platform-patterns; do
122+
(cd "packages/$pkg" && npm publish --provenance --access public)
123+
done
122124
123125
- name: Create GitHub release with SBOMs + tarballs
124126
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3

CHANGELOG.md

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,27 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8-
## [1.3.0] — 2026-05-15
8+
## [1.3.1] — 2026-05-15
99

1010
The Hulumi Edge Platform release. Atomic six-package publish:
11-
`@hulumi/baseline@1.3.0`, `@hulumi/policies@1.3.0`,
12-
`@hulumi/drift@1.3.0`, `@hulumi/k8s-baseline@1.3.0`, and first public
13-
publishes for `@hulumi/cloudflare-baseline@1.3.0` and
14-
`@hulumi/platform-patterns@1.3.0`. All six packages use the same SLSA
11+
`@hulumi/baseline@1.3.1`, `@hulumi/policies@1.3.1`,
12+
`@hulumi/drift@1.3.1`, `@hulumi/k8s-baseline@1.3.1`, and first public
13+
publishes for `@hulumi/cloudflare-baseline@1.3.1` and
14+
`@hulumi/platform-patterns@1.3.1`. All six packages use the same SLSA
1515
Build L3 + npm provenance release path.
1616

17+
This patch supersedes the failed `v1.3.0` tag attempt. That workflow completed
18+
preflight, tarball generation, SBOM generation, and provenance attestation, but
19+
stopped before any npm package was published because tokenless npm trusted
20+
publishing ran under Node 20 / npm 10. `v1.3.1` keeps the same product changes
21+
and uses the trusted-publishing-compatible release runtime.
22+
1723
### Added
1824

19-
- **`@hulumi/cloudflare-baseline@1.3.0`** — first release of Cloudflare
25+
- **`@hulumi/cloudflare-baseline@1.3.1`** — first release of Cloudflare
2026
edge primitives: `ZoneFoundation`, `PublicHostname`, `EdgeWafBaseline`,
2127
`BotProtectionBaseline`, and `ProtectedAdminHostname`.
22-
- **`@hulumi/platform-patterns@1.3.0`** — first release of
28+
- **`@hulumi/platform-patterns@1.3.1`** — first release of
2329
cross-provider patterns: `CloudflareOriginIngress`,
2430
`GitHubAwsOidcDeploymentRole`, `DeploymentRepositoryFoundation`, and
2531
`BuildProvenanceFoundation`.
@@ -28,7 +34,7 @@ Build L3 + npm provenance release path.
2834
- **Edge smoke and integration lanes**: `examples/edge-platform-smoke/`,
2935
Cloudflare/platform integration tests that skip without real credentials,
3036
and CI coverage for the new package pair.
31-
- **Release advisory preparation**: `docs/release/v1.3.0-security-advisories.md`
37+
- **Release advisory preparation**: `docs/release/v1.3.1-security-advisories.md`
3238
tracks the GHSA registrations to publish after the npm packages are live.
3339

3440
### Security
@@ -70,6 +76,9 @@ Build L3 + npm provenance release path.
7076

7177
- Release and CI workflows expand from four to six packages for pack,
7278
SBOM, attestation, dry-run, and npm publish steps.
79+
- Release publishing now runs the npm publish phase on Node 22.14.0 with npm
80+
11.5.1 so npm trusted publishing can exchange the GitHub OIDC token without a
81+
long-lived `NPM_TOKEN`.
7382
- `release-readiness.test.ts` now enforces the six-package atomic version
7483
invariant, per-package README/LICENSE requirements, and the v1.3 changelog
7584
entry.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Hulumi
22

3-
> Hardened-by-default AWS, GitHub, Kubernetes, and Cloudflare edge infrastructure-as-code for Pulumi. Apache-2.0. v1.3.0.
3+
> Hardened-by-default AWS, GitHub, Kubernetes, and Cloudflare edge infrastructure-as-code for Pulumi. Apache-2.0. v1.3.1.
44
55
## What is Hulumi?
66

@@ -42,7 +42,7 @@ The docs are organised by what you're trying to do. The full index lives at [doc
4242
| Want to hack on Hulumi itself | [Development guide](./docs/development.md) |
4343
| Hit a recurring gotcha and want a quick answer | [FAQ](./docs/faq.md) |
4444

45-
## What's in the box (v1.3.0)
45+
## What's in the box (v1.3.1)
4646

4747
| Package | What it gives you |
4848
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

SECURITY.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,17 @@ Every Hulumi tarball published from v1.0.0 carries an
112112

113113
```sh
114114
# Download the tarball
115-
pnpm pack @hulumi/baseline@1.3.0 --pack-destination .
115+
pnpm pack @hulumi/baseline@1.3.1 --pack-destination .
116116

117117
# Verify the attestation chain
118-
gh attestation verify ./hulumi-baseline-1.3.0.tgz \
118+
gh attestation verify ./hulumi-baseline-1.3.1.tgz \
119119
--repo kerberosmansour/hulumi
120120
```
121121

122122
Expected output: `✓ Verification succeeded` plus the build's commit SHA +
123-
workflow run URL. Repeat for `@hulumi/policies@1.3.0`, `@hulumi/drift@1.3.0`,
124-
`@hulumi/k8s-baseline@1.3.0`, `@hulumi/cloudflare-baseline@1.3.0`, and
125-
`@hulumi/platform-patterns@1.3.0`. The
123+
workflow run URL. Repeat for `@hulumi/policies@1.3.1`, `@hulumi/drift@1.3.1`,
124+
`@hulumi/k8s-baseline@1.3.1`, `@hulumi/cloudflare-baseline@1.3.1`, and
125+
`@hulumi/platform-patterns@1.3.1`. The
126126
[`.github/attestations/README.md`](./.github/attestations/README.md) covers
127127
both `gh attestation verify` and `cosign` verification paths.
128128

@@ -133,7 +133,7 @@ Advisory link above.
133133
## Pulumi cooling-off policy
134134

135135
Hulumi's own releases carry SLSA Build L3 provenance. `@pulumi/*` transitive
136-
dependencies do not carry SLSA attestations as of v1.3.0. Our compensating
136+
dependencies do not carry SLSA attestations as of v1.3.1. Our compensating
137137
controls:
138138

139139
1. **Exact-version-pinning with integrity hashes**: every `@pulumi/*` dep is
@@ -144,7 +144,7 @@ controls:
144144
`@aws-sdk/credential-providers`, `p-timeout`, `simple-git`) and
145145
`@hulumi/k8s-baseline`'s `@aws-sdk/client-secrets-manager`, plus
146146
`@pulumi/github` and `@pulumi/cloudflare` for the GitHub and edge
147-
surfaces — 13 pinned packages total at v1.3.0.
147+
surfaces — 13 pinned packages total at v1.3.1.
148148
2. **72h cooling-off for minor/major bumps + 24h for patches**:
149149
[`.github/workflows/pulumi-cooling-off.yml`](./.github/workflows/pulumi-cooling-off.yml)
150150
runs on every PR bumping a `@pulumi/*` pin. The job calls

docs/ARCHITECTURE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
55
## Overview
66

7-
Hulumi is an Apache-2.0 TypeScript monorepo that ships hardened-by-default Pulumi components for AWS, GitHub, Kubernetes/EKS, and Cloudflare edge, a CrossGuard policy-pack suite, a local-first drift classifier, and a Claude Code skill. Six publishable npm packages share an atomic SLSA Build L3 release path: `@hulumi/baseline`, `@hulumi/policies`, `@hulumi/drift`, `@hulumi/k8s-baseline`, `@hulumi/cloudflare-baseline`, and `@hulumi/platform-patterns`, all aligned on v1.3.0 for the edge-platform release.
7+
Hulumi is an Apache-2.0 TypeScript monorepo that ships hardened-by-default Pulumi components for AWS, GitHub, Kubernetes/EKS, and Cloudflare edge, a CrossGuard policy-pack suite, a local-first drift classifier, and a Claude Code skill. Six publishable npm packages share an atomic SLSA Build L3 release path: `@hulumi/baseline`, `@hulumi/policies`, `@hulumi/drift`, `@hulumi/k8s-baseline`, `@hulumi/cloudflare-baseline`, and `@hulumi/platform-patterns`, all aligned on v1.3.1 for the edge-platform release.
88

99
## Workspace Structure
1010

docs/cookbooks/verify-provenance.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ Your supply-chain policy requires you to verify provenance before consuming thir
2020
### 1. Pack the tarball locally without installing it
2121

2222
```bash
23-
npm pack @hulumi/baseline@1.3.0 --pack-destination /tmp --json
24-
# -> [{"filename":"hulumi-baseline-1.3.0.tgz","files":[...]}]
23+
npm pack @hulumi/baseline@1.3.1 --pack-destination /tmp --json
24+
# -> [{"filename":"hulumi-baseline-1.3.1.tgz","files":[...]}]
2525
```
2626

2727
Repeat for every `@hulumi/*` package you intend to install. The `release:verify-attestations` script in the root [package.json](../../package.json) does all six published packages in one shot:
@@ -33,13 +33,13 @@ pnpm run release:verify-attestations
3333
### 2. Verify the attestation against the canonical repo
3434

3535
```bash
36-
gh attestation verify /tmp/hulumi-baseline-1.3.0.tgz --repo kerberosmansour/hulumi
36+
gh attestation verify /tmp/hulumi-baseline-1.3.1.tgz --repo kerberosmansour/hulumi
3737
```
3838

3939
Expected output (paraphrased):
4040

4141
```
42-
Loaded digest sha256:... for file:///tmp/hulumi-baseline-1.3.0.tgz
42+
Loaded digest sha256:... for file:///tmp/hulumi-baseline-1.3.1.tgz
4343
Loaded 1 attestation from GitHub API
4444
✓ Verification succeeded!
4545
The attestation was generated by https://github.com/kerberosmansour/hulumi
@@ -58,12 +58,12 @@ If verification fails, **stop**. A failed verification means either:
5858
```json
5959
{
6060
"dependencies": {
61-
"@hulumi/baseline": "1.3.0",
62-
"@hulumi/policies": "1.3.0",
63-
"@hulumi/drift": "1.3.0",
64-
"@hulumi/k8s-baseline": "1.3.0",
65-
"@hulumi/cloudflare-baseline": "1.3.0",
66-
"@hulumi/platform-patterns": "1.3.0"
61+
"@hulumi/baseline": "1.3.1",
62+
"@hulumi/policies": "1.3.1",
63+
"@hulumi/drift": "1.3.1",
64+
"@hulumi/k8s-baseline": "1.3.1",
65+
"@hulumi/cloudflare-baseline": "1.3.1",
66+
"@hulumi/platform-patterns": "1.3.1"
6767
}
6868
}
6969
```

docs/development.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ Releases are atomic across the six packages — `@hulumi/baseline`, `@hulumi/pol
183183
1. Tag `v<x.y.z>` on `main`.
184184
2. `.github/workflows/release.yml` builds, attests, and publishes via npm trusted publishing (OIDC, no `NPM_TOKEN`).
185185
3. Post-publish, `release:verify-attestations` (in the root `package.json`) verifies the freshly-published tarballs against the canonical repo.
186-
4. Publish any prepared GitHub Security Advisories for fixes included in the release. For v1.3.0, use [`docs/release/v1.3.0-security-advisories.md`](./release/v1.3.0-security-advisories.md).
186+
4. Publish any prepared GitHub Security Advisories for fixes included in the release. For v1.3.1, use [`docs/release/v1.3.1-security-advisories.md`](./release/v1.3.1-security-advisories.md).
187187
5. CHANGELOG.md updated under the new version heading.
188188

189189
If a publish goes wrong, **don't `npm unpublish`.** Cut a `<x.y.z+1>` patch instead — unpublishing breaks downstream lockfiles for everyone who installed in the failure window. See [SECURITY.md](../SECURITY.md) for the responsible-disclosure path if the publish was compromised.

docs/release/v1.3.0-security-advisories.md renamed to docs/release/v1.3.1-security-advisories.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# v1.3.0 Security Advisory Registration Checklist
1+
# v1.3.1 Security Advisory Registration Checklist
22

3-
This checklist prepares the GHSA registrations for the v1.3.0 package
4-
release. Publish the advisories only after the `v1.3.0` release workflow has
3+
This checklist prepares the GHSA registrations for the v1.3.1 package
4+
release. Publish the advisories only after the `v1.3.1` release workflow has
55
completed and the patched npm tarballs are visible.
66

77
GitHub's repository security advisory API is documented at
@@ -14,31 +14,31 @@ patched versions.
1414

1515
| Source | Draft title | Affected product | Vulnerable range | Patched version | Suggested severity | CWE |
1616
| ---------- | ---------------------------------------------------------------------------- | --------------------------------- | ------------------------------ | --------------- | ------------------ | --------- |
17-
| PR #80 | CloudTrail selector tampering events were not fully detected | `@hulumi/baseline` | `< 1.3.0` | `1.3.0` | Medium | `CWE-778` |
18-
| PR #119 | Threat-model skill helper script root could be shadowed by workspace files | `/hulumi-threat-model` skill | repo revisions before `v1.3.0` | `v1.3.0` | Medium | `CWE-426` |
19-
| PR #120 | HULUMI-H1 SecureBucket parent spoof bypass | `@hulumi/policies` | `< 1.3.0` | `1.3.0` | High | `CWE-284` |
20-
| PR #121 | CIS 1.16 admin policy bypass for inline and attached IAM policies | `@hulumi/policies` | `< 1.3.0` | `1.3.0` | High | `CWE-269` |
21-
| PR #122 | SCP allowed `hulumi:iac-role` tag-on-create bypass | deployment SCP template and guide | repo revisions before `v1.3.0` | `v1.3.0` | High | `CWE-284` |
22-
| PR #123 | Orphan reconciler accepted externally supplied execute plans | `@hulumi/drift` | `< 1.3.0` | `1.3.0` | High | `CWE-345` |
23-
| PR #124 | Weekly integration IAM policy enabled role privilege escalation | deployment IAM policy guide | repo revisions before `v1.3.0` | `v1.3.0` | High | `CWE-269` |
24-
| 2026-05-15 | GitHub OIDC trust policy bypass via AWS set-qualified condition operators | `@hulumi/policies` | `< 1.3.0` | `1.3.0` | High | `CWE-284` |
25-
| 2026-05-15 | Stack-wide evidence bypassed Cloudflare and deployment-governance guardrails | `@hulumi/policies` | `< 1.3.0` | `1.3.0` | High | `CWE-693` |
17+
| PR #80 | CloudTrail selector tampering events were not fully detected | `@hulumi/baseline` | `< 1.3.1` | `1.3.1` | Medium | `CWE-778` |
18+
| PR #119 | Threat-model skill helper script root could be shadowed by workspace files | `/hulumi-threat-model` skill | repo revisions before `v1.3.1` | `v1.3.1` | Medium | `CWE-426` |
19+
| PR #120 | HULUMI-H1 SecureBucket parent spoof bypass | `@hulumi/policies` | `< 1.3.1` | `1.3.1` | High | `CWE-284` |
20+
| PR #121 | CIS 1.16 admin policy bypass for inline and attached IAM policies | `@hulumi/policies` | `< 1.3.1` | `1.3.1` | High | `CWE-269` |
21+
| PR #122 | SCP allowed `hulumi:iac-role` tag-on-create bypass | deployment SCP template and guide | repo revisions before `v1.3.1` | `v1.3.1` | High | `CWE-284` |
22+
| PR #123 | Orphan reconciler accepted externally supplied execute plans | `@hulumi/drift` | `< 1.3.1` | `1.3.1` | High | `CWE-345` |
23+
| PR #124 | Weekly integration IAM policy enabled role privilege escalation | deployment IAM policy guide | repo revisions before `v1.3.1` | `v1.3.1` | High | `CWE-269` |
24+
| 2026-05-15 | GitHub OIDC trust policy bypass via AWS set-qualified condition operators | `@hulumi/policies` | `< 1.3.1` | `1.3.1` | High | `CWE-284` |
25+
| 2026-05-15 | Stack-wide evidence bypassed Cloudflare and deployment-governance guardrails | `@hulumi/policies` | `< 1.3.1` | `1.3.1` | High | `CWE-693` |
2626

2727
`ProtectedAdminHostname` regex hardening from PR #126 is intentionally not in
2828
the advisory list because `@hulumi/cloudflare-baseline` first publishes at
29-
`1.3.0`; no vulnerable public npm version exists.
29+
`1.3.1`; no vulnerable public npm version exists.
3030

3131
## Publication Steps
3232

33-
1. Confirm `.github/workflows/release.yml` succeeded for tag `v1.3.0`.
33+
1. Confirm `.github/workflows/release.yml` succeeded for tag `v1.3.1`.
3434
2. Confirm all six npm tarballs are visible:
3535
`@hulumi/baseline`, `@hulumi/policies`, `@hulumi/drift`,
3636
`@hulumi/k8s-baseline`, `@hulumi/cloudflare-baseline`, and
3737
`@hulumi/platform-patterns`.
3838
3. Run `pnpm run release:verify-attestations` against the published tarballs.
3939
4. Create draft advisories in GitHub Security Advisories. For npm packages,
40-
set ecosystem `npm`, package name, vulnerable range `< 1.3.0`, and patched
41-
version `1.3.0`.
40+
set ecosystem `npm`, package name, vulnerable range `< 1.3.1`, and patched
41+
version `1.3.1`.
4242
5. For skill/docs/deployment assets, do not pretend there is an npm package.
4343
Use GitHub's advisory UI/API support for repository-level or other affected
4444
products where available, and keep the affected product text explicit.

0 commit comments

Comments
 (0)