Skip to content

Commit b7615d1

Browse files
committed
fix(publish): remove JFrog publishing entirely
Every artefact now publishes to the OSS registry stack: GHCR / crates.io / PyPI / npm / GitHub Releases / Cloudflare R2. JFrog was on a deprecation path with v2; this commit completes the removal. Removed: - destinations_internal block in defaults.yaml - jfrog_* fields and derived URLs in OrgConfig - jfrog config block in org.yaml - _publish_jfrog handlers in python/rust/typescript publish modules - _publish_jfrog_binaries + _upload_to_artifactory in publish/binaries - internal/both branches in container/registry.py - JFrog Docker login + JFROG_TOKEN env in workflow _release-tail.yml - "internal staging" channel override in dispatch.py - All in-source JFrog comments and references Backward compat preserved: - publish.target field still accepted in .hyperi-ci.yaml; values internal/both/oss all route to the OSS destination map - HYPERCI_PUBLISH_TARGET env var still accepted; same routing - Workflow-dispatch input publish-target still accepted Docs updated: - README publish-channels section rewritten for OSS-only - MIGRATION-GUIDE adds v2.1.4 entry; existing v1→v2 section notes JFrog removal - CI-LESSONS.md prefixed with banner: JFrog notes are historical - JFROG-MIGRATION.md status updated: removal complete The only remaining toggle for full OSS visibility is making the source repos themselves public on GitHub. Publish: true
1 parent 8ab6e25 commit b7615d1

27 files changed

Lines changed: 230 additions & 747 deletions

.github/workflows/_release-tail.yml

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
# on will-publish)
1818
# (here) tag-and-publish ← npx semantic-release real → tag +
1919
# CHANGELOG; then hyperi-ci run publish
20-
#binaries to crates.io / R2 / GH
21-
# Release / JFrog
20+
#artefacts to crates.io / PyPI / npm /
21+
# GHCR / GitHub Releases / Cloudflare R2
2222
#
2323
# Doctrine: tag-on-publish. A git tag exists iff the artefact is in the
2424
# registry. Aligns with kubernetes/rust/python OSS conventions.
@@ -144,17 +144,6 @@ jobs:
144144
username: ${{ github.actor }}
145145
password: ${{ secrets.GITHUB_TOKEN }}
146146

147-
- name: JFrog Docker login
148-
# Required when publish.target resolves to internal or both. The
149-
# registry resolver writes the JFrog tag; this step authenticates
150-
# the push. No-op if vars.JFROG_DOMAIN is unset.
151-
if: steps.check.outputs.enabled != 'false' && (inputs.publish-target == 'internal' || inputs.publish-target == 'both') && vars.JFROG_DOMAIN != ''
152-
uses: docker/login-action@v4
153-
with:
154-
registry: ${{ vars.JFROG_DOMAIN }}
155-
username: ${{ secrets.JFROG_USERNAME }}
156-
password: ${{ secrets.JFROG_TOKEN }}
157-
158147
- name: Set up Docker Buildx
159148
if: steps.check.outputs.enabled != 'false'
160149
uses: docker/setup-buildx-action@v4
@@ -272,11 +261,12 @@ jobs:
272261
run: uv python install ${{ inputs.python-version }}
273262

274263
- name: Publish
275-
# Uploads to all configured destinations: crates.io / PyPI / npm
276-
# (oss), JFrog Artifactory (internal), R2 (oss), GitHub Release.
264+
# Uploads to all OSS destinations: crates.io / PyPI / npm /
265+
# GHCR / GitHub Releases / Cloudflare R2.
277266
env:
278-
JFROG_TOKEN: ${{ secrets.JFROG_TOKEN }}
279267
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
268+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
269+
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
280270
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
281271
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
282272
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}

.github/workflows/go-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ on:
2222
publish-target:
2323
type: string
2424
default: "oss"
25-
description: "Publish destination: oss (default, FOSS), internal (deprecated, JFrog), or both"
25+
description: "Publish destination (legacy field, ignored — every publish goes to OSS registries)"
2626
go-version-file:
2727
type: string
2828
default: "go.mod"

