|
| 1 | +# Migrating to Dependency-Track v5 |
| 2 | + |
| 3 | +Dependency-Track v5 is the next major version of the project, previously developed under the codename *Hyades*. |
| 4 | +For what is actually new in v5, including architecture, schema, configuration, and API surface, see |
| 5 | +[About changes in v5](https://dependencytrack.github.io/docs/next/concepts/changes-in-v5/). |
| 6 | + |
| 7 | +This document covers the GA cutover itself. It describes what changes for operators, |
| 8 | +contributors, and downstream consumers as v5 moves to GA, and what your options are for staying on v4. |
| 9 | + |
| 10 | +> [!IMPORTANT] |
| 11 | +> Please read this document end-to-end **before** updating any image pin, Helm value, or CI reference. |
| 12 | +> The image name changes, and the `:latest` and `:snapshot` tag policies are deliberately conservative |
| 13 | +> to avoid moving consumers across a major version without an explicit decision. |
| 14 | +
|
| 15 | +## Contents |
| 16 | + |
| 17 | +- [Phases](#phases) |
| 18 | +- [What is moving](#what-is-moving) |
| 19 | + - [Source repositories](#source-repositories) |
| 20 | + - [Container images](#container-images) |
| 21 | +- [Tag policy](#tag-policy) |
| 22 | + - [`:latest`](#latest) |
| 23 | + - [`:snapshot`](#snapshot) |
| 24 | + - [v5 tags](#v5-tags) |
| 25 | +- [Pin recommendations](#pin-recommendations) |
| 26 | +- [Action items by audience](#action-items-by-audience) |
| 27 | + - [Operators](#operators) |
| 28 | + - [Required action today](#required-action-today) |
| 29 | + - [v4 maintenance window](#v4-maintenance-window) |
| 30 | + - [After v4 EOL](#after-v4-eol) |
| 31 | + - [Migrating to v5](#migrating-to-v5) |
| 32 | + - [Helm](#helm) |
| 33 | + - [Contributors and PR authors](#contributors-and-pr-authors) |
| 34 | + - [If you have an open PR](#if-you-have-an-open-pr) |
| 35 | + - [Re-targeting a PR's base branch](#re-targeting-a-prs-base-branch) |
| 36 | + - [Moving a local branch to the new repo](#moving-a-local-branch-to-the-new-repo) |
| 37 | + - [Forks](#forks) |
| 38 | + - [Where things live after cutover](#where-things-live-after-cutover) |
| 39 | + - [Issues and discussions on `hyades-*` repos](#issues-and-discussions-on-hyades--repos) |
| 40 | + - [ADRs (new in v5)](#adrs-new-in-v5) |
| 41 | +- [Historical artifacts](#historical-artifacts) |
| 42 | +- [What is **not** changing](#what-is-not-changing) |
| 43 | + |
| 44 | +## Phases |
| 45 | + |
| 46 | +The cutover proceeds in ordered phases. Timing is best-effort and community-driven. |
| 47 | +Each phase advances only when its preconditions are met. Do not plan around fixed dates. |
| 48 | + |
| 49 | +> [!IMPORTANT] |
| 50 | +> v4 will receive bugfixes and security patches for **at least ~6 months past v5 GA**. |
| 51 | +> This minimum is committed, regardless of how cutover-day timing shifts. |
| 52 | +
|
| 53 | +| Phase | Precondition | What happens | |
| 54 | +|--------------|-------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| |
| 55 | +| Announcement | Maintainers agree the cutover is imminent | Public notice. v4 `master` enters freeze on a date named in the notice. | |
| 56 | +| Cutover | v5 `5.0.0-rc.1` ready to publish | v4 `master` (both repos) renamed to `v4-master-archived`. v5 imported as `main`. RC published. `hyades-*` repos archived. | |
| 57 | +| GA | RC soak completes with no blockers | v5 `5.0.0` GA published. | |
| 58 | +| v4 EOL | At least ~6 months elapsed since v5 GA | v4 patches stop. `:snapshot` discontinued. `:latest` flips to v5. | |
| 59 | + |
| 60 | +Each phase is announced ahead of time on the |
| 61 | +[GitHub Discussions](https://github.com/DependencyTrack/dependency-track/discussions), |
| 62 | +and `#dependency-track` channel in the OWASP Slack. |
| 63 | + |
| 64 | +## What is moving |
| 65 | + |
| 66 | +### Source repositories |
| 67 | + |
| 68 | +| Before (v4 / pre-GA v5) | After (v5 GA onwards) | |
| 69 | +|---------------------------------------------|-----------------------------------------------------------------| |
| 70 | +| `DependencyTrack/dependency-track` (v4) | `DependencyTrack/dependency-track:4.14.x` (v4) | |
| 71 | +| `DependencyTrack/dependency-track:master` | Renamed to `:v4-master-archived` (frozen, no merges accepted) | |
| 72 | +| `DependencyTrack/frontend` (v4) | `DependencyTrack/frontend:4.14.x` (v4) | |
| 73 | +| `DependencyTrack/frontend:master` | Renamed to `:v4-master-archived` (frozen, no merges accepted) | |
| 74 | +| `DependencyTrack/hyades-apiserver` (v5 dev) | `DependencyTrack/dependency-track:main` (v5) | |
| 75 | +| `DependencyTrack/hyades-frontend` (v5 dev) | `DependencyTrack/frontend:main` (v5) | |
| 76 | + |
| 77 | +`hyades-apiserver` and `hyades-frontend` are **archived** at cutover. They remain readable. |
| 78 | +No new pushes, no new issues, no new PRs. |
| 79 | + |
| 80 | +### Container images |
| 81 | + |
| 82 | +| Before | After | |
| 83 | +|----------------------------------------------|----------------------------------------| |
| 84 | +| `dependencytrack/hyades-apiserver:<tag>` | `dependencytrack/apiserver:<tag>` | |
| 85 | +| `ghcr.io/dependencytrack/hyades-apiserver` | `ghcr.io/dependencytrack/apiserver` | |
| 86 | +| `dependencytrack/hyades-frontend:<tag>` | `dependencytrack/frontend:<tag>` | |
| 87 | +| `ghcr.io/dependencytrack/hyades-frontend` | `ghcr.io/dependencytrack/frontend` | |
| 88 | + |
| 89 | +v4 images (`dependencytrack/apiserver`, `dependencytrack/frontend`, `dependencytrack/bundled`) |
| 90 | +**do not change name**. v4 has always published to these names. Only the pre-GA v5 (`hyades-*`) images are renamed. |
| 91 | + |
| 92 | +> [!NOTE] |
| 93 | +> `dependencytrack/bundled` is **v4-only**. There is no v5 equivalent. It follows the v4 lifecycle and stops receiving |
| 94 | +> updates at v4 EOL along with the other v4 images. |
| 95 | +
|
| 96 | +## Tag policy |
| 97 | + |
| 98 | +`:latest` and `:snapshot` deliberately do **not** flip on the GA date. |
| 99 | +This is to prevent unpinned v4 deployments from silently jumping to v5 on the next `docker pull` and breaking. |
| 100 | + |
| 101 | +### `:latest` |
| 102 | + |
| 103 | +| Period | Resolves to | |
| 104 | +|-------------------------|----------------------------| |
| 105 | +| Today through v4 EOL | Latest v4 release | |
| 106 | +| After v4 EOL | Latest v5 release | |
| 107 | + |
| 108 | +If you run `:latest` in production today, **pin to an explicit version before v4 EOL**. |
| 109 | +After v4 EOL, `:latest` advances across the major boundary in one pull. |
| 110 | + |
| 111 | +### `:snapshot` |
| 112 | + |
| 113 | +| Tag | Period | Resolves to | |
| 114 | +|---------------|----------------------|----------------------------| |
| 115 | +| `:snapshot` | Today through v4 EOL | v4 nightly | |
| 116 | +| `:snapshot` | After v4 EOL | **Discontinued** | |
| 117 | +| `:4-snapshot` | From cutover onwards | v4 nightly (frozen at EOL) | |
| 118 | +| `:5-snapshot` | From v5 GA onwards | v5 nightly | |
| 119 | + |
| 120 | +`:snapshot` is **not flipped to v5** at v4 EOL. Migrate to `:4-snapshot` or `:5-snapshot` explicitly. |
| 121 | + |
| 122 | +### v5 tags |
| 123 | + |
| 124 | +| Tag | Resolves to | |
| 125 | +|---------------|--------------------------------| |
| 126 | +| `:5.x.y` | Exact v5 release. Immutable. | |
| 127 | +| `:5.x.y-rc.N` | Exact RC. Immutable. | |
| 128 | +| `:5-snapshot` | v5 `main` nightly | |
| 129 | +| `:latest` | See [`:latest`](#latest). | |
| 130 | + |
| 131 | +No floating major (`:5`) or minor (`:5.0`) tags are published. This matches v4's tagging surface and steers operators |
| 132 | +toward digest or exact-version pins (see [Pin recommendations](#pin-recommendations)). |
| 133 | + |
| 134 | +## Pin recommendations |
| 135 | + |
| 136 | +For production, in order of preference: |
| 137 | + |
| 138 | +1. **Digest pin** (`@sha256:...`). Strongest guarantee. Survives tag mutation, repo deletion, and registry mirroring. |
| 139 | +2. **Exact version** (`:4.14.3` or `:5.0.0`). Survives the cutover unchanged. |
| 140 | + |
| 141 | +Use Renovate, Dependabot, or equivalent to bump exact pins on a schedule you control. |
| 142 | + |
| 143 | +Do **not** use `:latest` or `:snapshot` in production. Both move under you without notice. |
| 144 | + |
| 145 | +## Action items by audience |
| 146 | + |
| 147 | +### Operators |
| 148 | + |
| 149 | +#### Required action today |
| 150 | + |
| 151 | +None, **if you pin image tags by an exact version or digest.** |
| 152 | +v4 keeps shipping on its existing image names and tags until v4 EOL (~6 months post-v5 GA). |
| 153 | + |
| 154 | +If you currently pull `:latest` or `:snapshot`, switch before v4 EOL: |
| 155 | + |
| 156 | +| Today | Pin to | |
| 157 | +|--------------------------------------|-----------------------------------------------| |
| 158 | +| `dependencytrack/apiserver:latest` | An exact version (e.g. `:4.14.3`) or a digest | |
| 159 | +| `dependencytrack/apiserver:snapshot` | `:4-snapshot` or a digest | |
| 160 | +| `dependencytrack/frontend:latest` | An exact version (e.g. `:4.14.3`) or a digest | |
| 161 | +| `dependencytrack/frontend:snapshot` | `:4-snapshot` or a digest | |
| 162 | + |
| 163 | +`:4-snapshot` becomes available at cutover. Until then, pin to a digest to escape `:snapshot`. |
| 164 | + |
| 165 | +#### v4 maintenance window |
| 166 | + |
| 167 | +- v4 continues to receive `4.14.x` patch releases. There will be **no further v4 minor releases** (no `4.15.0`). |
| 168 | +- Patch cadence is best-effort and community-driven, focused on security and high-severity fixes. |
| 169 | +- File v4 bugs against `DependencyTrack/dependency-track` with the `v4` label. |
| 170 | + |
| 171 | +#### After v4 EOL |
| 172 | + |
| 173 | +- No further patches, including for CVEs in v4 itself or its dependencies. |
| 174 | +- New issues that apply **only** to v4 are closed with a pointer to v5. Existing `v4`-labeled issues remain as-is |
| 175 | + and readable for reference. |
| 176 | + |
| 177 | +#### Migrating to v5 |
| 178 | + |
| 179 | +> [!WARNING] |
| 180 | +> There is no in-place upgrade. v5 runs on its own PostgreSQL cluster and ingests v4 data via an offline, |
| 181 | +> one-shot migrator. Plan downtime accordingly. |
| 182 | +
|
| 183 | +- [About changes in v5](https://dependencytrack.github.io/docs/next/concepts/changes-in-v5/) for the architectural, |
| 184 | + schema, and configuration deltas. |
| 185 | +- [Migrating from v4 to v5](https://dependencytrack.github.io/docs/next/guides/administration/migrating-from-v4/) |
| 186 | + for the step-by-step migrator procedure, prerequisites, and post-migration audit checklist. |
| 187 | +- [Rehearsing the v4 migration](https://dependencytrack.github.io/docs/next/tutorials/rehearsing-the-v4-migration/) |
| 188 | + to dry-run against a production copy before scheduling the cutover. |
| 189 | +- [Running v4 and v5 in parallel](https://dependencytrack.github.io/docs/next/guides/administration/running-v4-and-v5-in-parallel/) |
| 190 | + for parallel-validation strategies. |
| 191 | + |
| 192 | +#### Helm |
| 193 | + |
| 194 | +The official chart updates together with v5 GA. See [`helm-charts`](https://github.com/DependencyTrack/helm-charts). |
| 195 | +Diff your values file against the v5 chart defaults before bumping. |
| 196 | + |
| 197 | +### Contributors and PR authors |
| 198 | + |
| 199 | +> [!IMPORTANT] |
| 200 | +> v4 `master` is frozen ahead of cutover and renamed at cutover. Open PRs follow the rename but cannot be merged. |
| 201 | +> See [If you have an open PR](#if-you-have-an-open-pr) for what to do. |
| 202 | +
|
| 203 | +#### If you have an open PR |
| 204 | + |
| 205 | +Re-target your PR before cutover. If you do not, the PR survives but ends up against `v4-master-archived`, |
| 206 | +which accepts no merges. You will have to re-target it yourself afterwards. |
| 207 | + |
| 208 | +**Against `dependency-track:master`** (pre-cutover v4 repo): |
| 209 | + |
| 210 | +- **v4 patch**: re-target the base branch to `4.14.x` (see [re-targeting](#re-targeting-a-prs-base-branch) below). |
| 211 | +- **v5-bound**: close and re-open against `hyades-apiserver:main` (pre-cutover) or `dependency-track:main` |
| 212 | + (post-cutover). Link the original PR in the new description. |
| 213 | + |
| 214 | +**Against `hyades-apiserver:main` or `hyades-frontend:main`**: |
| 215 | + |
| 216 | +- Pre-cutover: business as usual. Land before cutover if you can. |
| 217 | +- At cutover: the repo is archived. Existing PRs are not auto-migrated and cannot be merged. |
| 218 | + Re-open against `dependency-track:main` (or `frontend:main`) once v5 GA is published. |
| 219 | + |
| 220 | +#### Re-targeting a PR's base branch |
| 221 | + |
| 222 | +GitHub UI: open the PR, click **Edit** next to the title, pick the new base branch. Works only if the new base lives |
| 223 | +in the same repo. For cross-repo moves (`hyades-apiserver` -> `dependency-track`), open a new PR. |
| 224 | + |
| 225 | +#### Moving a local branch to the new repo |
| 226 | + |
| 227 | +After cutover, point your fork and clone at `dependency-track`. The archived `hyades-apiserver` remote still works |
| 228 | +read-only but will not accept pushes. |
| 229 | + |
| 230 | +```sh |
| 231 | +# 1. Rename your fork on GitHub: Settings -> Repository name -> "dependency-track" |
| 232 | +# (GitHub keeps redirects, but update the remote anyway.) |
| 233 | + |
| 234 | +# 2. Update the upstream remote |
| 235 | +git remote set-url upstream https://github.com/DependencyTrack/dependency-track.git |
| 236 | + |
| 237 | +# 3. Update your fork remote |
| 238 | +git remote set-url origin git@github.com:<you>/dependency-track.git |
| 239 | + |
| 240 | +# 4. Fetch the new default branch and rebase your work |
| 241 | +git fetch upstream |
| 242 | +git rebase upstream/main |
| 243 | + |
| 244 | +# 5. Push and open the PR against dependency-track:main |
| 245 | +git push -u origin <your-branch> |
| 246 | +``` |
| 247 | + |
| 248 | +> [!NOTE] |
| 249 | +> After the rename, `upstream/master` resolves to `upstream/v4-master-archived`. |
| 250 | +> That branch is frozen and accepts no merges. Rebase v5-bound work onto |
| 251 | +> `upstream/main` and v4-patch work onto `upstream/4.14.x`. |
| 252 | +
|
| 253 | +#### Forks |
| 254 | + |
| 255 | +GitHub does **not** auto-rename or auto-archive forks. |
| 256 | + |
| 257 | +- Your fork still exists under its old name and still tracks the archived repo. |
| 258 | +- Rename it via **Settings -> Repository name** to keep PRs tidy. |
| 259 | +- Branches you pushed before cutover are preserved. |
| 260 | + |
| 261 | +#### Where things live after cutover |
| 262 | + |
| 263 | +| Concern | Location | |
| 264 | +|--------------------------------------|-----------------------------------------------------------| |
| 265 | +| v5 apiserver code, issues, PRs | `DependencyTrack/dependency-track` (branch `main`) | |
| 266 | +| v5 frontend code, issues, PRs | `DependencyTrack/frontend` (branch `main`) | |
| 267 | +| v4 maintenance patches | `DependencyTrack/dependency-track` (branch `4.14.x`) | |
| 268 | +| `CONTRIBUTING.md`, `SECURITY.md` | `DependencyTrack/dependency-track:main` (root) | |
| 269 | +| ADRs | `DependencyTrack/dependency-track:main` under `docs/adr/` | |
| 270 | +| Helm charts | `DependencyTrack/helm-charts` (unaffected) | |
| 271 | +| User docs | `DependencyTrack/docs` (unaffected) | |
| 272 | + |
| 273 | +#### Issues and discussions on `hyades-*` repos |
| 274 | + |
| 275 | +- Both repos are archived at cutover. Existing issues and discussions stay readable but become read-only. |
| 276 | +- Open issues are not auto-migrated. Maintainers will move the ones they judge relevant for v5 to |
| 277 | + `DependencyTrack/dependency-track` at their own discretion. No guarantees on which or when. |
| 278 | +- If your issue is not moved, and you believe it should be, you have two options: |
| 279 | + - Ask a maintainer to move it via OWASP Slack `#dependency-track` or GitHub Discussions, linking the original. |
| 280 | + - Re-file on `DependencyTrack/dependency-track` and link the old issue. |
| 281 | +- v4 bug reports go on `DependencyTrack/dependency-track` with the `v4` label. |
| 282 | + |
| 283 | +#### ADRs (new in v5) |
| 284 | + |
| 285 | +v5 introduces Architecture Decision Records. Substantial changes now require an ADR that reaches **Accepted** |
| 286 | +before the implementation PR merges. v4 had no such requirement. See |
| 287 | +`CONTRIBUTING.md#architecture-decision-records` for trigger criteria. |
| 288 | + |
| 289 | +## Historical artifacts |
| 290 | + |
| 291 | +> [!WARNING] |
| 292 | +> **The `5.0.0` tag exists in two places with different content.** The archived `hyades-apiserver` repo published |
| 293 | +> release tags `5.0.0` through `5.6.0` (and `5.7.0-alpha.X`) during pre-GA development. This was a mistake in hindsight. |
| 294 | +> v5 GA restarts numbering at `5.0.0` on `dependency-track:main`. The two are **not** the same artifact. Disambiguate |
| 295 | +> by repo and registry path: |
| 296 | +> |
| 297 | +> | Tag | Source | Meaning | |
| 298 | +> |---------|-------------------------------------------------------------|----------------| |
| 299 | +> | `5.0.0` | `DependencyTrack/hyades-apiserver` (archived) | Pre-GA, frozen | |
| 300 | +> | `5.0.0` | `DependencyTrack/dependency-track` (and `apiserver` images) | v5 GA | |
| 301 | +> |
| 302 | +> Pre-GA images and source remain pullable from the archived repo for reference. Do not consume them as v5 GA. |
| 303 | +
|
| 304 | +## What is **not** changing |
| 305 | + |
| 306 | +To keep expectations grounded: |
| 307 | + |
| 308 | +- The Helm chart repository (`DependencyTrack/helm-charts`) is **not** renamed or archived. |
| 309 | +- The documentation repository (`DependencyTrack/docs`) is **not** renamed. |
| 310 | +- The project website (`dependencytrack.org`) does not change URL. |
| 311 | +- The OWASP project page does not change URL. |
0 commit comments