Release-Zyklus
Dieses Dokument beschreibt den Release-Zyklus von DuckDB und den Core-Erweiterungen. Es richtet sich an Entwickler, die an DuckDB-Erweiterungen arbeiten, und soll die zugrunde liegenden Abläufe verständlicher machen.
Überblick
- DuckDB folgt Semantic Versioning (
v<MAJOR>.<MINOR>.<PATCH>) - Minor-Versionen erscheinen etwa alle 4 Monate
- Patch-Releases werden bei Bedarf herausgegeben für:
- Die aktuelle stabile Version
- Die aktuelle Long-Term-Support-Version (LTS)
- Alle Releases sind im Release-Kalender aufgeführt
Terminologie
In den Release-Dokumenten verwenden wir einige grundlegende Begriffe für Versionen und Branches. Wir gehen hier kurz darauf ein.
vx.y.z: Das aktuelle stabile Releasevx.y-codename: Der Name des Branches, aus demvx.y.<n>-Releases entstehenvx.<y+1>-codename: Der Branch-Name, der für den Branch verwendet wird, aus dem das nächste Minor-Release entstehtMain release cycle: Die Branches, Commits und PRs, die zuvx.<y+1>.0- undvx.y.<z+1>-Releases führenActive branch: Ein Branch, der Teil des Haupt-Release-Zyklus ist. Entweder main oder vx.<y+n>-codename mit n >= 0Single branch extension: Erweiterung mit 1 aktivem Branch. Da main immer ein aktiver Branch ist, ist das immer main. Das bedeutet, alle anderen Branches der Formvx.y-codenamemüssenvx.<y-n>-codenamemitn >= 1seinMulti branch extension: Erweiterung mit mehr als 1 aktivem BranchTwo branch extension: Erweiterung mit zwei aktiven Branches: main undvx.y-codenameThree branch extension: Erweiterung mit drei aktiven Branches: main,vx.y-codenameundvx.<y+1>-codenameLTS release: Long-Term-Support-Release. Diese Releases erhalten Unterstützung (Patch-Releases) über ihre Lebensdauer im aktiven Release-Zyklus hinaus. Derzeit erhalten LTS-Releases 1 Jahr UnterstützungUnstable API extension: Eine Erweiterung, die auf die unstable Extension-API zielt. Das kann sowohl die C++-API als auch die unstable C-API sein. Diese Erweiterungen sind über mehrere DuckDB-Versionen hinweg nicht binärkompatibelStable API extension: Eine Erweiterung, die auf die stable C-API von DuckDB zielt. Diese Erweiterungen sind über mehrere DuckDB-Versionen hinweg binärkompatibelIn-tree extensions: Erweiterungen, die im Quellbaum vonduckdb/duckdbliegen
Haupt-Branches und Tags
In der git-basierten Versionsverwaltung dienen Branches dazu, mehrere Versionen derselben Codebasis parallel zu halten. Bei DuckDB gibt es zwei Kern-Branches, die die Hauptrolle im Release-Zyklus von DuckDB (und den Erweiterungen) spielen. Zuerst listen wir das Format dieser Kern-Branches auf.
main-Branch: Der Main-Branch kann Verschiedenes bedeuten, gilt aber allgemein als Auffang-Branchvx.y-codename-Branch: Der Branch, aus dem allevx.y.z-Releases entstehenvx.y.z-Tag: Ein stabiles DuckDB-Release. Diese Tags sind schreibgeschützt und bleiben immer an denselben Commit gebunden
Der Haupt-Release-Zyklus von DuckDB
LTS-Releases (Long-Term Support) folgen einem eigenen Wartungszyklus, um längere Unterstützung und Stabilität zu bieten.
Der Haupt-Release-Zyklus von DuckDB besteht aus 3 Phasen: Mid-cycle, Pre-release und Feature freeze. Diese Phasen sind klar definiert und werden kommuniziert, damit das gesamte Team synchron auf das nächste Release hinarbeitet.
Phase 1: Mid-cycle
Aktive DuckDB-Branches
mainvx.y-codename
Beschreibung
Die Phase Mid-cycle ist die häufigste Phase des Release-Zyklus; etwa 75 % der Zeit wird in dieser
Phase verbracht. Sie entspricht dem Normalbetrieb: Das kommende Release liegt noch weit entfernt, und das Team arbeitet intensiv
daran, vielfältige Features und Bugfixes einzupflegen. In dieser Phase können Patch-Releases (vx.y.<z+n>) aus dem
Branch vx.y-codename entstehen. Die Patches werden in den Branch vx.y-codename gemergt, und der Branch vx.y-codename wird
häufig in main gemergt, damit beide synchron bleiben.
PRs in DuckDB
- Bugfixes für
vx.y.<z+n>-Patch-Releases werden invx.y-codenamegemergt - Features und Bugfixes für
vx.<y+1>.0werden inmaingemergt
Phase 2: Pre-release
Aktive Branches
mainvx.y-codenamevx.<y+1>-codename
Beschreibung
Die Pre-release-Phase dient der Vorbereitung des kommenden Minor-Releases vx.<y+1>.0. Zu Beginn dieser Phase
wird der Branch vx.<y+1>-codename angelegt. Dieser Branch dient dem kommenden Minor-Release und ist der
Branch, aus dem alle nachfolgenden Patch-Releases vx.<y+1>.<n> erscheinen.
PRs in DuckDB
- Bugfixes für
vx.y.<z+1>-Patch-Releases werden invx.y-codenamegemergt - Features und Bugfixes für
vx.<y+1>.0werden invx.<y+1>-codenamegemergt - Features für
vx.<y+2>.0werden invx.<y+2>-codenamegemergt
Phase 3: Feature Freeze
Aktive Branches
mainvx.y-codenamevx.<y+1>-codename
Beschreibung
Die Feature-Freeze-Phase liegt dem Release am nächsten. In dieser Phase dürfen Features nicht mehr in
vx.<y+1>-codename gemergt werden; es werden nur noch Bugfixes gemergt. Ziel dieser Phase ist die Qualität des kommenden
Releases. In dieser Phase werden zusätzliche Tests und Benchmarks durchgeführt, während das Risiko kurzfristig
eingebrachter Bugs durch das Verbot von Feature-Merges sinkt.
PRs in DuckDB
- Bugfixes für
vx.y.<z+1>sind nicht mehr zulässig und sollten stattdessenvx.<y+1>.0gelten - Bugfixes für
vx.<y+1>.0werden invx.<y+1>-codenamegemergt - Features für
vx.<y+1>.0sind nicht mehr zulässig und sollten stattdessenvx.<y+2>.0gelten - Features für
vx.<y+2>.0werden invx.<y+2>-codenamegemergt
Haupt-Release-Zyklus der Erweiterungen
Die meisten DuckDB-Erweiterungen sind vollständig vom Haupt-Repository duckdb/duckdb getrennt und können ihren eigenen
Release-Zyklus verfolgen. In diesem Abschnitt kategorisieren wir verschiedene Arten von DuckDB-Erweiterungen und gehen ihre Release-Zyklen durch.
Um den Release-Zyklus von Erweiterungen zu beschreiben, müssen wir Erweiterungen zunächst in drei Gruppen einteilen, da Erweiterungen denselben Release-Zyklus teilen, je nachdem, zu welcher dieser drei Kategorien sie gehören.
- In-tree-Erweiterungen
- Unstable-API-Erweiterungen
- Stable-API-Erweiterungen
Wir gehen nun die Release-Zyklen der drei Kategorien in aufsteigender Komplexität durch.
In-tree-Erweiterungen
Bei In-tree-Erweiterungen ist der Release-Zyklus sehr einfach. Da ihr Code im Repository duckdb/duckdb liegt,
laufen sie vollständig im Gleichschritt mit DuckDB. Das bedeutet dieselbe Versionierung und dieselben Branches. In diesem Sinne sind sie
keine echten Erweiterungen, sondern eher nachladbare Teile der Codebasis duckdb/duckdb.
Stable-API-Erweiterungen
Stable-API-Erweiterungen sind in DuckDB ein vergleichsweise neues Konzept, sollen aber künftig die Mehrheit der Erweiterungen bilden. Stable-API-Erweiterungen basieren auf der stabilen C-Extension-API und sind damit mit mehreren DuckDB-Versionen binärkompatibel. Ihr Release-Zyklus kann bzw. sollte daher auch vollständig vom DuckDB-Release-Zyklus getrennt sein.
Der Release-Zyklus für Stable-API-Erweiterungen ist noch in Arbeit. Die Grundidee ist, dass der Release-Zyklus
von Stable-API-Erweiterungen einem ähnlichen, aber eigenen Zyklus wie dem von duckdb/duckdb folgt, wobei jede Version
eine oder mehrere DuckDB-Versionen als Ziel hat.
Unstable-API-Erweiterungen
Unstable-API-Erweiterungen machen derzeit die Mehrheit der DuckDB-Erweiterungen aus. Diese Erweiterungen zielen entweder auf die C++- Extension-API oder auf die unstable C-Extension-API. Aus Sicht des Release-Zyklus sind sie am komplexesten. Jede Version einer Unstable-API-Erweiterung zielt nur auf eine einzige DuckDB-Version. Diese 1:1-Kopplung bedeutet, dass der Release-Zyklus dieser Erweiterungen oft ein mitunter verflochtenes Zusammenspiel mit dem Haupt-Release-Zyklus von DuckDB bildet. Ziel ist es, möglichst viele Erweiterungen auf stabile APIs umzustellen; Unstable-API-Erweiterungen werden aber noch länger existieren, sodass ihr Lebenszyklus klar definiert bleiben muss. Deshalb beschreiben wir ihn im Rest dieses Abschnitts.
Kategorisierung nach Branching
Zunächst unterteilen wir die Unstable-API-Erweiterungen in verschiedene Unterkategorien. Wie DuckDB selbst folgen diese
Erweiterungen demselben Branching-Schema wie DuckDB, bei dem eine Kombination aus main und vx.y-codename die Hauptrolle
spielt. Wir definieren nun die drei Typen instabiler Erweiterungen anhand ihrer Anzahl aktiver Branches.
- Single-branch-Erweiterungen haben nur den aktiven Branch
main - Two-branch-Erweiterungen haben zwei aktive Branches:
mainundvx.y-codename - Three-branch-Erweiterungen haben drei aktive Branches:
main,vx.y-codenameundvx.<y+1>-codename
DuckDB-Ziele
Jede Unstable-API-Erweiterung sollte eine einzige DuckDB-Version als Ziel haben. Diese Zielversion ergibt sich aus einer Kombination
des duckdb-Submoduls und der Zielversion im Workflow MainDistributionPipeline.
Welche Version eine Erweiterung als Ziel hat, hängt von der Phase des Release-Zyklus und vom Branch ab. Wir gehen nun alle
Kombinationen durch
- Phase: Mid-cycle
- Typ: Single branch
- Erweiterung
main->DuckDBvx.y.zodermain
- Erweiterung
- Typ: Two branch
- Erweiterung
main->DuckDBvx.y.zodermain - Erweiterung
vx.y-codename->DuckDBvx.y.zodervx.y-codename
- Erweiterung
- Typ: Three branch: sollte nicht existieren
- Typ: Single branch
- Phase: Pre-release / Patch
- Typ: Single branch
- Erweiterung
main->DuckDBvx.y.zodervx.<y+1>-codename
- Erweiterung
- Typ: Two branch
- Erweiterung
main->DuckDBvx.y.zodervx.<y+1>-codename - Erweiterung
vx.y-codename->DuckDBvx.y.zodervx.y-codename
- Erweiterung
- Typ: Three branch
- Erweiterung
main->DuckDBmain - Erweiterung
vx.y-codename->DuckDBvx.y.zodervx.y-codename - Erweiterung
vx.<y+1>-codename->DuckDBvx.<y+1>-codename
- Erweiterung
- Typ: Single branch
Wohin PRs gemergt werden
Wohin ein PR in eine Unstable-API-Erweiterung gemergt wird, hängt von zwei Dingen ab: der aktuellen Release-Phase und dem Erweiterungstyp. Wir gehen nun alle Kombinationen durch.
- Phase: Mid-cycle
- Typ: Single branch
- wenn DuckDB-Ziel:
vx.y.z:- PR für
vx.y.<z+1>inmain1 - PR für
vx.<y+1>.0wird inmaingemergt
- PR für
- wenn DuckDB-Ziel:
main:- PRs für
vx.y.<z+1>sind unmöglich - PR für
vx.<y+1>.0wird inmaingemergt
- PRs für
- wenn DuckDB-Ziel:
- Typ: Two branch
- PR für
vx.y.<z+1>wird invx.y-codenamegemergt - PR für
vx.<y+1>.0wird inmaingemergt
- PR für
- Typ: Three branch
- PR für
vx.y.<z+1>wird invx.y-codenamegemergt - PR für
vx.<y+1>.0wird invx.<y+1>-codenamegemergt - PR für
vx.<y+2>.0wird inmaingemergt
- PR für
- Typ: Single branch
- Phase: Pre-release / Patch
Welche Erweiterungsversion wird veröffentlicht?
Zu jedem DuckDB-Release sollte ein vollständiger Satz aller Core-Erweiterungen verfügbar sein. Für Unstable-API-Erweiterungen bedeutet das
einen Rebuild der Binärdateien. Für die Core-Erweiterungen erfolgt dieser Build in der Regel über die CI von duckdb/duckdb. Das
bedeutet, dass die Liste der Erweiterungen, die zum Release verfügbar sein werden, in den
Extension-Config-Dateien dokumentiert ist. Diese Config-
Datei ist jedoch nicht immer aktuell. Um zu entscheiden, welche Version einer Erweiterung Teil des kommenden Releases sein soll,
definieren wir die folgenden Quellen der Wahrheit für die neueste Erweiterungsversion anhand des Release-Typs (Major/Minor) und des Erweiterungs-
typs (Single-/Multi-Branch):
- Release-Typ: Patch
- Erweiterungstyp: Single branch
- Neueste Version: Commit in den Config-Dateien
- Erweiterungstyp: Multi branch
- Neueste Version: Branch
vx.y-codenameder Erweiterung
- Neueste Version: Branch
- Erweiterungstyp: Single branch
- Release-Typ: Minor
- Erweiterungstyp: Single branch
- Neueste Version: Branch
mainder Erweiterung
- Neueste Version: Branch
- Erweiterungstyp: Two branch
- Neueste Version: Branch
mainder Erweiterung
- Neueste Version: Branch
- Erweiterungstyp: Three branch
- Neueste Version: Branch
vx.<y+1>-codenameder Erweiterung
- Neueste Version: Branch
- Erweiterungstyp: Single branch
Wechsel zwischen Single Branch, Two Branch und Three Branch
Der Wechsel zwischen den verschiedenen Branch-Typen für Erweiterungen ist vergleichsweise einfach und sollte wie folgt erfolgen:
- Wechsel: Single branch
->Two branch- Wann: in jeder Phase
- Gründe:
- Wenn Features gemergt werden sollen, die nicht für
vx.y.<z+1>geeignet sind, die Fähigkeit zu Releases fürvx.y.<z+n>aber erhalten bleiben soll - Um mit dem aktuellen DuckDB-main testen zu können und gleichzeitig Releases für
vx.y.<z+n>(einschließlichvx.y.zselbst) zu ermöglichen
- Wenn Features gemergt werden sollen, die nicht für
- Aktionen:
- Branch
vx.y-codenamevon einem Commit auf main zwischen HEAD vonmainund dem Commit in der DuckDB-vx.y.z-Config-Datei anlegen.
- Branch
- Wechsel: Two branch
->Three branch- Wann: in der Phase Pre-release oder Feature-freeze
- Gründe:
- Immer wenn ein Feature gemergt werden muss, das nicht für
vx.<y+1>.0zulässig ist.
- Immer wenn ein Feature gemergt werden muss, das nicht für
- Aktionen:
- Branch
vx.<y+1>-codenamevon main anlegen
- Branch
- Wechsel Three branch
->Two branch oder Two branch->Single branch- Wann: Teil des Übergangs von Feature Freeze
->Mid-cycle - Aktion: geschieht automatisch (
vx.y-codenamewird per Definition inaktiv)
- Wann: Teil des Übergangs von Feature Freeze
Footnotes
-
Single-branch-Erweiterungen erfordern manuelle Versionsaktualisierungen, damit Änderungen im angezielten Release enthalten sind. ↩ ↩2
-
Patch-Releases während der Pre-release- oder Feature-Freeze-Phase sind unüblich. Erwägen Sie, Änderungen stattdessen für das nächste Minor-Release vorzusehen. ↩ ↩2 ↩3