.github/workflows/python-ci.yml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ on:
2222
publish-target:
2323
type: string
2424
default: "oss"
25-
description: "Publish destination: oss (default, FOSS), internal (deprecated, JFrog), or both"
25+
description: "Publish destination (legacy field, ignored — every publish goes to OSS registries)"
2626
python-version:
2727
type: string
2828
default: "3.12"
@@ -118,14 +118,6 @@ jobs:
118118
- name: Install native dependencies
119119
run: ${{ env.HYPERCI_INSTALL }} install-native-deps python
120120

121-
# DO NOT add UV_EXTRA_INDEX_URL here.
122-
# uv does NOT work like pip with mixed public+private indices. By default
123-
# uv uses first-match-wins per package name — if JFrog returns an empty
124-
# 200 for a package it doesn't have (e.g. hatchling), uv stops there and
125-
# reports "no versions found" rather than falling back to PyPI.
126-
# Workaround exists (UV_INDEX_STRATEGY=unsafe-best-match) but is fragile.
127-
# Projects that need private JFrog packages configure [tool.uv.index] with
128-
# explicit=true in their own pyproject.toml — not here.
129121
- name: Install dependencies
130122
run: uv sync --frozen --all-extras
131123

.github/workflows/rust-ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ on:
2222
publish-target:
2323
type: string
2424
default: "oss"
25-
description: "Publish destination: oss (default, FOSS), internal (deprecated, JFrog), or both"
25+
description: "Publish destination (legacy field, ignored — every publish goes to OSS registries)"
2626
rust-toolchain:
2727
type: string
2828
default: "stable"
@@ -78,7 +78,7 @@ on:
7878
publish-target:
7979
type: string
8080
default: "oss"
81-
description: "Publish destination: oss (default, FOSS), internal (deprecated, JFrog), or both"
81+
description: "Publish destination (legacy field, ignored — every publish goes to OSS registries)"
8282
rust-toolchain:
8383
type: string
8484
default: "stable"

.github/workflows/ts-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ on:
2222
publish-target:
2323
type: string
2424
default: "oss"
25-
description: "Publish destination: oss (default, FOSS), internal (deprecated, JFrog), or both"
25+
description: "Publish destination (legacy field, ignored — every publish goes to OSS registries)"
2626
node-version:
2727
type: string
2828
default: "22"

README.md

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,18 @@ VERSION / pyproject.toml / package.json **before** the build, then tags
1616
registry. Aligns with kubernetes / rust / python OSS conventions. No
1717
more orphan tags from "tag every fix:, publish later" mode.
1818

19-
**100% FOSS pipeline by default.** Default `publish.target` is `oss`
20-
(GitHub Releases + crates.io / PyPI / npm + GHCR + R2). Internal /
21-
JFrog paths are opt-in and on a 4–6 week deprecation timeline.
19+
**100% FOSS pipeline.** Every artefact publishes to public registries:
20+
crates.io, PyPI, npm, GHCR, GitHub Releases, and Cloudflare R2
21+
(`downloads.hyperi.io`). The legacy `publish.target` knob is accepted
22+
in `.hyperi-ci.yaml` for backward compatibility but **ignored at
23+
runtime** — JFrog publishing was removed in v2.1.4. The only switch
24+
left to flip for full open-source visibility is making the source
25+
repos themselves public.
2226

2327
See [docs/MIGRATION-GUIDE.md](docs/MIGRATION-GUIDE.md) for the v1 → v2
24-
migration.
28+
migration. Pre-v2.1.4 docs that mention JFrog targets, the
29+
`destinations_internal` block, or `target: internal` are historical
30+
only — those code paths have been removed.
2531

2632
## Why Use This
2733

