Plugin-SDK
Das Plugin-SDK (github.com/GoSemantics/semrel-plugins) stellt die erzeugten Protobuf-Typen und Hilfsgerüste für das Schreiben von semrel-Plugins in Go bereit. Plugins in anderen Sprachen können die rohe .proto-Datei aus dem Haupt-Repository verwenden.
Voraussetzungen
Abschnitt betitelt „Voraussetzungen“- Go ≥ 1.24
- Vertrautheit mit gRPC und Protobuf
⚠️ Kritisch: stdout ist reserviert
Abschnitt betitelt „⚠️ Kritisch: stdout ist reserviert“Ein Go-Plugin erstellen
Abschnitt betitelt „Ein Go-Plugin erstellen“Erstelle ein neues Modul
Terminal-Fenster mkdir my-semrel-plugincd my-semrel-plugingo mod init github.com/myorg/my-semrel-plugingo get github.com/GoSemantics/semrel-pluginsImplementiere die Plugin-Schnittstelle
Jeder Plugin-Typ entspricht einem gRPC-Service, der in
semantic_release.protodefiniert ist.Das folgende Beispiel implementiert ein
CommitAnalyzerPlugin, das für jedenfeat:-Commit aufminorerhöht und für alles anderepatchverwendet:package mainimport ("context""strings"semrelv1 "github.com/GoSemantics/semrel-plugins/gen/v1")type myAnalyzer struct {semrelv1.UnimplementedCommitAnalyzerPluginServer}func (a *myAnalyzer) AnalyzeCommits(ctx context.Context,req *semrelv1.AnalyzeCommitsRequest,) (*semrelv1.AnalyzeCommitsResponse, error) {bump := semrelv1.BumpLevel_BUMP_LEVEL_NONEfor _, c := range req.Ctx.Commits {msg := c.RawMessageif strings.Contains(msg, "BREAKING CHANGE") {return &semrelv1.AnalyzeCommitsResponse{Bump: semrelv1.BumpLevel_BUMP_LEVEL_MAJOR,Reason: "breaking change detected",}, nil}if strings.HasPrefix(msg, "feat") {bump = semrelv1.BumpLevel_BUMP_LEVEL_MINOR} else if strings.HasPrefix(msg, "fix") && bump < semrelv1.BumpLevel_BUMP_LEVEL_MINOR {bump = semrelv1.BumpLevel_BUMP_LEVEL_PATCH}}return &semrelv1.AnalyzeCommitsResponse{Bump: bump}, nil}Über go-plugin bereitstellen
Verwende
plugin.Serve()– go-plugin verwaltet das Handshake-Protokoll über stdout automatisch. Nutzehclogfür alle Logs, damit die Ausgabe nach stderr geht:package mainimport ("os"hclog "github.com/hashicorp/go-hclog"goplugin "github.com/hashicorp/go-plugin"semrelv1 "github.com/GoSemantics/semrel-plugins/gen/v1")func main() {logger := hclog.New(&hclog.LoggerOptions{Name: "my-analyzer",Output: os.Stderr, // MUST be stderr — stdout is reserved for go-plugin handshakeLevel: hclog.Info,})goplugin.Serve(&goplugin.ServeConfig{HandshakeConfig: semrelv1.HandshakeConfig,Plugins: map[string]goplugin.Plugin{"commit-analyzer": &semrelv1.CommitAnalyzerPlugin{Impl: &myAnalyzer{}},},GRPCServer: goplugin.DefaultGRPCServer,Logger: logger,})}Baue und installiere das Plugin
Terminal-Fenster go build -o .semrel/my-analyzer .Registriere es in
.semrel.yamlplugins:- name: my-analyzerpath: ./.semrel/my-analyzer
Mehrere Schnittstellen implementieren
Abschnitt betitelt „Mehrere Schnittstellen implementieren“Eine einzelne Plugin-Binärdatei kann mehrere gRPC-Services auf demselben Server registrieren:
semrelv1.RegisterCommitAnalyzerPluginServer(srv, &myAnalyzer{})semrelv1.RegisterChangelogGeneratorPluginServer(srv, &myChangelog{})ReleaseContext
Abschnitt betitelt „ReleaseContext“Jeder RPC erhält in seiner Anfrage einen ReleaseContext. Er enthält:
| Feld | Typ | Beschreibung |
|---|---|---|
repo_owner / repo_name | string | Repository-Identität |
branch | string | Die veröffentlichte Branch |
last_version | SemanticVersion | Vorheriges Release-Tag |
next_version | SemanticVersion | Berechnete nächste Version |
commits | []Commit | Commits seit der letzten Release |
dry_run | bool | Wenn true, dürfen keine Seiteneffekte angewendet werden |
config | map<string, string> | Plugin-args aus .semrel.yaml |