From 5406909438dc0260b9daaaa97bfeec98809b213b Mon Sep 17 00:00:00 2001 From: Yoshiki Fujikane Date: Mon, 25 Aug 2025 17:36:09 +0900 Subject: [PATCH 1/2] Add Client to InitializeInput Signed-off-by: Yoshiki Fujikane --- pkg/plugin/sdk/plugin.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pkg/plugin/sdk/plugin.go b/pkg/plugin/sdk/plugin.go index d82ee20306..89bbc40769 100644 --- a/pkg/plugin/sdk/plugin.go +++ b/pkg/plugin/sdk/plugin.go @@ -22,8 +22,6 @@ import ( "net/http/pprof" "time" - "github.com/pipe-cd/piped-plugin-sdk-go/logpersister" - "github.com/pipe-cd/piped-plugin-sdk-go/toolregistry" "github.com/spf13/cobra" "go.uber.org/zap" "golang.org/x/sync/errgroup" @@ -32,6 +30,9 @@ import ( "github.com/pipe-cd/pipecd/pkg/cli" config "github.com/pipe-cd/pipecd/pkg/configv1" "github.com/pipe-cd/pipecd/pkg/rpc" + + "github.com/pipe-cd/piped-plugin-sdk-go/logpersister" + "github.com/pipe-cd/piped-plugin-sdk-go/toolregistry" ) // DeployTargetsNone is a type alias for a slice of pointers to DeployTarget @@ -60,6 +61,8 @@ type InitializeInput[Config, DeployTargetConfig any] struct { Config *Config // DeployTargets is the deploy targets of the plugin. DeployTargets map[string]*DeployTarget[DeployTargetConfig] + // Client is the client to interact with the piped. + Client *Client // Logger is the logger for the plugin. Logger *zap.Logger } @@ -321,9 +324,21 @@ func (p *Plugin[Config, DeployTargetConfig, ApplicationConfigSpec]) run(ctx cont } } + client := &Client{ + base: commonFields.client, + pluginName: commonFields.name, + toolRegistry: commonFields.toolRegistry, + // These fields are not available at initializing state. + applicationID: "", + deploymentID: "", + stageID: "", + logPersister: nil, + } + initializeInput := &InitializeInput[Config, DeployTargetConfig]{ Config: commonFields.pluginConfig, DeployTargets: commonFields.deployTargets, + Client: client, Logger: logger.Named("plugin-initializer"), } From 884a53400cea2d809cf7facc4d1eed202adeaaf1 Mon Sep 17 00:00:00 2001 From: Yoshiki Fujikane Date: Mon, 25 Aug 2025 17:37:10 +0900 Subject: [PATCH 2/2] Add initializers to plugin Signed-off-by: Yoshiki Fujikane --- pkg/plugin/sdk/plugin.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkg/plugin/sdk/plugin.go b/pkg/plugin/sdk/plugin.go index 89bbc40769..361732411b 100644 --- a/pkg/plugin/sdk/plugin.go +++ b/pkg/plugin/sdk/plugin.go @@ -100,6 +100,14 @@ func (c commonFields[Config, DeployTargetConfig]) withLogger(logger *zap.Logger) // PluginOption is a function that configures the plugin. type PluginOption[Config, DeployTargetConfig, ApplicationConfigSpec any] func(*Plugin[Config, DeployTargetConfig, ApplicationConfigSpec]) +// WithInitializer is a function that appends the initializer. +// The order of the execution for Initializers is the order in which they are added. +func WithInitializer[ApplicationConfigSpec, Config, DeployTargetConfig any](initializer Initializer[Config, DeployTargetConfig]) PluginOption[Config, DeployTargetConfig, ApplicationConfigSpec] { + return func(plugin *Plugin[Config, DeployTargetConfig, ApplicationConfigSpec]) { + plugin.initializers = append(plugin.initializers, initializer) + } +} + // WithStagePlugin is a function that sets the stage plugin. // This is mutually exclusive with WithDeploymentPlugin. func WithStagePlugin[Config, DeployTargetConfig, ApplicationConfigSpec any](stagePlugin StagePlugin[Config, DeployTargetConfig, ApplicationConfigSpec]) PluginOption[Config, DeployTargetConfig, ApplicationConfigSpec] { @@ -139,6 +147,9 @@ type Plugin[Config, DeployTargetConfig, ApplicationConfigSpec any] struct { // name is the name of the plugin defined in the piped plugin config. name string + // initializers + initializers []Initializer[Config, DeployTargetConfig] + // plugin implementations stagePlugin StagePlugin[Config, DeployTargetConfig, ApplicationConfigSpec] deploymentPlugin DeploymentPlugin[Config, DeployTargetConfig, ApplicationConfigSpec] @@ -342,6 +353,13 @@ func (p *Plugin[Config, DeployTargetConfig, ApplicationConfigSpec]) run(ctx cont Logger: logger.Named("plugin-initializer"), } + for _, initializer := range p.initializers { + if err := initializer.Initialize(ctx, initializeInput); err != nil { + logger.Error("failed to initialize plugin", zap.Error(err)) + return err + } + } + var services []rpc.Service if p.stagePlugin != nil {