@@ -184,31 +190,40 @@ Control where artifacts go with one line in `.hyperi-ci.yaml`:
184190
```yaml
185191
publish:
186192
channel: release # spike | alpha | beta | release
187-
target: oss # oss (default, FOSS) | internal (deprecated, JFrog) | both
188193
```
189194
190-
### Channel behaviour
195+
### Publish targets
191196
192-
Pre-release channels (`spike`, `alpha`, `beta`) keep packages off the
193-
public registries. Stable releases require `channel: release`.
197+
Every artefact publishes to the OSS registry stack:
194198
195-
| Channel | Registry publish | GH Release | R2 binaries | R2 path |
196-
|---|---|---|---|---|
197-
| `spike` | none | Prerelease | Uploaded | `/{project}/spike/v1.3.0/` |
198-
| `alpha` | none | Prerelease | Uploaded | `/{project}/alpha/v1.3.0/` |
199-
| `beta` | none | Prerelease | Uploaded | `/{project}/beta/v1.3.0/` |
200-
| `release` | configured target | GA | Uploaded | `/{project}/v1.3.0/` |
199+
| Artefact type | Destination |
200+
|---|---|
201+
| Containers | GHCR (`ghcr.io/<org>`) |
202+
| Rust crates | crates.io |
203+
| Python packages | PyPI |
204+
| npm packages | npmjs.com |
205+
| Binaries (per-tag) | GitHub Releases |
206+
| Binaries (web-downloadable) | Cloudflare R2 (`downloads.hyperi.io`) |
207+
| Helm charts | OCI under GHCR |
208+
209+
The `publish.target` field is still accepted in `.hyperi-ci.yaml` for
210+
backward compatibility — values like `internal` or `both` are read,
211+
preserved on the `CIConfig` object, and **silently routed to the OSS
212+
destination map**. JFrog publishing was removed in v2.1.4. The only
213+
remaining toggle for full FOSS visibility is making the source repos
214+
themselves public on GitHub.
201215

202-
### Target behaviour
216+
### Channel behaviour
203217

204-
| `publish.target` | Containers | Binaries | Packages |
205-
|---|---|---|---|
206-
| `oss` (default) | GHCR | GitHub Release + R2 | crates.io / PyPI / npm |
207-
| `internal` | JFrog Docker (deprecated) | JFrog Generic (deprecated) | JFrog Cargo / PyPI / npm (deprecated) |
208-
| `both` | GHCR + JFrog | GitHub + R2 + JFrog | All registries |
218+
Pre-release channels (`spike`, `alpha`, `beta`) flag GH Releases as
219+
prerelease and prefix R2 paths. Stable releases require `channel: release`.
209220

210-
JFrog targets are kept for back-compat; the path is on a 4–6 week
211-
deprecation timeline. New projects should use `target: oss`.
221+
| Channel | GH Release | R2 path |
222+
|---|---|---|
223+
| `spike` | Prerelease | `/{project}/spike/v1.3.0/` |
224+
| `alpha` | Prerelease | `/{project}/alpha/v1.3.0/` |
225+
| `beta` | Prerelease | `/{project}/beta/v1.3.0/` |
226+
| `release` | GA | `/{project}/v1.3.0/` + `/{project}/latest/` |
212227

213228
### Graduating to GA
214229

docs/CI-LESSONS.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ across 14+ consumer projects.
99

1010
Source: `hyperi-io/ci` (to be archived once cutover is complete).
1111

12+
> **JFrog sections in this document are historical (pre-v2.1.4).**
13+
> JFrog publishing was removed entirely in v2.1.4. The JFrog auth
14+
> patterns, registry URLs, and token handling notes below are kept for
15+
> archaeological context — they describe how things worked before the
16+
> 100% OSS pipeline. Do not use them as a current reference. The
17+
> publish path now goes to crates.io / PyPI / npm / GHCR / GitHub
18+
> Releases / Cloudflare R2 only.
19+
1220
---
1321

1422
## Rust

docs/JFROG-MIGRATION.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
# JFrog Migration Plan (HISTORICAL)
1+
# JFrog Migration Plan (HISTORICAL — JFrog removed in v2.1.4)
22

