Zum Inhalt springen

Monorepo-Unterstützung

semrel unterstützt Repositories mit mehreren unabhängig versionierten Packages. Es gibt zwei Ansätze — wähle den, der zu deinem Workflow passt.


Jedes Package hat seine eigene .semrel.yaml und wird von einem eigenen CI-Job oder Matrix-Step releast.

  • Ordnermy-monorepo/
    • Ordnerpackages/
      • Ordnerapi/
        • .semrel.yaml
        • go.mod
      • Ordnerui/
        • .semrel.yaml
        • package.json
      • Ordnerworker/
        • .semrel.yaml
        • go.mod
    • .semrel.yaml Root-Konfiguration (optional, gemeinsame Basis)

semrel präfigiert jeden Tag mit dem Package-Pfad, wenn tagPrefix den Pfad enthält:

packages/api@v1.4.0
packages/ui@v3.2.0
packages/worker@v0.9.1
packages/api/.semrel.yaml
schemaVersion: 1
tagPrefix: "packages/api@v"
branches:
- name: main
plugins:
- uses: @semrel/provider-github
jobs:
release:
strategy:
matrix:
package: [packages/api, packages/ui, packages/worker]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Release ${{ matrix.package }}
run: semrel release --config ./${{ matrix.package }}/.semrel.yaml
env:
SEMREL_PLUGIN_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Alle Packages in der Root-.semrel.yaml konfigurieren und mit einem Befehl releasen. Packages werden in Abhängigkeitsreihenfolge releast; Packages ohne Neues werden automatisch übersprungen.

.semrel.yaml
schemaVersion: 1
branches:
- name: main
plugins:
- uses: @semrel/provider-github # gemeinsames Plugin für alle Packages
workspace:
strategy: independent # jedes Package bekommt sein eigenes Semver
# Option 1: explizite Liste mit optionaler Abhängigkeitsreihenfolge
packages:
- path: packages/api
tagPrefix: "packages/api@v"
- path: packages/ui
tagPrefix: "packages/ui@v"
dependsOn: [packages/api] # wird erst nach api releast
- path: packages/worker
tagPrefix: "packages/worker@v"
# Option 2: alle Package-Verzeichnisse automatisch entdecken
# pattern: "packages/*"
fail_fast: false # Fehler sammeln (Standard: bei Fehler weitermachen)

Jedes Package-Verzeichnis kann eine eigene .semrel.yaml haben, die die Root-Konfiguration überschreibt (branches, rules, plugins, tagPrefix).

Terminal-Fenster
# Alle konfigurierten Packages auflisten
semrel workspace list
# Vorschau (dry-run, keine Änderungen)
semrel workspace release --dry-run
# Alle Packages in Abhängigkeitsreihenfolge releasen
semrel workspace release
# Unabhängige Packages gleichzeitig releasen
semrel workspace release --parallel
# Bei erstem Fehler sofort stoppen
semrel workspace release --fail-fast
[packages/api] releasing…
Current version: v1.2.0 → v1.3.0 (minor)
✓ Committed CHANGELOG.md ✓ Created tag packages/api@v1.3.0
[packages/api] ✓ released
[packages/ui] releasing…
No commits since last release — nothing to release.
[packages/ui] – skipped (nothing to release)
[packages/worker] releasing…
Current version: v0.8.0 → v0.9.0 (minor)
[packages/worker] ✓ released
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: semrel-Plugins wiederherstellen
run: semrel plugin restore
- name: Workspace releasen
run: semrel workspace release
env:
SEMREL_PLUGIN_TOKEN: ${{ secrets.GITHUB_TOKEN }}

MerkmalOption A (Matrix)Option B (Workspace)
Config-OrtPro-Package .semrel.yamlRoot .semrel.yaml
CI-JobsEin Job pro PackageEin Job insgesamt
AbhängigkeitsreihenfolgeManuell (Stage-Abhängigkeiten)Automatisch (dependsOn)
ParallelisierungNative CI-Parallelisierung--parallel-Flag
Gemeinsame PluginsPro Package duplizierenEinmalig auf Root-Ebene
Package-IsolationVollständigPackages teilen Git-Repo-Kontext