3-
> **Status: superseded by full JFrog deprecation.**
3+
> **Status: complete. JFrog publishing was removed in v2.1.4.**
44
>
5-
> This document captured the v1-era plan to *reduce* JFrog to two roles
6-
> (Telstra delivery, private package staging). With the v2 release the
7-
> plan has changed: **JFrog is being phased out entirely** on a 4–6
8-
> week timeline. The default `publish.target` is now `oss` (GitHub
9-
> Releases + GHCR + crates.io / PyPI / npm + R2). The `internal` and
10-
> `both` targets are kept as opt-in paths for back-compat through the
11-
> deprecation window.
5+
> This document is a historical artefact from the v1 → v2 transition,
6+
> when JFrog was being *reduced* to a smaller role. With v2.1.4 the
7+
> reduction completed: **all JFrog publishing code, config, and
8+
> workflow steps were deleted**. Every artefact now publishes to the
9+
> OSS registry stack (GHCR / crates.io / PyPI / npm / GitHub Releases
10+
> / Cloudflare R2). Downstream `.hyperi-ci.yaml` files that still set
11+
> `publish.target: internal` or `publish.target: both` are accepted —
12+
> the field is read for back-compat — but its value is **silently
13+
> routed to the OSS destination map**. There is no JFrog publishing
14+
> path in the codebase anymore.
1215
>
13-
> Document kept for historical context.
16+
> Document kept for historical context. Do not treat as a current
17+
> reference.
1418
1519
Reduce JFrog to two roles: Telstra artifact delivery and private package
1620
staging (PyPI + Cargo). Move everything else to GitHub (GHCR, GitHub

docs/MIGRATION-GUIDE.md

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
# Migration Guide
22

3-
## v1 → v2 (current)
3+
## v2.1.4 — JFrog removed
4+
5+
JFrog publishing was removed entirely in v2.1.4. Every artefact now
6+
publishes to the OSS registry stack: GHCR, crates.io, PyPI, npm,
7+
GitHub Releases, and Cloudflare R2 (`downloads.hyperi.io`).
8+
9+
If your `.hyperi-ci.yaml` still has `publish.target: internal` or
10+
`publish.target: both`: **leave it**. The field is read for backward
11+
compatibility and silently routed to OSS. There is no JFrog code path
12+
left to enable. New projects should set `target: oss` (or omit the
13+
field — `oss` is the default).
14+
15+
The only remaining toggle for full open-source visibility is making
16+
the source repos themselves public on GitHub.
17+
18+
## v1 → v2
419

520
v2 introduces the version-first single-run pipeline and tag-on-publish
621
semantics. The biggest user-visible changes:
@@ -12,16 +27,17 @@ semantics. The biggest user-visible changes:
1227
| Tag semantics | Tags accumulate; some published, some not | Tag = "this artefact is in a registry" |
1328
| Build runs per release | 2 (push run + dispatch run) | 1 |
1429
| Version stamping | Post-build (binary lags one release) | Pre-build (binary embeds correct version) |
15-
| Default `publish.target` | `internal` (JFrog) | `oss` (FOSS) |
30+
| Default `publish.target` | `internal` (JFrog) | `oss` (FOSS); JFrog removed in v2.1.4 |
1631

1732
### What you have to do
1833

19-
1. **Update `.hyperi-ci.yaml`** — flip `target` to `oss` (or leave at `both`
20-
during the JFrog deprecation window):
34+
1. **Update `.hyperi-ci.yaml`**`target` no longer matters (JFrog was
35+
removed in v2.1.4 and every value routes to OSS), but you can flip
36+
to `oss` for clarity:
2137

2238
```yaml
2339
publish:
24-
target: oss # was: internal or both
40+
target: oss # was: internal or both — both still accepted, both go to OSS
2541
```
2642
2743
2. **Bump `hyperi-ci` to >= 2.0.0** in any local install:
@@ -76,9 +92,10 @@ semantics. The biggest user-visible changes:
7692
`Publish: true` trailer requires at least one release-worthy commit
7793
since the last tag. Add a `fix:` / `feat:` commit, or remove the
7894
trailer.
79-
- **JFrog registry deprecation**: `internal` and `both` targets keep
80-
working through the 4–6 week deprecation window. Plan to flip to
81-
`oss` before the JFrog endpoints turn off.
95+
- **JFrog removed in v2.1.4**: the `internal` and `both` target values
96+
are still accepted in `.hyperi-ci.yaml` but ignored — every publish
97+
goes to the OSS registry stack. No action required for projects
98+
already using `target: oss`.
8299

83100
---
84101

hyperi-ai

0 commit comments

Comments
 (0)