From 851fdf8c9ee7c90aeeb67bf55a4de6b0f5bad6f2 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Wed, 1 Nov 2023 20:26:49 +0100 Subject: [PATCH 01/38] Some basic work on addons --- cmd/server/flags.go | 4 + cmd/server/setup.go | 12 +- .../30-administration/75-addons/00-addons.md | 22 +++ .../75-addons/20-creating-addons.md | 71 +++++++++ .../75-addons/_category_.yml | 3 + shared/addon/addon.go | 64 ++++++++ shared/addon/test-addon/go.mod.bak | 16 ++ shared/addon/test-addon/go.sum.bak | 45 ++++++ shared/addon/test-addon/main.go | 145 ++++++++++++++++++ shared/addon/types/types.go | 7 + 10 files changed, 388 insertions(+), 1 deletion(-) create mode 100644 docs/docs/30-administration/75-addons/00-addons.md create mode 100644 docs/docs/30-administration/75-addons/20-creating-addons.md create mode 100644 docs/docs/30-administration/75-addons/_category_.yml create mode 100644 shared/addon/addon.go create mode 100644 shared/addon/test-addon/go.mod.bak create mode 100644 shared/addon/test-addon/go.sum.bak create mode 100644 shared/addon/test-addon/main.go create mode 100644 shared/addon/types/types.go diff --git a/cmd/server/flags.go b/cmd/server/flags.go index 45631a3195..baaae70b09 100644 --- a/cmd/server/flags.go +++ b/cmd/server/flags.go @@ -256,6 +256,10 @@ var flags = append([]cli.Flag{ Name: "enable-swagger", Value: true, }, + &cli.StringSliceFlag{ + EnvVars: []string{"WOODPECKER_ADDONS"}, + Name: "addons", + }, // // backend options for pipeline compiler // diff --git a/cmd/server/setup.go b/cmd/server/setup.go index 052bc2750d..5c2f527684 100644 --- a/cmd/server/setup.go +++ b/cmd/server/setup.go @@ -49,6 +49,8 @@ import ( "github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/server/store/datastore" "github.com/woodpecker-ci/woodpecker/server/store/types" + "github.com/woodpecker-ci/woodpecker/shared/addon" + addonTypes "github.com/woodpecker-ci/woodpecker/shared/addon/types" ) func setupStore(c *cli.Context) (store.Store, error) { @@ -132,8 +134,16 @@ func setupMembershipService(_ *cli.Context, r forge.Forge) cache.MembershipServi return cache.NewMembershipService(r) } -// setupForge helper function to setup the forge from the CLI arguments. +// setupForge helper function to set up the forge from the CLI arguments. func setupForge(c *cli.Context) (forge.Forge, error) { + add, err := addon.Load[forge.Forge](c.StringSlice("addons"), addonTypes.TypeForge) + if err != nil { + return nil, err + } + if add != nil { + return add.Value, nil + } + switch { case c.Bool("github"): return setupGitHub(c) diff --git a/docs/docs/30-administration/75-addons/00-addons.md b/docs/docs/30-administration/75-addons/00-addons.md new file mode 100644 index 0000000000..977e0c26ab --- /dev/null +++ b/docs/docs/30-administration/75-addons/00-addons.md @@ -0,0 +1,22 @@ +# Addons + +To adapt Woodpecker to your needs beyond the [configuration](../10-server-config.md), Woodpecker has its own **addon** system, built ontop of [Go's internal plugin system](https://go.dev/pkg/plugin). + +Currently, addons can only be used to integrate forges into Woodpecker that are not supported out-of-the-box. + +## Usage + +To use an addon, download the addon version built for your Woodpecker version. Then, you can add the following to your configuration: + +```diff +# docker-compose.yml +version: '3' + +services: + woodpecker-server: + [...] + environment: ++ - WOODPECKER_PLUGIN=/path/to/your/addon/file.so +``` + +You may need to [mount the addon file as volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to access it from inside the Docker container. diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md new file mode 100644 index 0000000000..f7e1ab2640 --- /dev/null +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -0,0 +1,71 @@ +# Creating addons + +Addons are written in Go. + +## Writing your code + +A plugin consists of two variables/functions in Go. + +1. The `Type` variable. Specifies the type of the plugin and must be directly accessed from `shared/addons/types/types.go`. +2. The `Addon` function which is the main point of your plugin. + This function takes two arguments: + 1. The zerolog logger you should use to log errors, warnings etc. + 2. A slice of strings with the environment variables used as configuration. + + The function returns two values: + 1. The actual plugin. For type reference see [table below](#return-types). + 2. An error. If this error is not `nil`, Woodpecker exits. + +Directly import Woodpecker's Go package (`github.com/woodpecker-ci/woodpecker`) and use the interfaces and types defined there. + +### Return types + +| Plugin type | Return type | +| --- | --- | +| `Forge` | `forge.Forge` | + +## Compiling + +After you wrote your addon code, compile your plugin: + +```sh +go build -buildmode plugin +``` + +The output file is your plugin which is now ready to use. + +## Restrictions + +Plugins must directly directly depend on Woodpecker's core (`github.com/woodpecker-ci/woodpecker`). +The plugin must have been built with **excatly the same code** as the Woodpecker instance you'd like to use it on. This means: If you build your plugin with a specific commit from Woodpecker `next`, you can likely only use it with the Woodpecker version compiled from this commit. +Also, if you change something inside of Woodpecker without commiting, it might fail because you need to recompile your plugin with this code. + +## Example structure + +```go +package main + +import ( + "context" + "net/http" + + "github.com/rs/zerolog" + "github.com/woodpecker-ci/woodpecker/server/forge" + forge_types "github.com/woodpecker-ci/woodpecker/server/forge/types" + "github.com/woodpecker-ci/woodpecker/server/model" + addon_types "github.com/woodpecker-ci/woodpecker/shared/addon/types" +) + +var Type = addon_types.TypeForge + +func Addon(logger zerolog.Logger, env []string) (forge.Forge, error) { + logger.Info().Msg("hello world from addon") + return &config{l: logger}, nil +} + +type config struct { + l zerolog.Logger +} + +// ... in this case, config must implement `forge.Forge`. You must directly use Woodpecker's packages - see imports above. +``` diff --git a/docs/docs/30-administration/75-addons/_category_.yml b/docs/docs/30-administration/75-addons/_category_.yml new file mode 100644 index 0000000000..4f56ea269d --- /dev/null +++ b/docs/docs/30-administration/75-addons/_category_.yml @@ -0,0 +1,3 @@ +label: 'Addons' +collapsible: true +collapsed: true diff --git a/shared/addon/addon.go b/shared/addon/addon.go new file mode 100644 index 0000000000..7d68958ae7 --- /dev/null +++ b/shared/addon/addon.go @@ -0,0 +1,64 @@ +package addon + +import ( + "errors" + "fmt" + "os" + "plugin" + "reflect" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + + "github.com/woodpecker-ci/woodpecker/shared/addon/types" +) + +var pluginCache = map[string]*plugin.Plugin{} + +type Addon[T any] struct { + Type types.Type + Value T +} + +func Load[T any](files []string, t types.Type) (*Addon[T], error) { + for _, file := range files { + if _, has := pluginCache[file]; !has { + p, err := plugin.Open(file) + if err != nil { + return nil, err + } + pluginCache[file] = p + } + + typeLookup, err := pluginCache[file].Lookup("Type") + if err != nil { + return nil, err + } + if addonType, is := typeLookup.(*types.Type); !is { + return nil, errors.New("addon type has incorrect type") + } else if *addonType != t { + continue + } + + mainLookup, err := pluginCache[file].Lookup("Addon") + if err != nil { + return nil, err + } + fmt.Println(reflect.TypeOf(mainLookup)) + main, is := mainLookup.(func(zerolog.Logger, []string) (T, error)) + if !is { + return nil, errors.New("addon main has incorrect type") + } + + mainOut, err := main(log.Logger, os.Environ()) + if err != nil { + return nil, err + } + return &Addon[T]{ + Type: t, + Value: mainOut, + }, nil + } + + return nil, nil +} diff --git a/shared/addon/test-addon/go.mod.bak b/shared/addon/test-addon/go.mod.bak new file mode 100644 index 0000000000..02adb20713 --- /dev/null +++ b/shared/addon/test-addon/go.mod.bak @@ -0,0 +1,16 @@ +module woodpecker/addon + +go 1.21.2 + +require ( + github.com/rs/zerolog v1.31.0 + github.com/woodpecker-ci/woodpecker v0.15.1-0.20231101160134-037703028e08 +) + +require ( + github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/robfig/cron v1.2.0 // indirect + golang.org/x/sys v0.13.0 // indirect +) diff --git a/shared/addon/test-addon/go.sum.bak b/shared/addon/test-addon/go.sum.bak new file mode 100644 index 0000000000..dc209af540 --- /dev/null +++ b/shared/addon/test-addon/go.sum.bak @@ -0,0 +1,45 @@ +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf h1:NrF81UtW8gG2LBGkXFQFqlfNnvMt9WdB46sfdJY4oqc= +github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= +github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf h1:Ab5yBsD/dXhFmgf2hX7T/YYr+VK0Df7SrIxyNztT9YE= +github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf/go.mod h1:+4SUDMvPlRMUPW5PlMTbxj3U5a4fWasBIbakUw7Kp6c= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/woodpecker-ci/woodpecker v0.15.1-0.20231101160134-037703028e08 h1:7Qn76mWt2bLcIxknTQGQlz4A68xumOTjjr2lNy4beFQ= +github.com/woodpecker-ci/woodpecker v0.15.1-0.20231101160134-037703028e08/go.mod h1:UO/p5VRlM/n3UsAVUPmnXAJbG4AObXbnD9HyROQHUfE= +github.com/woodpecker-ci/woodpecker v1.0.3 h1:T2hU00QHFtLvK6PDcMx/ll5ELBmgtqD6RYcPoIIjpAs= +github.com/woodpecker-ci/woodpecker v1.0.3/go.mod h1:BdsJwy1gmHvdaCb5diwcCVujsmgTG60ueuD+S2tQ7m0= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/shared/addon/test-addon/main.go b/shared/addon/test-addon/main.go new file mode 100644 index 0000000000..bb64dbe72f --- /dev/null +++ b/shared/addon/test-addon/main.go @@ -0,0 +1,145 @@ +package main + +import ( + "context" + "net/http" + + "github.com/rs/zerolog" + "github.com/woodpecker-ci/woodpecker/server/forge" + forge_types "github.com/woodpecker-ci/woodpecker/server/forge/types" + "github.com/woodpecker-ci/woodpecker/server/model" + addon_types "github.com/woodpecker-ci/woodpecker/shared/addon/types" +) + +var Type = addon_types.TypeForge + +func Addon(logger zerolog.Logger, env []string) (forge.Forge, error) { + logger.Error().Msg("hello world from addon") + return &config{l: logger}, nil +} + +type config struct { + l zerolog.Logger +} + +// Name returns the string name of this driver +func (c *config) Name() string { + c.l.Error().Msg("call Name") + return "addon-forge" +} + +// URL returns the root url of a configured forge +func (c *config) URL() string { + c.l.Error().Msg("call URL") + return "" +} + +// Login authenticates an account with Bitbucket using the oauth2 protocol. The +// Bitbucket account details are returned when the user is successfully authenticated. +func (c *config) Login(ctx context.Context, w http.ResponseWriter, req *http.Request) (*model.User, error) { + c.l.Error().Msg("call Login") + return nil, nil +} + +// Auth uses the Bitbucket oauth2 access token and refresh token to authenticate +// a session and return the Bitbucket account login. +func (c *config) Auth(ctx context.Context, token, secret string) (string, error) { + c.l.Error().Msg("call Auth") + return "", nil +} + +// Teams returns a list of all team membership for the Bitbucket account. +func (c *config) Teams(ctx context.Context, u *model.User) ([]*model.Team, error) { + c.l.Error().Msg("call Teams") + return nil, nil +} + +// Repo returns the named Bitbucket repository. +func (c *config) Repo(ctx context.Context, u *model.User, remoteID model.ForgeRemoteID, owner, name string) (*model.Repo, error) { + c.l.Error().Msg("call Repo") + return nil, nil +} + +// Repos returns a list of all repositories for Bitbucket account, including +// organization repositories. +func (c *config) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) { + c.l.Error().Msg("call Repos") + return nil, nil +} + +// File fetches the file from the Bitbucket repository and returns its contents. +func (c *config) File(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]byte, error) { + c.l.Error().Msg("call File") + return nil, nil +} + +// Dir fetches a folder from the bitbucket repository +func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*forge_types.FileMeta, error) { + c.l.Error().Msg("call Dir") + return nil, nil +} + +// Status creates a pipeline status for the Bitbucket commit. +func (c *config) Status(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, _ *model.Workflow) error { + c.l.Error().Msg("call Status") + return nil +} + +// Activate activates the repository by registering repository push hooks with +// the Bitbucket repository. Prior to registering hook, previously created hooks +// are deleted. +func (c *config) Activate(ctx context.Context, u *model.User, r *model.Repo, link string) error { + c.l.Error().Msg("call Activate") + return nil +} + +// Deactivate deactivates the repository be removing repository push hooks from +// the Bitbucket repository. +func (c *config) Deactivate(ctx context.Context, u *model.User, r *model.Repo, link string) error { + c.l.Error().Msg("call Deactivate") + return nil +} + +// Netrc returns a netrc file capable of authenticating Bitbucket requests and +// cloning Bitbucket repositories. +func (c *config) Netrc(u *model.User, _ *model.Repo) (*model.Netrc, error) { + c.l.Error().Msg("call Netrc") + return nil, nil +} + +// Branches returns the names of all branches for the named repository. +func (c *config) Branches(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]string, error) { + c.l.Error().Msg("call Branches") + return nil, nil +} + +// BranchHead returns the sha of the head (latest commit) of the specified branch +func (c *config) BranchHead(ctx context.Context, u *model.User, r *model.Repo, branch string) (string, error) { + c.l.Error().Msg("call BranchHead") + return "", nil +} + +// PullRequests returns the pull requests of the named repository. +func (c *config) PullRequests(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]*model.PullRequest, error) { + c.l.Error().Msg("call PullRequests") + return nil, nil +} + +// Hook parses the incoming Bitbucket hook and returns the Repository and +// Pipeline details. If the hook is unsupported nil values are returned. +func (c *config) Hook(_ context.Context, req *http.Request) (*model.Repo, *model.Pipeline, error) { + c.l.Error().Msg("call Hook") + return nil, nil, nil +} + +// OrgMembership returns if user is member of organization and if user +// is admin/owner in this organization. +func (c *config) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) { + c.l.Error().Msg("call OrgMembership") + return nil, nil +} + +func (c *config) Org(ctx context.Context, u *model.User, owner string) (*model.Org, error) { + c.l.Error().Msg("call Org") + return nil, nil +} diff --git a/shared/addon/types/types.go b/shared/addon/types/types.go new file mode 100644 index 0000000000..96331d280c --- /dev/null +++ b/shared/addon/types/types.go @@ -0,0 +1,7 @@ +package types + +type Type string + +const ( + TypeForge Type = "forge" +) From 205852feab610a09fc8b553fa8302952235ae485 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Wed, 1 Nov 2023 21:01:36 +0100 Subject: [PATCH 02/38] Support agent backends --- cmd/agent/agent.go | 28 +++++++++++++++---- cmd/agent/flags.go | 4 +++ .../30-administration/10-server-config.md | 6 ++++ .../docs/30-administration/15-agent-config.md | 6 ++++ .../30-administration/75-addons/00-addons.md | 7 ++++- .../75-addons/20-creating-addons.md | 13 +++++++-- shared/addon/types/types.go | 1 + 7 files changed, 57 insertions(+), 8 deletions(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 989e55c849..7de516a6f7 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -45,6 +45,8 @@ import ( "github.com/woodpecker-ci/woodpecker/pipeline/rpc" "github.com/woodpecker-ci/woodpecker/shared/utils" "github.com/woodpecker-ci/woodpecker/version" + "github.com/woodpecker-ci/woodpecker/shared/addon" + addonTypes "github.com/woodpecker-ci/woodpecker/shared/addon/types" ) func run(c *cli.Context) error { @@ -138,17 +140,14 @@ func run(c *cli.Context) error { return err } - backendCtx := context.WithValue(ctx, types.CliContext, c) - backend.Init(backendCtx) - var wg sync.WaitGroup parallel := c.Int("max-workflows") wg.Add(parallel) // new engine - engine, err := backend.FindEngine(backendCtx, c.String("backend-engine")) + backendCtx := context.WithValue(ctx, types.CliContext, c) + engine, err := getEngine(c, backendCtx) if err != nil { - log.Error().Err(err).Msgf("cannot find backend engine '%s'", c.String("backend-engine")) return err } @@ -230,6 +229,25 @@ func run(c *cli.Context) error { return nil } +func getEngine(c *cli.Context, backendCtx context.Context) (types.Engine, error) { + addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeForge) + if err != nil { + log.Error().Err(err).Msg("cannot load addon") + return nil, err + } + if addonEngine != nil { + return addonEngine.Value, nil + } + + backend.Init(backendCtx) + engine, err := backend.FindEngine(backendCtx, c.String("backend-engine")) + if err != nil { + log.Error().Err(err).Msgf("cannot find backend engine '%s'", c.String("backend-engine")) + return nil, err + } + return engine, nil +} + func runWithRetry(context *cli.Context) error { retryCount := context.Int("connect-retry-count") retryDelay := context.Duration("connect-retry-delay") diff --git a/cmd/agent/flags.go b/cmd/agent/flags.go index 481afd4864..b3e7743264 100644 --- a/cmd/agent/flags.go +++ b/cmd/agent/flags.go @@ -97,4 +97,8 @@ var flags = []cli.Flag{ Usage: "backend engine to run pipelines on", Value: "auto-detect", }, + &cli.StringSliceFlag{ + EnvVars: []string{"WOODPECKER_ADDONS"}, + Name: "addons", + }, } diff --git a/docs/docs/30-administration/10-server-config.md b/docs/docs/30-administration/10-server-config.md index 9cf2a879ac..0819973a2f 100644 --- a/docs/docs/30-administration/10-server-config.md +++ b/docs/docs/30-administration/10-server-config.md @@ -528,6 +528,12 @@ Supported variables: - `owner`: the repo's owner - `repo`: the repo's name +### WOODPECKER_ADDONS + +> Default: empty + +List of addon files. See [addons](./75-addons/00-addons.md). + --- ### `WOODPECKER_LIMIT_MEM_SWAP` diff --git a/docs/docs/30-administration/15-agent-config.md b/docs/docs/30-administration/15-agent-config.md index d9088e3aa3..4cc56d336f 100644 --- a/docs/docs/30-administration/15-agent-config.md +++ b/docs/docs/30-administration/15-agent-config.md @@ -180,6 +180,12 @@ Configures if the gRPC server certificate should be verified, only valid when `W Configures the backend engine to run pipelines on. Possible values are `auto-detect`, `docker`, `local` or `kubernetes`. +### WOODPECKER_ADDONS + +> Default: empty + +List of addon files. See [addons](./75-addons/00-addons.md). + ### `WOODPECKER_BACKEND_DOCKER_*` See [Docker backend configuration](./22-backends/10-docker.md#configuration) diff --git a/docs/docs/30-administration/75-addons/00-addons.md b/docs/docs/30-administration/75-addons/00-addons.md index 977e0c26ab..abd7d03e6e 100644 --- a/docs/docs/30-administration/75-addons/00-addons.md +++ b/docs/docs/30-administration/75-addons/00-addons.md @@ -2,7 +2,10 @@ To adapt Woodpecker to your needs beyond the [configuration](../10-server-config.md), Woodpecker has its own **addon** system, built ontop of [Go's internal plugin system](https://go.dev/pkg/plugin). -Currently, addons can only be used to integrate forges into Woodpecker that are not supported out-of-the-box. +Addons can be used for: + +- Forges +- Agent backends ## Usage @@ -20,3 +23,5 @@ services: ``` You may need to [mount the addon file as volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to access it from inside the Docker container. + +You can list multiple addons, Woodpecker will automatically determine their type. If you specify multiple addons with the same type, only the first one will be used. diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index f7e1ab2640..764ff3119a 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -22,7 +22,8 @@ Directly import Woodpecker's Go package (`github.com/woodpecker-ci/woodpecker`) | Plugin type | Return type | | --- | --- | -| `Forge` | `forge.Forge` | +| `Forge` | `"github.com/woodpecker-ci/woodpecker/server/forge".Forge` | +| `Engine` | `"github.com/woodpecker-ci/woodpecker/pipeline/backend/types".Engine` | ## Compiling @@ -40,6 +41,14 @@ Plugins must directly directly depend on Woodpecker's core (`github.com/woodpeck The plugin must have been built with **excatly the same code** as the Woodpecker instance you'd like to use it on. This means: If you build your plugin with a specific commit from Woodpecker `next`, you can likely only use it with the Woodpecker version compiled from this commit. Also, if you change something inside of Woodpecker without commiting, it might fail because you need to recompile your plugin with this code. +:::info +It is recommended to at least support the latest released version of Woodpecker. +::: + +### Compile for different versions + +As long as there were no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `github.com/woodpecker-ci/woodpecker` using `go get` before compiling. + ## Example structure ```go @@ -67,5 +76,5 @@ type config struct { l zerolog.Logger } -// ... in this case, config must implement `forge.Forge`. You must directly use Woodpecker's packages - see imports above. +// ... in this case, `config` must implement `forge.Forge`. You must directly use Woodpecker's packages - see imports above. ``` diff --git a/shared/addon/types/types.go b/shared/addon/types/types.go index 96331d280c..e6c5d1c153 100644 --- a/shared/addon/types/types.go +++ b/shared/addon/types/types.go @@ -4,4 +4,5 @@ type Type string const ( TypeForge Type = "forge" + TypeEngine Type = "engine" ) From 9e99f60038ae1e74bc62f37cee9643510d43517b Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 3 Nov 2023 21:17:10 +0100 Subject: [PATCH 03/38] improve/fix docs --- .../30-administration/75-addons/00-addons.md | 6 +++ .../75-addons/20-creating-addons.md | 40 ++++++++++--------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/docs/docs/30-administration/75-addons/00-addons.md b/docs/docs/30-administration/75-addons/00-addons.md index abd7d03e6e..5d07cce4b9 100644 --- a/docs/docs/30-administration/75-addons/00-addons.md +++ b/docs/docs/30-administration/75-addons/00-addons.md @@ -7,6 +7,12 @@ Addons can be used for: - Forges - Agent backends +## Restrictions + +Addons are restricted by how Go plugins work. This includes the following restrictions: +- only supported on Linux, FreeBSD and macOS +- addons must have been built for the correct Woodpecker version. If an addon is not provided specifically for this version, you likely won't be able to use it. + ## Usage To use an addon, download the addon version built for your Woodpecker version. Then, you can add the following to your configuration: diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index 764ff3119a..c8c4ff746f 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -4,42 +4,44 @@ Addons are written in Go. ## Writing your code -A plugin consists of two variables/functions in Go. +An addon consists of two variables/functions in Go. -1. The `Type` variable. Specifies the type of the plugin and must be directly accessed from `shared/addons/types/types.go`. -2. The `Addon` function which is the main point of your plugin. +1. The `Type` variable. Specifies the type of the addon and must be directly accessed from `shared/addons/types/types.go`. +2. The `Addon` function which is the main point of your addon. This function takes two arguments: 1. The zerolog logger you should use to log errors, warnings etc. 2. A slice of strings with the environment variables used as configuration. - The function returns two values: - 1. The actual plugin. For type reference see [table below](#return-types). + It returns two values: + 1. The actual addon. For type reference see [table below](#return-types). 2. An error. If this error is not `nil`, Woodpecker exits. -Directly import Woodpecker's Go package (`github.com/woodpecker-ci/woodpecker`) and use the interfaces and types defined there. +Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpecker`) and use the interfaces and types defined there. ### Return types -| Plugin type | Return type | +| Addon type | Return type | | --- | --- | -| `Forge` | `"github.com/woodpecker-ci/woodpecker/server/forge".Forge` | -| `Engine` | `"github.com/woodpecker-ci/woodpecker/pipeline/backend/types".Engine` | +| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/server/forge".Forge` | +| `Engine` | `"go.woodpecker-ci.org/woodpecker/woodpecker/pipeline/backend/types".Engine` | ## Compiling -After you wrote your addon code, compile your plugin: +After you wrote your addon code, compile your addon: ```sh go build -buildmode plugin ``` -The output file is your plugin which is now ready to use. +The output file is your addon which is now ready to use. ## Restrictions -Plugins must directly directly depend on Woodpecker's core (`github.com/woodpecker-ci/woodpecker`). -The plugin must have been built with **excatly the same code** as the Woodpecker instance you'd like to use it on. This means: If you build your plugin with a specific commit from Woodpecker `next`, you can likely only use it with the Woodpecker version compiled from this commit. -Also, if you change something inside of Woodpecker without commiting, it might fail because you need to recompile your plugin with this code. +Addons must directly directly depend on Woodpecker's core (`go.woodpecker-ci.org/woodpecker/woodpecker`). +The addon must have been built with **excatly the same code** as the Woodpecker instance you'd like to use it on. This means: If you build your addon with a specific commit from Woodpecker `next`, you can likely only use it with the Woodpecker version compiled from this commit. +Also, if you change something inside of Woodpecker without commiting, it might fail because you need to recompile your addon with this code. + +In addition to this, addons are only supported on Linux, FreeBSD and macOS. :::info It is recommended to at least support the latest released version of Woodpecker. @@ -47,7 +49,7 @@ It is recommended to at least support the latest released version of Woodpecker. ### Compile for different versions -As long as there were no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `github.com/woodpecker-ci/woodpecker` using `go get` before compiling. +As long as there were no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `go.woodpecker-ci.org/woodpecker/woodpecker` using `go get` before compiling. ## Example structure @@ -59,10 +61,10 @@ import ( "net/http" "github.com/rs/zerolog" - "github.com/woodpecker-ci/woodpecker/server/forge" - forge_types "github.com/woodpecker-ci/woodpecker/server/forge/types" - "github.com/woodpecker-ci/woodpecker/server/model" - addon_types "github.com/woodpecker-ci/woodpecker/shared/addon/types" + "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge" + forge_types "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge/types" + "go.woodpecker-ci.org/woodpecker/woodpecker/server/model" + addon_types "go.woodpecker-ci.org/woodpecker/woodpecker/shared/addon/types" ) var Type = addon_types.TypeForge From 7b82fabf661ab0672ec1d6af00f2b8fe25f6f95c Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 5 Nov 2023 12:56:21 +0100 Subject: [PATCH 04/38] remove old gomod --- shared/addon/test-addon/go.mod.bak | 16 ----------- shared/addon/test-addon/go.sum.bak | 45 ------------------------------ 2 files changed, 61 deletions(-) delete mode 100644 shared/addon/test-addon/go.mod.bak delete mode 100644 shared/addon/test-addon/go.sum.bak diff --git a/shared/addon/test-addon/go.mod.bak b/shared/addon/test-addon/go.mod.bak deleted file mode 100644 index 02adb20713..0000000000 --- a/shared/addon/test-addon/go.mod.bak +++ /dev/null @@ -1,16 +0,0 @@ -module woodpecker/addon - -go 1.21.2 - -require ( - github.com/rs/zerolog v1.31.0 - github.com/woodpecker-ci/woodpecker v0.15.1-0.20231101160134-037703028e08 -) - -require ( - github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/robfig/cron v1.2.0 // indirect - golang.org/x/sys v0.13.0 // indirect -) diff --git a/shared/addon/test-addon/go.sum.bak b/shared/addon/test-addon/go.sum.bak deleted file mode 100644 index dc209af540..0000000000 --- a/shared/addon/test-addon/go.sum.bak +++ /dev/null @@ -1,45 +0,0 @@ -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf h1:NrF81UtW8gG2LBGkXFQFqlfNnvMt9WdB46sfdJY4oqc= -github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= -github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf h1:Ab5yBsD/dXhFmgf2hX7T/YYr+VK0Df7SrIxyNztT9YE= -github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf/go.mod h1:+4SUDMvPlRMUPW5PlMTbxj3U5a4fWasBIbakUw7Kp6c= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= -github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= -github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/woodpecker-ci/woodpecker v0.15.1-0.20231101160134-037703028e08 h1:7Qn76mWt2bLcIxknTQGQlz4A68xumOTjjr2lNy4beFQ= -github.com/woodpecker-ci/woodpecker v0.15.1-0.20231101160134-037703028e08/go.mod h1:UO/p5VRlM/n3UsAVUPmnXAJbG4AObXbnD9HyROQHUfE= -github.com/woodpecker-ci/woodpecker v1.0.3 h1:T2hU00QHFtLvK6PDcMx/ll5ELBmgtqD6RYcPoIIjpAs= -github.com/woodpecker-ci/woodpecker v1.0.3/go.mod h1:BdsJwy1gmHvdaCb5diwcCVujsmgTG60ueuD+S2tQ7m0= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From cbcd3017c0944bc348ab3a15face8abd4fa5e204 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 5 Nov 2023 12:01:46 +0000 Subject: [PATCH 05/38] [pre-commit.ci] auto fixes from pre-commit.com hooks [CI SKIP] for more information, see https://pre-commit.ci --- docs/docs/30-administration/75-addons/20-creating-addons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index c8c4ff746f..c9b6f2d896 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -11,7 +11,7 @@ An addon consists of two variables/functions in Go. This function takes two arguments: 1. The zerolog logger you should use to log errors, warnings etc. 2. A slice of strings with the environment variables used as configuration. - + It returns two values: 1. The actual addon. For type reference see [table below](#return-types). 2. An error. If this error is not `nil`, Woodpecker exits. From b86f8d2b84a0f0af926027da060fa42f287300d1 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 7 Nov 2023 16:57:38 +0100 Subject: [PATCH 06/38] fix imports --- cmd/agent/agent.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 5649998fce..9587513d72 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -44,8 +44,8 @@ import ( "go.woodpecker-ci.org/woodpecker/pipeline/backend/types" "go.woodpecker-ci.org/woodpecker/pipeline/rpc" "go.woodpecker-ci.org/woodpecker/shared/utils" - "go.woodpecker-ci.org/shared/addon" - addonTypes "go.woodpecker-ci.org/shared/addon/types" + "go.woodpecker-ci.org/woodpecker/shared/addon" + addonTypes "go.woodpecker-ci.org/woodpecker/shared/addon/types" "go.woodpecker-ci.org/woodpecker/version" ) From c8527fe2cb142d4929bd92a2081846d78817f668 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 7 Nov 2023 17:02:25 +0100 Subject: [PATCH 07/38] fix imports --- shared/addon/test-addon/main.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shared/addon/test-addon/main.go b/shared/addon/test-addon/main.go index bb64dbe72f..df19d00a73 100644 --- a/shared/addon/test-addon/main.go +++ b/shared/addon/test-addon/main.go @@ -5,10 +5,10 @@ import ( "net/http" "github.com/rs/zerolog" - "github.com/woodpecker-ci/woodpecker/server/forge" - forge_types "github.com/woodpecker-ci/woodpecker/server/forge/types" - "github.com/woodpecker-ci/woodpecker/server/model" - addon_types "github.com/woodpecker-ci/woodpecker/shared/addon/types" + "go.woodpecker-ci.org/woodpecker/server/forge" + forge_types "go.woodpecker-ci.org/woodpecker/server/forge/types" + "go.woodpecker-ci.org/woodpecker/server/model" + addon_types "go.woodpecker-ci.org/woodpecker/shared/addon/types" ) var Type = addon_types.TypeForge From 9728118b18abd9c0c7efac5d0dd79c5a3162b879 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 7 Nov 2023 17:07:00 +0100 Subject: [PATCH 08/38] fix style --- .../75-addons/20-creating-addons.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index c9b6f2d896..debcde3978 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -57,25 +57,25 @@ As long as there were no changes to Woodpecker's interfaces or they are backward package main import ( - "context" - "net/http" - - "github.com/rs/zerolog" - "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge" - forge_types "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge/types" - "go.woodpecker-ci.org/woodpecker/woodpecker/server/model" - addon_types "go.woodpecker-ci.org/woodpecker/woodpecker/shared/addon/types" + "context" + "net/http" + + "github.com/rs/zerolog" + "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge" + forge_types "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge/types" + "go.woodpecker-ci.org/woodpecker/woodpecker/server/model" + addon_types "go.woodpecker-ci.org/woodpecker/woodpecker/shared/addon/types" ) var Type = addon_types.TypeForge func Addon(logger zerolog.Logger, env []string) (forge.Forge, error) { - logger.Info().Msg("hello world from addon") - return &config{l: logger}, nil + logger.Info().Msg("hello world from addon") + return &config{l: logger}, nil } type config struct { - l zerolog.Logger + l zerolog.Logger } // ... in this case, `config` must implement `forge.Forge`. You must directly use Woodpecker's packages - see imports above. From 6111df883362ea3f6db9c76de619847e76268c90 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 7 Nov 2023 17:08:12 +0100 Subject: [PATCH 09/38] add missing newline --- docs/docs/30-administration/75-addons/00-addons.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/30-administration/75-addons/00-addons.md b/docs/docs/30-administration/75-addons/00-addons.md index 5d07cce4b9..47677d1af4 100644 --- a/docs/docs/30-administration/75-addons/00-addons.md +++ b/docs/docs/30-administration/75-addons/00-addons.md @@ -10,6 +10,7 @@ Addons can be used for: ## Restrictions Addons are restricted by how Go plugins work. This includes the following restrictions: + - only supported on Linux, FreeBSD and macOS - addons must have been built for the correct Woodpecker version. If an addon is not provided specifically for this version, you likely won't be able to use it. From f5bbbbe324d4de829870ae56b12af06eaa873974 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 06:53:23 +0000 Subject: [PATCH 10/38] [pre-commit.ci] auto fixes from pre-commit.com hooks [CI SKIP] for more information, see https://pre-commit.ci --- .../75-addons/20-creating-addons.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index debcde3978..1749dfe592 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -9,21 +9,23 @@ An addon consists of two variables/functions in Go. 1. The `Type` variable. Specifies the type of the addon and must be directly accessed from `shared/addons/types/types.go`. 2. The `Addon` function which is the main point of your addon. This function takes two arguments: - 1. The zerolog logger you should use to log errors, warnings etc. - 2. A slice of strings with the environment variables used as configuration. + + 1. The zerolog logger you should use to log errors, warnings etc. + 2. A slice of strings with the environment variables used as configuration. It returns two values: - 1. The actual addon. For type reference see [table below](#return-types). - 2. An error. If this error is not `nil`, Woodpecker exits. + + 1. The actual addon. For type reference see [table below](#return-types). + 2. An error. If this error is not `nil`, Woodpecker exits. Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpecker`) and use the interfaces and types defined there. ### Return types -| Addon type | Return type | -| --- | --- | -| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/server/forge".Forge` | -| `Engine` | `"go.woodpecker-ci.org/woodpecker/woodpecker/pipeline/backend/types".Engine` | +| Addon type | Return type | +| ---------- | ---------------------------------------------------------------------------- | +| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/server/forge".Forge` | +| `Engine` | `"go.woodpecker-ci.org/woodpecker/woodpecker/pipeline/backend/types".Engine` | ## Compiling From 91afda4458fa3c5b0d94e8a5fb05e77216669778 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Wed, 22 Nov 2023 15:00:30 +0100 Subject: [PATCH 11/38] some move to hashicorp/go-plugin --- cmd/agent/agent.go | 4 +- go.mod | 4 ++ go.sum | 48 +++++++++++++++++++ shared/addon/addon.go | 85 +++++++++++++++++---------------- shared/addon/execute/execute.go | 17 +++++++ shared/addon/rpc/client.go | 34 +++++++++++++ shared/addon/rpc/plugin.go | 27 +++++++++++ shared/addon/rpc/server.go | 20 ++++++++ shared/addon/test-addon/main.go | 17 ++++++- shared/addon/types/addon.go | 6 +++ shared/addon/types/types.go | 2 +- 11 files changed, 218 insertions(+), 46 deletions(-) create mode 100644 shared/addon/execute/execute.go create mode 100644 shared/addon/rpc/client.go create mode 100644 shared/addon/rpc/plugin.go create mode 100644 shared/addon/rpc/server.go create mode 100644 shared/addon/types/addon.go diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 9587513d72..3d313ad39b 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -43,9 +43,9 @@ import ( "go.woodpecker-ci.org/woodpecker/pipeline/backend" "go.woodpecker-ci.org/woodpecker/pipeline/backend/types" "go.woodpecker-ci.org/woodpecker/pipeline/rpc" - "go.woodpecker-ci.org/woodpecker/shared/utils" "go.woodpecker-ci.org/woodpecker/shared/addon" addonTypes "go.woodpecker-ci.org/woodpecker/shared/addon/types" + "go.woodpecker-ci.org/woodpecker/shared/utils" "go.woodpecker-ci.org/woodpecker/version" ) @@ -247,7 +247,7 @@ func run(c *cli.Context) error { } func getEngine(c *cli.Context, backendCtx context.Context) (types.Engine, error) { - addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeForge) + addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeEngine) if err != nil { log.Error().Err(err).Msg("cannot load addon") return nil, err diff --git a/go.mod b/go.mod index fc2c9f07f8..39d3e23f24 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/google/tink/go v1.7.0 github.com/google/uuid v1.4.0 github.com/gorilla/securecookie v1.1.2 + github.com/hashicorp/go-plugin v1.4.3 github.com/jellydator/ttlcache/v3 v3.1.0 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 @@ -104,6 +105,7 @@ require ( github.com/hashicorp/go-hclog v1.2.0 // indirect github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/go-version v1.5.0 // indirect + github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -118,10 +120,12 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mholt/acmez v1.2.0 // indirect github.com/miekg/dns v1.1.55 // indirect + github.com/mitchellh/go-testing-interface v1.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oklog/run v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect diff --git a/go.sum b/go.sum index 6edd89e750..119f8f8679 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= code.gitea.io/sdk/gitea v0.16.0 h1:gAfssETO1Hv9QbE+/nhWu7EjoFQYKt6kPoyDytQgw00= code.gitea.io/sdk/gitea v0.16.0/go.mod h1:ndkDk99BnfiUCCYEUhpNzi0lpmApXlwRFqClBlOlEBg= codeberg.org/6543/go-yaml2json v1.0.0 h1:heGqo9VEi7gY2yNqjj7X4ADs5nzlFIbGsJtgYDLrnig= @@ -39,6 +40,7 @@ github.com/caddyserver/certmagic v0.19.2 h1:HZd1AKLx4592MalEGQS39DKs2ZOAJCEM/xYP github.com/caddyserver/certmagic v0.19.2/go.mod h1:fsL01NomQ6N+kE2j37ZCnig2MFosG+MIO4ztnmG/zz8= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= @@ -47,6 +49,7 @@ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583j github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -84,6 +87,8 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -147,7 +152,12 @@ github.com/golang-jwt/jwt/v5 v5.1.0 h1:UGKbA/IPjtS6zLcdB7i5TyACMgSbOTiR8qzXgw8HW github.com/golang-jwt/jwt/v5 v5.1.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= @@ -184,12 +194,17 @@ github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pw github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-plugin v1.4.3 h1:DXmvivbWD5qdiBts9TpBC7BYL1Aia5sxbRgQB+v6UZM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-version v1.5.0 h1:O293SZ2Eg+AAYijkVK3jR786Am1bhDEh2GHT0tIVE5E= github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -236,6 +251,8 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jellydator/ttlcache/v3 v3.1.0 h1:0gPFG0IHHP6xyUyXq+JaD8fwkDCqgqwohXNJBcYE71g= github.com/jellydator/ttlcache/v3 v3.1.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= +github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= +github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -306,6 +323,9 @@ github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30= github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/moby/moby v24.0.7+incompatible h1:RrVT5IXBn85mRtFKP+gFwVLCcnNPZIgN3NVRJG9Le+4= github.com/moby/moby v24.0.7+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -323,6 +343,8 @@ github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1n github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -348,6 +370,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= @@ -476,6 +499,10 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -484,7 +511,11 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -499,9 +530,11 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -509,6 +542,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -557,8 +591,11 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -578,10 +615,19 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= @@ -614,6 +660,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= diff --git a/shared/addon/addon.go b/shared/addon/addon.go index eaacc0a29d..058eed13e0 100644 --- a/shared/addon/addon.go +++ b/shared/addon/addon.go @@ -2,63 +2,66 @@ package addon import ( "errors" - "fmt" "os" - "plugin" - "reflect" + "os/exec" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" + "github.com/hashicorp/go-plugin" + "go.woodpecker-ci.org/woodpecker/shared/addon/rpc" "go.woodpecker-ci.org/woodpecker/shared/addon/types" ) -var pluginCache = map[string]*plugin.Plugin{} - type Addon[T any] struct { Type types.Type Value T } func Load[T any](files []string, t types.Type) (*Addon[T], error) { - for _, file := range files { - if _, has := pluginCache[file]; !has { - p, err := plugin.Open(file) - if err != nil { - return nil, err - } - pluginCache[file] = p - } + //for _, file := range files { + c := plugin.NewClient(&plugin.ClientConfig{ + HandshakeConfig: rpc.HandshakeConfig, + Plugins: plugin.PluginSet{ + string(t): &rpc.AddonPlugin[T]{}, + }, + Cmd: exec.Command(files[0]), + Logger: nil, // TODO zerolog wrapper + }) - typeLookup, err := pluginCache[file].Lookup("Type") - if err != nil { - return nil, err - } - if addonType, is := typeLookup.(*types.Type); !is { - return nil, errors.New("addon type has incorrect type") - } else if *addonType != t { - continue - } + rpcClient, err := c.Client() + if err != nil { + return nil, err + } - mainLookup, err := pluginCache[file].Lookup("Addon") - if err != nil { - return nil, err - } - fmt.Println(reflect.TypeOf(mainLookup)) - main, is := mainLookup.(func(zerolog.Logger, []string) (T, error)) - if !is { - return nil, errors.New("addon main has incorrect type") - } + raw, err := rpcClient.Dispense(string(t)) + if err != nil { + return nil, err + } + + addon, ok := raw.(types.Addon[T]) + if !ok { + return nil, errors.New("addon has bad type") + } - mainOut, err := main(log.Logger, os.Environ()) - if err != nil { - return nil, err - } - return &Addon[T]{ - Type: t, - Value: mainOut, - }, nil + if addon.Type() != t { + //continue + return nil, nil } + mainOut, err := addon.Addon(os.Environ()) + if err != nil { + return nil, err + } + + //mainOutTyped, is := mainOut.(T) + //if !is { + //return nil, errors.New("main output has bad type") + //} + + return &Addon[T]{ + Type: t, + Value: mainOut, + }, nil + //} + return nil, nil } diff --git a/shared/addon/execute/execute.go b/shared/addon/execute/execute.go new file mode 100644 index 0000000000..ddd55e7790 --- /dev/null +++ b/shared/addon/execute/execute.go @@ -0,0 +1,17 @@ +package execute + +import ( + "github.com/hashicorp/go-plugin" + + "go.woodpecker-ci.org/woodpecker/shared/addon/rpc" + addonTypes "go.woodpecker-ci.org/woodpecker/shared/addon/types" +) + +func Execute[T any](addon addonTypes.Addon[T]) { + plugin.Serve(&plugin.ServeConfig{ + HandshakeConfig: rpc.HandshakeConfig, + Plugins: plugin.PluginSet{ + string(addon.Type()): &rpc.AddonPlugin[T]{Impl: addon}, + }, + }) +} diff --git a/shared/addon/rpc/client.go b/shared/addon/rpc/client.go new file mode 100644 index 0000000000..7006008175 --- /dev/null +++ b/shared/addon/rpc/client.go @@ -0,0 +1,34 @@ +package rpc + +import ( + "net/rpc" + + "github.com/rs/zerolog/log" + + "go.woodpecker-ci.org/woodpecker/shared/addon/types" +) + +type AddonRPCClient[T any] struct { + client *rpc.Client +} + +func (a *AddonRPCClient[T]) Type() types.Type { + var resp types.Type + err := a.client.Call("Plugin.Type", new(any), &resp) + if err != nil { + log.Error().Err(err).Msg("could not get addon type") + return "" + } + + return resp +} + +func (a *AddonRPCClient[T]) Addon(env []string) (T, error) { + var resp T + err := a.client.Call("Plugin.Addon", map[string]any{ + //"logger": logger, + "env": env, + }, &resp) + + return resp, err +} diff --git a/shared/addon/rpc/plugin.go b/shared/addon/rpc/plugin.go new file mode 100644 index 0000000000..c0893036d2 --- /dev/null +++ b/shared/addon/rpc/plugin.go @@ -0,0 +1,27 @@ +package rpc + +import ( + "net/rpc" + + "github.com/hashicorp/go-plugin" + + "go.woodpecker-ci.org/woodpecker/shared/addon/types" +) + +var HandshakeConfig = plugin.HandshakeConfig{ + ProtocolVersion: 1, + MagicCookieKey: "woodpecker_plugin_key", + MagicCookieValue: "woodpecker_plugin_value", +} + +type AddonPlugin[T any] struct { + Impl types.Addon[T] +} + +func (a *AddonPlugin[T]) Server(_ *plugin.MuxBroker) (interface{}, error) { + return &AddonRPCServer[T]{Impl: a.Impl}, nil +} + +func (*AddonPlugin[T]) Client(_ *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { + return &AddonRPCClient[T]{client: c}, nil +} diff --git a/shared/addon/rpc/server.go b/shared/addon/rpc/server.go new file mode 100644 index 0000000000..c350568e37 --- /dev/null +++ b/shared/addon/rpc/server.go @@ -0,0 +1,20 @@ +package rpc + +import ( + "go.woodpecker-ci.org/woodpecker/shared/addon/types" +) + +type AddonRPCServer[T any] struct { + Impl types.Addon[T] +} + +func (a *AddonRPCServer[T]) Type(_ interface{}, resp *types.Type) error { + *resp = a.Impl.Type() + return nil +} + +func (a *AddonRPCServer[T]) Addon(args map[string]interface{}, resp *T) error { + addon, err := a.Impl.Addon( /*args["logger"].(zerolog.Logger), */ args["env"].([]string)) + *resp = addon + return err +} diff --git a/shared/addon/test-addon/main.go b/shared/addon/test-addon/main.go index df19d00a73..f176c52452 100644 --- a/shared/addon/test-addon/main.go +++ b/shared/addon/test-addon/main.go @@ -5,15 +5,28 @@ import ( "net/http" "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "go.woodpecker-ci.org/woodpecker/server/forge" forge_types "go.woodpecker-ci.org/woodpecker/server/forge/types" "go.woodpecker-ci.org/woodpecker/server/model" + "go.woodpecker-ci.org/woodpecker/shared/addon/execute" addon_types "go.woodpecker-ci.org/woodpecker/shared/addon/types" ) -var Type = addon_types.TypeForge +func main() { + execute.Execute[forge.Forge](&TestAddon{}) +} + +type TestAddon struct { +} + +func (a *TestAddon) Type() addon_types.Type { + return addon_types.TypeForge +} -func Addon(logger zerolog.Logger, env []string) (forge.Forge, error) { +func (a *TestAddon) Addon(env []string) (forge.Forge, error) { + logger := log.Logger // TODO send via rpc logger.Error().Msg("hello world from addon") return &config{l: logger}, nil } diff --git a/shared/addon/types/addon.go b/shared/addon/types/addon.go new file mode 100644 index 0000000000..e838f00abe --- /dev/null +++ b/shared/addon/types/addon.go @@ -0,0 +1,6 @@ +package types + +type Addon[T any] interface { + Type() Type + Addon([]string) (T, error) +} diff --git a/shared/addon/types/types.go b/shared/addon/types/types.go index e6c5d1c153..6835b01609 100644 --- a/shared/addon/types/types.go +++ b/shared/addon/types/types.go @@ -3,6 +3,6 @@ package types type Type string const ( - TypeForge Type = "forge" + TypeForge Type = "forge" TypeEngine Type = "engine" ) From 11ac9245f2e8981868a1784434b70d415596a047 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 23 Nov 2023 07:44:24 +0100 Subject: [PATCH 12/38] some more tests --- shared/addon/addon.go | 2 +- shared/addon/rpc/client.go | 2 ++ shared/addon/rpc/plugin.go | 8 +++--- shared/addon/rpc/server.go | 9 +++++-- shared/addon/test-addon/main.go | 47 +++++++++++++++------------------ 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/shared/addon/addon.go b/shared/addon/addon.go index 058eed13e0..dfdb717d8a 100644 --- a/shared/addon/addon.go +++ b/shared/addon/addon.go @@ -63,5 +63,5 @@ func Load[T any](files []string, t types.Type) (*Addon[T], error) { }, nil //} - return nil, nil + //return nil, nil } diff --git a/shared/addon/rpc/client.go b/shared/addon/rpc/client.go index 7006008175..d1e9fde0d8 100644 --- a/shared/addon/rpc/client.go +++ b/shared/addon/rpc/client.go @@ -3,6 +3,7 @@ package rpc import ( "net/rpc" + "github.com/hashicorp/go-plugin" "github.com/rs/zerolog/log" "go.woodpecker-ci.org/woodpecker/shared/addon/types" @@ -10,6 +11,7 @@ import ( type AddonRPCClient[T any] struct { client *rpc.Client + broker *plugin.MuxBroker } func (a *AddonRPCClient[T]) Type() types.Type { diff --git a/shared/addon/rpc/plugin.go b/shared/addon/rpc/plugin.go index c0893036d2..64b802e151 100644 --- a/shared/addon/rpc/plugin.go +++ b/shared/addon/rpc/plugin.go @@ -18,10 +18,10 @@ type AddonPlugin[T any] struct { Impl types.Addon[T] } -func (a *AddonPlugin[T]) Server(_ *plugin.MuxBroker) (interface{}, error) { - return &AddonRPCServer[T]{Impl: a.Impl}, nil +func (a *AddonPlugin[T]) Server(broker *plugin.MuxBroker) (interface{}, error) { + return &AddonRPCServer[T]{Impl: a.Impl, broker: broker}, nil } -func (*AddonPlugin[T]) Client(_ *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { - return &AddonRPCClient[T]{client: c}, nil +func (*AddonPlugin[T]) Client(broker *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { + return &AddonRPCClient[T]{broker: broker, client: c}, nil } diff --git a/shared/addon/rpc/server.go b/shared/addon/rpc/server.go index c350568e37..249b5c53bb 100644 --- a/shared/addon/rpc/server.go +++ b/shared/addon/rpc/server.go @@ -1,11 +1,16 @@ package rpc import ( + //"net/rpc" + + "github.com/hashicorp/go-plugin" + "go.woodpecker-ci.org/woodpecker/shared/addon/types" ) type AddonRPCServer[T any] struct { - Impl types.Addon[T] + Impl types.Addon[T] + broker *plugin.MuxBroker } func (a *AddonRPCServer[T]) Type(_ interface{}, resp *types.Type) error { @@ -14,7 +19,7 @@ func (a *AddonRPCServer[T]) Type(_ interface{}, resp *types.Type) error { } func (a *AddonRPCServer[T]) Addon(args map[string]interface{}, resp *T) error { - addon, err := a.Impl.Addon( /*args["logger"].(zerolog.Logger), */ args["env"].([]string)) + addon, err := a.Impl.Addon(args["env"].([]string)) *resp = addon return err } diff --git a/shared/addon/test-addon/main.go b/shared/addon/test-addon/main.go index f176c52452..c6a968c3af 100644 --- a/shared/addon/test-addon/main.go +++ b/shared/addon/test-addon/main.go @@ -2,11 +2,9 @@ package main import ( "context" + "log/slog" "net/http" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "go.woodpecker-ci.org/woodpecker/server/forge" forge_types "go.woodpecker-ci.org/woodpecker/server/forge/types" "go.woodpecker-ci.org/woodpecker/server/model" @@ -26,75 +24,72 @@ func (a *TestAddon) Type() addon_types.Type { } func (a *TestAddon) Addon(env []string) (forge.Forge, error) { - logger := log.Logger // TODO send via rpc - logger.Error().Msg("hello world from addon") - return &config{l: logger}, nil + return &config{}, nil } type config struct { - l zerolog.Logger } // Name returns the string name of this driver func (c *config) Name() string { - c.l.Error().Msg("call Name") + slog.Error("call Name") return "addon-forge" } // URL returns the root url of a configured forge func (c *config) URL() string { - c.l.Error().Msg("call URL") + slog.Error("call URL") return "" } // Login authenticates an account with Bitbucket using the oauth2 protocol. The // Bitbucket account details are returned when the user is successfully authenticated. func (c *config) Login(ctx context.Context, w http.ResponseWriter, req *http.Request) (*model.User, error) { - c.l.Error().Msg("call Login") + slog.Error("call Login") return nil, nil } // Auth uses the Bitbucket oauth2 access token and refresh token to authenticate // a session and return the Bitbucket account login. func (c *config) Auth(ctx context.Context, token, secret string) (string, error) { - c.l.Error().Msg("call Auth") + slog.Error("call Auth") return "", nil } // Teams returns a list of all team membership for the Bitbucket account. func (c *config) Teams(ctx context.Context, u *model.User) ([]*model.Team, error) { - c.l.Error().Msg("call Teams") + slog.Error("call Teams") return nil, nil } // Repo returns the named Bitbucket repository. func (c *config) Repo(ctx context.Context, u *model.User, remoteID model.ForgeRemoteID, owner, name string) (*model.Repo, error) { - c.l.Error().Msg("call Repo") + slog.Error("call Repo") return nil, nil } // Repos returns a list of all repositories for Bitbucket account, including // organization repositories. func (c *config) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) { - c.l.Error().Msg("call Repos") + slog.Error("call Repos") return nil, nil } // File fetches the file from the Bitbucket repository and returns its contents. func (c *config) File(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]byte, error) { - c.l.Error().Msg("call File") + slog.Error("call File") return nil, nil } // Dir fetches a folder from the bitbucket repository func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*forge_types.FileMeta, error) { - c.l.Error().Msg("call Dir") + slog.Error("call Dir") return nil, nil } // Status creates a pipeline status for the Bitbucket commit. func (c *config) Status(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, _ *model.Workflow) error { - c.l.Error().Msg("call Status") + slog.Error("call Status") return nil } @@ -102,57 +97,57 @@ func (c *config) Status(ctx context.Context, user *model.User, repo *model.Repo, // the Bitbucket repository. Prior to registering hook, previously created hooks // are deleted. func (c *config) Activate(ctx context.Context, u *model.User, r *model.Repo, link string) error { - c.l.Error().Msg("call Activate") + slog.Error("call Activate") return nil } // Deactivate deactivates the repository be removing repository push hooks from // the Bitbucket repository. func (c *config) Deactivate(ctx context.Context, u *model.User, r *model.Repo, link string) error { - c.l.Error().Msg("call Deactivate") + slog.Error("call Deactivate") return nil } // Netrc returns a netrc file capable of authenticating Bitbucket requests and // cloning Bitbucket repositories. func (c *config) Netrc(u *model.User, _ *model.Repo) (*model.Netrc, error) { - c.l.Error().Msg("call Netrc") + slog.Error("call Netrc") return nil, nil } // Branches returns the names of all branches for the named repository. func (c *config) Branches(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]string, error) { - c.l.Error().Msg("call Branches") + slog.Error("call Branches") return nil, nil } // BranchHead returns the sha of the head (latest commit) of the specified branch func (c *config) BranchHead(ctx context.Context, u *model.User, r *model.Repo, branch string) (string, error) { - c.l.Error().Msg("call BranchHead") + slog.Error("call BranchHead") return "", nil } // PullRequests returns the pull requests of the named repository. func (c *config) PullRequests(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]*model.PullRequest, error) { - c.l.Error().Msg("call PullRequests") + slog.Error("call PullRequests") return nil, nil } // Hook parses the incoming Bitbucket hook and returns the Repository and // Pipeline details. If the hook is unsupported nil values are returned. func (c *config) Hook(_ context.Context, req *http.Request) (*model.Repo, *model.Pipeline, error) { - c.l.Error().Msg("call Hook") + slog.Error("call Hook") return nil, nil, nil } // OrgMembership returns if user is member of organization and if user // is admin/owner in this organization. func (c *config) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) { - c.l.Error().Msg("call OrgMembership") + slog.Error("call OrgMembership") return nil, nil } func (c *config) Org(ctx context.Context, u *model.User, owner string) (*model.Org, error) { - c.l.Error().Msg("call Org") + slog.Error("call Org") return nil, nil } From b21a44583f426c7d13163930b8acc57b22359b31 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 17:08:00 +0100 Subject: [PATCH 13/38] Revert "some more tests" This reverts commit 11ac9245f2e8981868a1784434b70d415596a047. --- shared/addon/addon.go | 2 +- shared/addon/rpc/client.go | 2 -- shared/addon/rpc/plugin.go | 8 +++--- shared/addon/rpc/server.go | 9 ++----- shared/addon/test-addon/main.go | 47 ++++++++++++++++++--------------- 5 files changed, 33 insertions(+), 35 deletions(-) diff --git a/shared/addon/addon.go b/shared/addon/addon.go index dfdb717d8a..058eed13e0 100644 --- a/shared/addon/addon.go +++ b/shared/addon/addon.go @@ -63,5 +63,5 @@ func Load[T any](files []string, t types.Type) (*Addon[T], error) { }, nil //} - //return nil, nil + return nil, nil } diff --git a/shared/addon/rpc/client.go b/shared/addon/rpc/client.go index d1e9fde0d8..7006008175 100644 --- a/shared/addon/rpc/client.go +++ b/shared/addon/rpc/client.go @@ -3,7 +3,6 @@ package rpc import ( "net/rpc" - "github.com/hashicorp/go-plugin" "github.com/rs/zerolog/log" "go.woodpecker-ci.org/woodpecker/shared/addon/types" @@ -11,7 +10,6 @@ import ( type AddonRPCClient[T any] struct { client *rpc.Client - broker *plugin.MuxBroker } func (a *AddonRPCClient[T]) Type() types.Type { diff --git a/shared/addon/rpc/plugin.go b/shared/addon/rpc/plugin.go index 64b802e151..c0893036d2 100644 --- a/shared/addon/rpc/plugin.go +++ b/shared/addon/rpc/plugin.go @@ -18,10 +18,10 @@ type AddonPlugin[T any] struct { Impl types.Addon[T] } -func (a *AddonPlugin[T]) Server(broker *plugin.MuxBroker) (interface{}, error) { - return &AddonRPCServer[T]{Impl: a.Impl, broker: broker}, nil +func (a *AddonPlugin[T]) Server(_ *plugin.MuxBroker) (interface{}, error) { + return &AddonRPCServer[T]{Impl: a.Impl}, nil } -func (*AddonPlugin[T]) Client(broker *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { - return &AddonRPCClient[T]{broker: broker, client: c}, nil +func (*AddonPlugin[T]) Client(_ *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { + return &AddonRPCClient[T]{client: c}, nil } diff --git a/shared/addon/rpc/server.go b/shared/addon/rpc/server.go index 249b5c53bb..c350568e37 100644 --- a/shared/addon/rpc/server.go +++ b/shared/addon/rpc/server.go @@ -1,16 +1,11 @@ package rpc import ( - //"net/rpc" - - "github.com/hashicorp/go-plugin" - "go.woodpecker-ci.org/woodpecker/shared/addon/types" ) type AddonRPCServer[T any] struct { - Impl types.Addon[T] - broker *plugin.MuxBroker + Impl types.Addon[T] } func (a *AddonRPCServer[T]) Type(_ interface{}, resp *types.Type) error { @@ -19,7 +14,7 @@ func (a *AddonRPCServer[T]) Type(_ interface{}, resp *types.Type) error { } func (a *AddonRPCServer[T]) Addon(args map[string]interface{}, resp *T) error { - addon, err := a.Impl.Addon(args["env"].([]string)) + addon, err := a.Impl.Addon( /*args["logger"].(zerolog.Logger), */ args["env"].([]string)) *resp = addon return err } diff --git a/shared/addon/test-addon/main.go b/shared/addon/test-addon/main.go index c6a968c3af..f176c52452 100644 --- a/shared/addon/test-addon/main.go +++ b/shared/addon/test-addon/main.go @@ -2,9 +2,11 @@ package main import ( "context" - "log/slog" "net/http" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "go.woodpecker-ci.org/woodpecker/server/forge" forge_types "go.woodpecker-ci.org/woodpecker/server/forge/types" "go.woodpecker-ci.org/woodpecker/server/model" @@ -24,72 +26,75 @@ func (a *TestAddon) Type() addon_types.Type { } func (a *TestAddon) Addon(env []string) (forge.Forge, error) { - return &config{}, nil + logger := log.Logger // TODO send via rpc + logger.Error().Msg("hello world from addon") + return &config{l: logger}, nil } type config struct { + l zerolog.Logger } // Name returns the string name of this driver func (c *config) Name() string { - slog.Error("call Name") + c.l.Error().Msg("call Name") return "addon-forge" } // URL returns the root url of a configured forge func (c *config) URL() string { - slog.Error("call URL") + c.l.Error().Msg("call URL") return "" } // Login authenticates an account with Bitbucket using the oauth2 protocol. The // Bitbucket account details are returned when the user is successfully authenticated. func (c *config) Login(ctx context.Context, w http.ResponseWriter, req *http.Request) (*model.User, error) { - slog.Error("call Login") + c.l.Error().Msg("call Login") return nil, nil } // Auth uses the Bitbucket oauth2 access token and refresh token to authenticate // a session and return the Bitbucket account login. func (c *config) Auth(ctx context.Context, token, secret string) (string, error) { - slog.Error("call Auth") + c.l.Error().Msg("call Auth") return "", nil } // Teams returns a list of all team membership for the Bitbucket account. func (c *config) Teams(ctx context.Context, u *model.User) ([]*model.Team, error) { - slog.Error("call Teams") + c.l.Error().Msg("call Teams") return nil, nil } // Repo returns the named Bitbucket repository. func (c *config) Repo(ctx context.Context, u *model.User, remoteID model.ForgeRemoteID, owner, name string) (*model.Repo, error) { - slog.Error("call Repo") + c.l.Error().Msg("call Repo") return nil, nil } // Repos returns a list of all repositories for Bitbucket account, including // organization repositories. func (c *config) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) { - slog.Error("call Repos") + c.l.Error().Msg("call Repos") return nil, nil } // File fetches the file from the Bitbucket repository and returns its contents. func (c *config) File(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]byte, error) { - slog.Error("call File") + c.l.Error().Msg("call File") return nil, nil } // Dir fetches a folder from the bitbucket repository func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*forge_types.FileMeta, error) { - slog.Error("call Dir") + c.l.Error().Msg("call Dir") return nil, nil } // Status creates a pipeline status for the Bitbucket commit. func (c *config) Status(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, _ *model.Workflow) error { - slog.Error("call Status") + c.l.Error().Msg("call Status") return nil } @@ -97,57 +102,57 @@ func (c *config) Status(ctx context.Context, user *model.User, repo *model.Repo, // the Bitbucket repository. Prior to registering hook, previously created hooks // are deleted. func (c *config) Activate(ctx context.Context, u *model.User, r *model.Repo, link string) error { - slog.Error("call Activate") + c.l.Error().Msg("call Activate") return nil } // Deactivate deactivates the repository be removing repository push hooks from // the Bitbucket repository. func (c *config) Deactivate(ctx context.Context, u *model.User, r *model.Repo, link string) error { - slog.Error("call Deactivate") + c.l.Error().Msg("call Deactivate") return nil } // Netrc returns a netrc file capable of authenticating Bitbucket requests and // cloning Bitbucket repositories. func (c *config) Netrc(u *model.User, _ *model.Repo) (*model.Netrc, error) { - slog.Error("call Netrc") + c.l.Error().Msg("call Netrc") return nil, nil } // Branches returns the names of all branches for the named repository. func (c *config) Branches(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]string, error) { - slog.Error("call Branches") + c.l.Error().Msg("call Branches") return nil, nil } // BranchHead returns the sha of the head (latest commit) of the specified branch func (c *config) BranchHead(ctx context.Context, u *model.User, r *model.Repo, branch string) (string, error) { - slog.Error("call BranchHead") + c.l.Error().Msg("call BranchHead") return "", nil } // PullRequests returns the pull requests of the named repository. func (c *config) PullRequests(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]*model.PullRequest, error) { - slog.Error("call PullRequests") + c.l.Error().Msg("call PullRequests") return nil, nil } // Hook parses the incoming Bitbucket hook and returns the Repository and // Pipeline details. If the hook is unsupported nil values are returned. func (c *config) Hook(_ context.Context, req *http.Request) (*model.Repo, *model.Pipeline, error) { - slog.Error("call Hook") + c.l.Error().Msg("call Hook") return nil, nil, nil } // OrgMembership returns if user is member of organization and if user // is admin/owner in this organization. func (c *config) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) { - slog.Error("call OrgMembership") + c.l.Error().Msg("call OrgMembership") return nil, nil } func (c *config) Org(ctx context.Context, u *model.User, owner string) (*model.Org, error) { - slog.Error("call Org") + c.l.Error().Msg("call Org") return nil, nil } From d980db5aa3b367ced361edb961e1a011d63b3a35 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 17:08:08 +0100 Subject: [PATCH 14/38] Revert "some move to hashicorp/go-plugin" This reverts commit 91afda4458fa3c5b0d94e8a5fb05e77216669778. --- cmd/agent/agent.go | 4 +- go.mod | 4 -- go.sum | 48 ------------------- shared/addon/addon.go | 85 ++++++++++++++++----------------- shared/addon/execute/execute.go | 17 ------- shared/addon/rpc/client.go | 34 ------------- shared/addon/rpc/plugin.go | 27 ----------- shared/addon/rpc/server.go | 20 -------- shared/addon/test-addon/main.go | 17 +------ shared/addon/types/addon.go | 6 --- shared/addon/types/types.go | 2 +- 11 files changed, 46 insertions(+), 218 deletions(-) delete mode 100644 shared/addon/execute/execute.go delete mode 100644 shared/addon/rpc/client.go delete mode 100644 shared/addon/rpc/plugin.go delete mode 100644 shared/addon/rpc/server.go delete mode 100644 shared/addon/types/addon.go diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 3d313ad39b..9587513d72 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -43,9 +43,9 @@ import ( "go.woodpecker-ci.org/woodpecker/pipeline/backend" "go.woodpecker-ci.org/woodpecker/pipeline/backend/types" "go.woodpecker-ci.org/woodpecker/pipeline/rpc" + "go.woodpecker-ci.org/woodpecker/shared/utils" "go.woodpecker-ci.org/woodpecker/shared/addon" addonTypes "go.woodpecker-ci.org/woodpecker/shared/addon/types" - "go.woodpecker-ci.org/woodpecker/shared/utils" "go.woodpecker-ci.org/woodpecker/version" ) @@ -247,7 +247,7 @@ func run(c *cli.Context) error { } func getEngine(c *cli.Context, backendCtx context.Context) (types.Engine, error) { - addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeEngine) + addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeForge) if err != nil { log.Error().Err(err).Msg("cannot load addon") return nil, err diff --git a/go.mod b/go.mod index 39d3e23f24..fc2c9f07f8 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,6 @@ require ( github.com/google/tink/go v1.7.0 github.com/google/uuid v1.4.0 github.com/gorilla/securecookie v1.1.2 - github.com/hashicorp/go-plugin v1.4.3 github.com/jellydator/ttlcache/v3 v3.1.0 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 @@ -105,7 +104,6 @@ require ( github.com/hashicorp/go-hclog v1.2.0 // indirect github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/go-version v1.5.0 // indirect - github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -120,12 +118,10 @@ require ( github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mholt/acmez v1.2.0 // indirect github.com/miekg/dns v1.1.55 // indirect - github.com/mitchellh/go-testing-interface v1.0.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/oklog/run v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect diff --git a/go.sum b/go.sum index 119f8f8679..6edd89e750 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= code.gitea.io/sdk/gitea v0.16.0 h1:gAfssETO1Hv9QbE+/nhWu7EjoFQYKt6kPoyDytQgw00= code.gitea.io/sdk/gitea v0.16.0/go.mod h1:ndkDk99BnfiUCCYEUhpNzi0lpmApXlwRFqClBlOlEBg= codeberg.org/6543/go-yaml2json v1.0.0 h1:heGqo9VEi7gY2yNqjj7X4ADs5nzlFIbGsJtgYDLrnig= @@ -40,7 +39,6 @@ github.com/caddyserver/certmagic v0.19.2 h1:HZd1AKLx4592MalEGQS39DKs2ZOAJCEM/xYP github.com/caddyserver/certmagic v0.19.2/go.mod h1:fsL01NomQ6N+kE2j37ZCnig2MFosG+MIO4ztnmG/zz8= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= @@ -49,7 +47,6 @@ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583j github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -87,8 +84,6 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -152,12 +147,7 @@ github.com/golang-jwt/jwt/v5 v5.1.0 h1:UGKbA/IPjtS6zLcdB7i5TyACMgSbOTiR8qzXgw8HW github.com/golang-jwt/jwt/v5 v5.1.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= @@ -194,17 +184,12 @@ github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pw github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-plugin v1.4.3 h1:DXmvivbWD5qdiBts9TpBC7BYL1Aia5sxbRgQB+v6UZM= -github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-version v1.5.0 h1:O293SZ2Eg+AAYijkVK3jR786Am1bhDEh2GHT0tIVE5E= github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -251,8 +236,6 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jellydator/ttlcache/v3 v3.1.0 h1:0gPFG0IHHP6xyUyXq+JaD8fwkDCqgqwohXNJBcYE71g= github.com/jellydator/ttlcache/v3 v3.1.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= -github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= -github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -323,9 +306,6 @@ github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30= github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/moby/moby v24.0.7+incompatible h1:RrVT5IXBn85mRtFKP+gFwVLCcnNPZIgN3NVRJG9Le+4= github.com/moby/moby v24.0.7+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -343,8 +323,6 @@ github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1n github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -370,7 +348,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= @@ -499,10 +476,6 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -511,11 +484,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -530,11 +499,9 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -542,7 +509,6 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -591,11 +557,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -615,19 +578,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= @@ -660,8 +614,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= diff --git a/shared/addon/addon.go b/shared/addon/addon.go index 058eed13e0..eaacc0a29d 100644 --- a/shared/addon/addon.go +++ b/shared/addon/addon.go @@ -2,66 +2,63 @@ package addon import ( "errors" + "fmt" "os" - "os/exec" + "plugin" + "reflect" - "github.com/hashicorp/go-plugin" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" - "go.woodpecker-ci.org/woodpecker/shared/addon/rpc" "go.woodpecker-ci.org/woodpecker/shared/addon/types" ) +var pluginCache = map[string]*plugin.Plugin{} + type Addon[T any] struct { Type types.Type Value T } func Load[T any](files []string, t types.Type) (*Addon[T], error) { - //for _, file := range files { - c := plugin.NewClient(&plugin.ClientConfig{ - HandshakeConfig: rpc.HandshakeConfig, - Plugins: plugin.PluginSet{ - string(t): &rpc.AddonPlugin[T]{}, - }, - Cmd: exec.Command(files[0]), - Logger: nil, // TODO zerolog wrapper - }) + for _, file := range files { + if _, has := pluginCache[file]; !has { + p, err := plugin.Open(file) + if err != nil { + return nil, err + } + pluginCache[file] = p + } - rpcClient, err := c.Client() - if err != nil { - return nil, err - } + typeLookup, err := pluginCache[file].Lookup("Type") + if err != nil { + return nil, err + } + if addonType, is := typeLookup.(*types.Type); !is { + return nil, errors.New("addon type has incorrect type") + } else if *addonType != t { + continue + } - raw, err := rpcClient.Dispense(string(t)) - if err != nil { - return nil, err - } - - addon, ok := raw.(types.Addon[T]) - if !ok { - return nil, errors.New("addon has bad type") - } + mainLookup, err := pluginCache[file].Lookup("Addon") + if err != nil { + return nil, err + } + fmt.Println(reflect.TypeOf(mainLookup)) + main, is := mainLookup.(func(zerolog.Logger, []string) (T, error)) + if !is { + return nil, errors.New("addon main has incorrect type") + } - if addon.Type() != t { - //continue - return nil, nil + mainOut, err := main(log.Logger, os.Environ()) + if err != nil { + return nil, err + } + return &Addon[T]{ + Type: t, + Value: mainOut, + }, nil } - mainOut, err := addon.Addon(os.Environ()) - if err != nil { - return nil, err - } - - //mainOutTyped, is := mainOut.(T) - //if !is { - //return nil, errors.New("main output has bad type") - //} - - return &Addon[T]{ - Type: t, - Value: mainOut, - }, nil - //} - return nil, nil } diff --git a/shared/addon/execute/execute.go b/shared/addon/execute/execute.go deleted file mode 100644 index ddd55e7790..0000000000 --- a/shared/addon/execute/execute.go +++ /dev/null @@ -1,17 +0,0 @@ -package execute - -import ( - "github.com/hashicorp/go-plugin" - - "go.woodpecker-ci.org/woodpecker/shared/addon/rpc" - addonTypes "go.woodpecker-ci.org/woodpecker/shared/addon/types" -) - -func Execute[T any](addon addonTypes.Addon[T]) { - plugin.Serve(&plugin.ServeConfig{ - HandshakeConfig: rpc.HandshakeConfig, - Plugins: plugin.PluginSet{ - string(addon.Type()): &rpc.AddonPlugin[T]{Impl: addon}, - }, - }) -} diff --git a/shared/addon/rpc/client.go b/shared/addon/rpc/client.go deleted file mode 100644 index 7006008175..0000000000 --- a/shared/addon/rpc/client.go +++ /dev/null @@ -1,34 +0,0 @@ -package rpc - -import ( - "net/rpc" - - "github.com/rs/zerolog/log" - - "go.woodpecker-ci.org/woodpecker/shared/addon/types" -) - -type AddonRPCClient[T any] struct { - client *rpc.Client -} - -func (a *AddonRPCClient[T]) Type() types.Type { - var resp types.Type - err := a.client.Call("Plugin.Type", new(any), &resp) - if err != nil { - log.Error().Err(err).Msg("could not get addon type") - return "" - } - - return resp -} - -func (a *AddonRPCClient[T]) Addon(env []string) (T, error) { - var resp T - err := a.client.Call("Plugin.Addon", map[string]any{ - //"logger": logger, - "env": env, - }, &resp) - - return resp, err -} diff --git a/shared/addon/rpc/plugin.go b/shared/addon/rpc/plugin.go deleted file mode 100644 index c0893036d2..0000000000 --- a/shared/addon/rpc/plugin.go +++ /dev/null @@ -1,27 +0,0 @@ -package rpc - -import ( - "net/rpc" - - "github.com/hashicorp/go-plugin" - - "go.woodpecker-ci.org/woodpecker/shared/addon/types" -) - -var HandshakeConfig = plugin.HandshakeConfig{ - ProtocolVersion: 1, - MagicCookieKey: "woodpecker_plugin_key", - MagicCookieValue: "woodpecker_plugin_value", -} - -type AddonPlugin[T any] struct { - Impl types.Addon[T] -} - -func (a *AddonPlugin[T]) Server(_ *plugin.MuxBroker) (interface{}, error) { - return &AddonRPCServer[T]{Impl: a.Impl}, nil -} - -func (*AddonPlugin[T]) Client(_ *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { - return &AddonRPCClient[T]{client: c}, nil -} diff --git a/shared/addon/rpc/server.go b/shared/addon/rpc/server.go deleted file mode 100644 index c350568e37..0000000000 --- a/shared/addon/rpc/server.go +++ /dev/null @@ -1,20 +0,0 @@ -package rpc - -import ( - "go.woodpecker-ci.org/woodpecker/shared/addon/types" -) - -type AddonRPCServer[T any] struct { - Impl types.Addon[T] -} - -func (a *AddonRPCServer[T]) Type(_ interface{}, resp *types.Type) error { - *resp = a.Impl.Type() - return nil -} - -func (a *AddonRPCServer[T]) Addon(args map[string]interface{}, resp *T) error { - addon, err := a.Impl.Addon( /*args["logger"].(zerolog.Logger), */ args["env"].([]string)) - *resp = addon - return err -} diff --git a/shared/addon/test-addon/main.go b/shared/addon/test-addon/main.go index f176c52452..df19d00a73 100644 --- a/shared/addon/test-addon/main.go +++ b/shared/addon/test-addon/main.go @@ -5,28 +5,15 @@ import ( "net/http" "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "go.woodpecker-ci.org/woodpecker/server/forge" forge_types "go.woodpecker-ci.org/woodpecker/server/forge/types" "go.woodpecker-ci.org/woodpecker/server/model" - "go.woodpecker-ci.org/woodpecker/shared/addon/execute" addon_types "go.woodpecker-ci.org/woodpecker/shared/addon/types" ) -func main() { - execute.Execute[forge.Forge](&TestAddon{}) -} - -type TestAddon struct { -} - -func (a *TestAddon) Type() addon_types.Type { - return addon_types.TypeForge -} +var Type = addon_types.TypeForge -func (a *TestAddon) Addon(env []string) (forge.Forge, error) { - logger := log.Logger // TODO send via rpc +func Addon(logger zerolog.Logger, env []string) (forge.Forge, error) { logger.Error().Msg("hello world from addon") return &config{l: logger}, nil } diff --git a/shared/addon/types/addon.go b/shared/addon/types/addon.go deleted file mode 100644 index e838f00abe..0000000000 --- a/shared/addon/types/addon.go +++ /dev/null @@ -1,6 +0,0 @@ -package types - -type Addon[T any] interface { - Type() Type - Addon([]string) (T, error) -} diff --git a/shared/addon/types/types.go b/shared/addon/types/types.go index 6835b01609..e6c5d1c153 100644 --- a/shared/addon/types/types.go +++ b/shared/addon/types/types.go @@ -3,6 +3,6 @@ package types type Type string const ( - TypeForge Type = "forge" + TypeForge Type = "forge" TypeEngine Type = "engine" ) From cee88b2b572f7b35e95197232786f2d5fc422569 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 17:08:49 +0100 Subject: [PATCH 15/38] fix docs typo --- docs/docs/30-administration/75-addons/20-creating-addons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index 1749dfe592..b1f1d62e59 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -39,7 +39,7 @@ The output file is your addon which is now ready to use. ## Restrictions -Addons must directly directly depend on Woodpecker's core (`go.woodpecker-ci.org/woodpecker/woodpecker`). +Addons must directly depend on Woodpecker's core (`go.woodpecker-ci.org/woodpecker/woodpecker`). The addon must have been built with **excatly the same code** as the Woodpecker instance you'd like to use it on. This means: If you build your addon with a specific commit from Woodpecker `next`, you can likely only use it with the Woodpecker version compiled from this commit. Also, if you change something inside of Woodpecker without commiting, it might fail because you need to recompile your addon with this code. From 44e246ce340b0f9b2394695238d3d3771e13a84b Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 17:12:35 +0100 Subject: [PATCH 16/38] Add warning to docs --- .../75-addons/{00-addons.md => 00-overview.md} | 4 ++++ docs/docs/30-administration/75-addons/_category_.yml | 3 +++ 2 files changed, 7 insertions(+) rename docs/docs/30-administration/75-addons/{00-addons.md => 00-overview.md} (92%) diff --git a/docs/docs/30-administration/75-addons/00-addons.md b/docs/docs/30-administration/75-addons/00-overview.md similarity index 92% rename from docs/docs/30-administration/75-addons/00-addons.md rename to docs/docs/30-administration/75-addons/00-overview.md index 47677d1af4..4b8ef8d267 100644 --- a/docs/docs/30-administration/75-addons/00-addons.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -1,5 +1,9 @@ # Addons +:::warning +Addons are still experimental. They implementation can change and break at any time. +::: + To adapt Woodpecker to your needs beyond the [configuration](../10-server-config.md), Woodpecker has its own **addon** system, built ontop of [Go's internal plugin system](https://go.dev/pkg/plugin). Addons can be used for: diff --git a/docs/docs/30-administration/75-addons/_category_.yml b/docs/docs/30-administration/75-addons/_category_.yml index 4f56ea269d..4cd7380c57 100644 --- a/docs/docs/30-administration/75-addons/_category_.yml +++ b/docs/docs/30-administration/75-addons/_category_.yml @@ -1,3 +1,6 @@ label: 'Addons' collapsible: true collapsed: true +link: + type: 'doc' + id: 'overview' From d9427833441093654a2af76a9c257e8f4a31adcc Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 17:18:12 +0100 Subject: [PATCH 17/38] some logging improvements --- docs/docs/30-administration/75-addons/00-overview.md | 4 ++++ docs/docs/30-administration/75-addons/20-creating-addons.md | 4 ++++ shared/addon/addon.go | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/docs/30-administration/75-addons/00-overview.md b/docs/docs/30-administration/75-addons/00-overview.md index 4b8ef8d267..64e9f7df8e 100644 --- a/docs/docs/30-administration/75-addons/00-overview.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -36,3 +36,7 @@ services: You may need to [mount the addon file as volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to access it from inside the Docker container. You can list multiple addons, Woodpecker will automatically determine their type. If you specify multiple addons with the same type, only the first one will be used. + +### Bug reports + +If you experience bugs, please check which component has the issue. If it's the addon, **do not raise an issue in the main repository**, but rather use the separate addon repositories. To check which component is responsible for the bug, look at the logs. Logs from addons are marked with a special field `addon` containing their addon file name. diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index b1f1d62e59..ebd0d6b477 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -53,6 +53,10 @@ It is recommended to at least support the latest released version of Woodpecker. As long as there were no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `go.woodpecker-ci.org/woodpecker/woodpecker` using `go get` before compiling. +## Logging + +The entrypoint receives a `zerolog.Logger` as input. **Do not use any other logging solution.** This logger follows the configuration of the Woodpecker instance and adds a special field `addon` to the log entries which allows users to find out which component is writing the log messages. + ## Example structure ```go diff --git a/shared/addon/addon.go b/shared/addon/addon.go index eaacc0a29d..896e700792 100644 --- a/shared/addon/addon.go +++ b/shared/addon/addon.go @@ -50,7 +50,9 @@ func Load[T any](files []string, t types.Type) (*Addon[T], error) { return nil, errors.New("addon main has incorrect type") } - mainOut, err := main(log.Logger, os.Environ()) + logger := log.Logger.With().Str("addon", file).Logger() + + mainOut, err := main(logger, os.Environ()) if err != nil { return nil, err } From a2aad23460467956d2b7741648eb550a3724b898 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 17:24:04 +0100 Subject: [PATCH 18/38] fix link --- docs/docs/30-administration/10-server-config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/10-server-config.md b/docs/docs/30-administration/10-server-config.md index 4d33be21f7..b7a66b320e 100644 --- a/docs/docs/30-administration/10-server-config.md +++ b/docs/docs/30-administration/10-server-config.md @@ -525,7 +525,7 @@ Supported variables: > Default: empty -List of addon files. See [addons](./75-addons/00-addons.md). +List of addon files. See [addons](./75-addons/00-overview.md). --- From 897f44c6bbbc412e6dca1d74ac672661483045e6 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 18:36:34 +0100 Subject: [PATCH 19/38] format --- cmd/agent/agent.go | 2 +- shared/addon/types/types.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 9587513d72..66064bf416 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -43,9 +43,9 @@ import ( "go.woodpecker-ci.org/woodpecker/pipeline/backend" "go.woodpecker-ci.org/woodpecker/pipeline/backend/types" "go.woodpecker-ci.org/woodpecker/pipeline/rpc" - "go.woodpecker-ci.org/woodpecker/shared/utils" "go.woodpecker-ci.org/woodpecker/shared/addon" addonTypes "go.woodpecker-ci.org/woodpecker/shared/addon/types" + "go.woodpecker-ci.org/woodpecker/shared/utils" "go.woodpecker-ci.org/woodpecker/version" ) diff --git a/shared/addon/types/types.go b/shared/addon/types/types.go index e6c5d1c153..6835b01609 100644 --- a/shared/addon/types/types.go +++ b/shared/addon/types/types.go @@ -3,6 +3,6 @@ package types type Type string const ( - TypeForge Type = "forge" + TypeForge Type = "forge" TypeEngine Type = "engine" ) From 59ee790e5d8ebaee950ef2ea10d202568c83ed23 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 5 Dec 2023 18:37:46 +0100 Subject: [PATCH 20/38] fix link --- docs/docs/30-administration/15-agent-config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/15-agent-config.md b/docs/docs/30-administration/15-agent-config.md index 907f9afec2..504265d36f 100644 --- a/docs/docs/30-administration/15-agent-config.md +++ b/docs/docs/30-administration/15-agent-config.md @@ -182,7 +182,7 @@ Configures the backend engine to run pipelines on. Possible values are `auto-det > Default: empty -List of addon files. See [addons](./75-addons/00-addons.md). +List of addon files. See [addons](./75-addons/00-overview.md). ### `WOODPECKER_BACKEND_DOCKER_*` From a43733260ca7d2841f4625d5dd46747028ff1805 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 7 Dec 2023 08:30:11 +0100 Subject: [PATCH 21/38] remove test addon --- shared/addon/test-addon/main.go | 145 -------------------------------- 1 file changed, 145 deletions(-) delete mode 100644 shared/addon/test-addon/main.go diff --git a/shared/addon/test-addon/main.go b/shared/addon/test-addon/main.go deleted file mode 100644 index df19d00a73..0000000000 --- a/shared/addon/test-addon/main.go +++ /dev/null @@ -1,145 +0,0 @@ -package main - -import ( - "context" - "net/http" - - "github.com/rs/zerolog" - "go.woodpecker-ci.org/woodpecker/server/forge" - forge_types "go.woodpecker-ci.org/woodpecker/server/forge/types" - "go.woodpecker-ci.org/woodpecker/server/model" - addon_types "go.woodpecker-ci.org/woodpecker/shared/addon/types" -) - -var Type = addon_types.TypeForge - -func Addon(logger zerolog.Logger, env []string) (forge.Forge, error) { - logger.Error().Msg("hello world from addon") - return &config{l: logger}, nil -} - -type config struct { - l zerolog.Logger -} - -// Name returns the string name of this driver -func (c *config) Name() string { - c.l.Error().Msg("call Name") - return "addon-forge" -} - -// URL returns the root url of a configured forge -func (c *config) URL() string { - c.l.Error().Msg("call URL") - return "" -} - -// Login authenticates an account with Bitbucket using the oauth2 protocol. The -// Bitbucket account details are returned when the user is successfully authenticated. -func (c *config) Login(ctx context.Context, w http.ResponseWriter, req *http.Request) (*model.User, error) { - c.l.Error().Msg("call Login") - return nil, nil -} - -// Auth uses the Bitbucket oauth2 access token and refresh token to authenticate -// a session and return the Bitbucket account login. -func (c *config) Auth(ctx context.Context, token, secret string) (string, error) { - c.l.Error().Msg("call Auth") - return "", nil -} - -// Teams returns a list of all team membership for the Bitbucket account. -func (c *config) Teams(ctx context.Context, u *model.User) ([]*model.Team, error) { - c.l.Error().Msg("call Teams") - return nil, nil -} - -// Repo returns the named Bitbucket repository. -func (c *config) Repo(ctx context.Context, u *model.User, remoteID model.ForgeRemoteID, owner, name string) (*model.Repo, error) { - c.l.Error().Msg("call Repo") - return nil, nil -} - -// Repos returns a list of all repositories for Bitbucket account, including -// organization repositories. -func (c *config) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) { - c.l.Error().Msg("call Repos") - return nil, nil -} - -// File fetches the file from the Bitbucket repository and returns its contents. -func (c *config) File(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]byte, error) { - c.l.Error().Msg("call File") - return nil, nil -} - -// Dir fetches a folder from the bitbucket repository -func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*forge_types.FileMeta, error) { - c.l.Error().Msg("call Dir") - return nil, nil -} - -// Status creates a pipeline status for the Bitbucket commit. -func (c *config) Status(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, _ *model.Workflow) error { - c.l.Error().Msg("call Status") - return nil -} - -// Activate activates the repository by registering repository push hooks with -// the Bitbucket repository. Prior to registering hook, previously created hooks -// are deleted. -func (c *config) Activate(ctx context.Context, u *model.User, r *model.Repo, link string) error { - c.l.Error().Msg("call Activate") - return nil -} - -// Deactivate deactivates the repository be removing repository push hooks from -// the Bitbucket repository. -func (c *config) Deactivate(ctx context.Context, u *model.User, r *model.Repo, link string) error { - c.l.Error().Msg("call Deactivate") - return nil -} - -// Netrc returns a netrc file capable of authenticating Bitbucket requests and -// cloning Bitbucket repositories. -func (c *config) Netrc(u *model.User, _ *model.Repo) (*model.Netrc, error) { - c.l.Error().Msg("call Netrc") - return nil, nil -} - -// Branches returns the names of all branches for the named repository. -func (c *config) Branches(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]string, error) { - c.l.Error().Msg("call Branches") - return nil, nil -} - -// BranchHead returns the sha of the head (latest commit) of the specified branch -func (c *config) BranchHead(ctx context.Context, u *model.User, r *model.Repo, branch string) (string, error) { - c.l.Error().Msg("call BranchHead") - return "", nil -} - -// PullRequests returns the pull requests of the named repository. -func (c *config) PullRequests(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]*model.PullRequest, error) { - c.l.Error().Msg("call PullRequests") - return nil, nil -} - -// Hook parses the incoming Bitbucket hook and returns the Repository and -// Pipeline details. If the hook is unsupported nil values are returned. -func (c *config) Hook(_ context.Context, req *http.Request) (*model.Repo, *model.Pipeline, error) { - c.l.Error().Msg("call Hook") - return nil, nil, nil -} - -// OrgMembership returns if user is member of organization and if user -// is admin/owner in this organization. -func (c *config) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) { - c.l.Error().Msg("call OrgMembership") - return nil, nil -} - -func (c *config) Org(ctx context.Context, u *model.User, owner string) (*model.Org, error) { - c.l.Error().Msg("call Org") - return nil, nil -} From f2b84208b7814c8f25975a89ebc65b95c83d2488 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 7 Dec 2023 08:47:35 +0100 Subject: [PATCH 22/38] fix --- cmd/agent/.agent.go.kate-swp | Bin 0 -> 177 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 cmd/agent/.agent.go.kate-swp diff --git a/cmd/agent/.agent.go.kate-swp b/cmd/agent/.agent.go.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..f00dcd3f2c6fa9ba47beaf283e5d4c8a9702c73b GIT binary patch literal 177 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?VnNn`W=A{Orx|LK@rRO~LR4_kVI<%5HO zGCzSBL`QofaTr5fgJJw&pg3bCf*%6n7a;hdAbu)>9|q#Px}q2!4l@j76IV!OL8@zB JdS+g#D*z;XC9wbi literal 0 HcmV?d00001 From 7a2b835205fbec6d90ce6a43ecad4833a49a35d9 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 7 Dec 2023 08:47:39 +0100 Subject: [PATCH 23/38] fix type --- cmd/agent/.agent.go.kate-swp | Bin 177 -> 0 bytes cmd/agent/agent.go | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 cmd/agent/.agent.go.kate-swp diff --git a/cmd/agent/.agent.go.kate-swp b/cmd/agent/.agent.go.kate-swp deleted file mode 100644 index f00dcd3f2c6fa9ba47beaf283e5d4c8a9702c73b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?VnNn`W=A{Orx|LK@rRO~LR4_kVI<%5HO zGCzSBL`QofaTr5fgJJw&pg3bCf*%6n7a;hdAbu)>9|q#Px}q2!4l@j76IV!OL8@zB JdS+g#D*z;XC9wbi diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 66064bf416..3d313ad39b 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -247,7 +247,7 @@ func run(c *cli.Context) error { } func getEngine(c *cli.Context, backendCtx context.Context) (types.Engine, error) { - addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeForge) + addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeEngine) if err != nil { log.Error().Err(err).Msg("cannot load addon") return nil, err From 44c8a506b6b7cf1384124f60875408118a0a57d6 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 7 Dec 2023 08:51:32 +0100 Subject: [PATCH 24/38] fix lint --- cmd/agent/agent.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 3d313ad39b..40e4f741b0 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -157,11 +157,16 @@ func run(c *cli.Context) error { // new engine backendCtx := context.WithValue(ctx, types.CliContext, c) - engine, err := getEngine(c, backendCtx) + engine, err := getEngine(backendCtx, c.String("backend-engine"), c.StringSlice("addons")) if err != nil { return err } + if !engine.IsAvailable(backendCtx) { + log.Error().Str("engine", engine.Name()).Msg("selected backend engine unavailable") + return fmt.Errorf("selected backend engine %s unavailable", engine.Name()) + } + // load engine (e.g. init api client) engInfo, err := engine.Load(backendCtx) if err != nil { @@ -246,8 +251,8 @@ func run(c *cli.Context) error { return nil } -func getEngine(c *cli.Context, backendCtx context.Context) (types.Engine, error) { - addonEngine, err := addon.Load[types.Engine](c.StringSlice("addons"), addonTypes.TypeEngine) +func getEngine(backendCtx context.Context, engineName string, addons []string) (types.Engine, error) { + addonEngine, err := addon.Load[types.Engine](addons, addonTypes.TypeEngine) if err != nil { log.Error().Err(err).Msg("cannot load addon") return nil, err @@ -257,9 +262,9 @@ func getEngine(c *cli.Context, backendCtx context.Context) (types.Engine, error) } backend.Init(backendCtx) - engine, err := backend.FindEngine(backendCtx, c.String("backend-engine")) + engine, err := backend.FindEngine(backendCtx, engineName) if err != nil { - log.Error().Err(err).Msgf("cannot find backend engine '%s'", c.String("backend-engine")) + log.Error().Err(err).Msgf("cannot find backend engine '%s'", engineName) return nil, err } return engine, nil From be45bf7f6371de67609f293375a114adb04a9b75 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 8 Dec 2023 16:39:17 +0100 Subject: [PATCH 25/38] fix typo --- docs/docs/30-administration/75-addons/00-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/75-addons/00-overview.md b/docs/docs/30-administration/75-addons/00-overview.md index 64e9f7df8e..0a4b20127f 100644 --- a/docs/docs/30-administration/75-addons/00-overview.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -1,7 +1,7 @@ # Addons :::warning -Addons are still experimental. They implementation can change and break at any time. +Addons are still experimental. Their implementation can change and break at any time. ::: To adapt Woodpecker to your needs beyond the [configuration](../10-server-config.md), Woodpecker has its own **addon** system, built ontop of [Go's internal plugin system](https://go.dev/pkg/plugin). From aba0ab5f8afae8fccb29578d46a32991d769b7af Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 8 Dec 2023 16:44:36 +0100 Subject: [PATCH 26/38] fix import --- cmd/agent/agent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 06148395ce..23b428e45d 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -44,7 +44,7 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" "go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc" "go.woodpecker-ci.org/woodpecker/v2/shared/addon" - addonTypes "go.woodpecker-ci.org/v2/woodpecker/shared/addon/types" + addonTypes "go.woodpecker-ci.org/woodpecker/v2/shared/addon/types" "go.woodpecker-ci.org/woodpecker/v2/shared/utils" "go.woodpecker-ci.org/woodpecker/v2/version" ) From 2a7a6753ba45e2d6f40e9f32364778c3bc091e0d Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Thu, 14 Dec 2023 07:23:29 +0100 Subject: [PATCH 27/38] Update docs/docs/30-administration/75-addons/00-overview.md Co-authored-by: Michalis Zampetakis --- docs/docs/30-administration/75-addons/00-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/75-addons/00-overview.md b/docs/docs/30-administration/75-addons/00-overview.md index 0a4b20127f..ec800ba53d 100644 --- a/docs/docs/30-administration/75-addons/00-overview.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -30,7 +30,7 @@ services: woodpecker-server: [...] environment: -+ - WOODPECKER_PLUGIN=/path/to/your/addon/file.so ++ - WOODPECKER_ADDONS=/path/to/your/addon/file.so ``` You may need to [mount the addon file as volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to access it from inside the Docker container. From 548a85b5ea12991d516c0d71e57b8cb4a7a2e84e Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 14 Dec 2023 10:23:02 +0100 Subject: [PATCH 28/38] as per reviews --- cmd/server/flags.go | 1 + docs/docs/30-administration/75-addons/00-overview.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/cmd/server/flags.go b/cmd/server/flags.go index c002a01838..4c5ee0d7d9 100644 --- a/cmd/server/flags.go +++ b/cmd/server/flags.go @@ -254,6 +254,7 @@ var flags = append([]cli.Flag{ &cli.StringSliceFlag{ EnvVars: []string{"WOODPECKER_ADDONS"}, Name: "addons", + Usage: "list of addon files", }, // // backend options for pipeline compiler diff --git a/docs/docs/30-administration/75-addons/00-overview.md b/docs/docs/30-administration/75-addons/00-overview.md index ec800ba53d..e92ce249dc 100644 --- a/docs/docs/30-administration/75-addons/00-overview.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -37,6 +37,8 @@ You may need to [mount the addon file as volume](https://docs.docker.com/storage You can list multiple addons, Woodpecker will automatically determine their type. If you specify multiple addons with the same type, only the first one will be used. +Using an addon always overwrites Woodpecker's internal setup. This means, that a forge addon will be used if specified, no matter what's configured for the forges natively supported by Woodpecker. + ### Bug reports If you experience bugs, please check which component has the issue. If it's the addon, **do not raise an issue in the main repository**, but rather use the separate addon repositories. To check which component is responsible for the bug, look at the logs. Logs from addons are marked with a special field `addon` containing their addon file name. From 09b4034e52fe86d024c809bf876e59a838f5bb05 Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:58:01 +0100 Subject: [PATCH 29/38] Apply suggestions from code review Co-authored-by: Anbraten --- cmd/agent/agent.go | 6 ++--- cmd/server/setup.go | 6 ++--- .../75-addons/20-creating-addons.md | 22 +++++++++---------- shared/addon/addon.go | 5 ++--- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 23b428e45d..4faf78c04a 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -163,8 +163,8 @@ func run(c *cli.Context) error { } if !engine.IsAvailable(backendCtx) { - log.Error().Str("engine", engine.Name()).Msg("selected backend engine unavailable") - return fmt.Errorf("selected backend engine %s unavailable", engine.Name()) + log.Error().Str("engine", engine.Name()).Msg("selected backend engine is unavailable") + return fmt.Errorf("selected backend engine %s is unavailable", engine.Name()) } // load engine (e.g. init api client) @@ -254,7 +254,7 @@ func run(c *cli.Context) error { func getEngine(backendCtx context.Context, engineName string, addons []string) (types.Engine, error) { addonEngine, err := addon.Load[types.Engine](addons, addonTypes.TypeEngine) if err != nil { - log.Error().Err(err).Msg("cannot load addon") + log.Error().Err(err).Msg("cannot load backend addon") return nil, err } if addonEngine != nil { diff --git a/cmd/server/setup.go b/cmd/server/setup.go index 015ed92a68..df036510f4 100644 --- a/cmd/server/setup.go +++ b/cmd/server/setup.go @@ -134,12 +134,12 @@ func setupMembershipService(_ *cli.Context, r forge.Forge) cache.MembershipServi // setupForge helper function to set up the forge from the CLI arguments. func setupForge(c *cli.Context) (forge.Forge, error) { - add, err := addon.Load[forge.Forge](c.StringSlice("addons"), addonTypes.TypeForge) + addonForge, err := addon.Load[forge.Forge](c.StringSlice("addons"), addonTypes.TypeForge) if err != nil { return nil, err } - if add != nil { - return add.Value, nil + if addonForge != nil { + return addonForge.Value, nil } switch { diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index ebd0d6b477..43b55e5197 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -18,14 +18,14 @@ An addon consists of two variables/functions in Go. 1. The actual addon. For type reference see [table below](#return-types). 2. An error. If this error is not `nil`, Woodpecker exits. -Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpecker`) and use the interfaces and types defined there. +Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpecker/v2`) and use the interfaces and types defined there. ### Return types | Addon type | Return type | | ---------- | ---------------------------------------------------------------------------- | -| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/server/forge".Forge` | -| `Engine` | `"go.woodpecker-ci.org/woodpecker/woodpecker/pipeline/backend/types".Engine` | +| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge".Forge` | +| `Engine` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Engine` | ## Compiling @@ -35,13 +35,13 @@ After you wrote your addon code, compile your addon: go build -buildmode plugin ``` -The output file is your addon which is now ready to use. +The output file is your addon which is now ready to be used. ## Restrictions -Addons must directly depend on Woodpecker's core (`go.woodpecker-ci.org/woodpecker/woodpecker`). +Addons must directly depend on Woodpecker's core (`go.woodpecker-ci.org/woodpecker/woodpecker/v2`). The addon must have been built with **excatly the same code** as the Woodpecker instance you'd like to use it on. This means: If you build your addon with a specific commit from Woodpecker `next`, you can likely only use it with the Woodpecker version compiled from this commit. -Also, if you change something inside of Woodpecker without commiting, it might fail because you need to recompile your addon with this code. +Also, if you change something inside of Woodpecker without committing, it might fail because you need to recompile your addon with this code first. In addition to this, addons are only supported on Linux, FreeBSD and macOS. @@ -51,7 +51,7 @@ It is recommended to at least support the latest released version of Woodpecker. ### Compile for different versions -As long as there were no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `go.woodpecker-ci.org/woodpecker/woodpecker` using `go get` before compiling. +As long as there were no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `go.woodpecker-ci.org/woodpecker/woodpecker/v2` using `go get` before compiling. ## Logging @@ -67,10 +67,10 @@ import ( "net/http" "github.com/rs/zerolog" - "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge" - forge_types "go.woodpecker-ci.org/woodpecker/woodpecker/server/forge/types" - "go.woodpecker-ci.org/woodpecker/woodpecker/server/model" - addon_types "go.woodpecker-ci.org/woodpecker/woodpecker/shared/addon/types" + "go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge" + forge_types "go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge/types" + "go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/model" + addon_types "go.woodpecker-ci.org/woodpecker/woodpecker/v2/shared/addon/types" ) var Type = addon_types.TypeForge diff --git a/shared/addon/addon.go b/shared/addon/addon.go index 59502ebe87..1750d18f52 100644 --- a/shared/addon/addon.go +++ b/shared/addon/addon.go @@ -35,7 +35,7 @@ func Load[T any](files []string, t types.Type) (*Addon[T], error) { return nil, err } if addonType, is := typeLookup.(*types.Type); !is { - return nil, errors.New("addon type has incorrect type") + return nil, errors.New("addon type is incorrect") } else if *addonType != t { continue } @@ -44,10 +44,9 @@ func Load[T any](files []string, t types.Type) (*Addon[T], error) { if err != nil { return nil, err } - fmt.Println(reflect.TypeOf(mainLookup)) main, is := mainLookup.(func(zerolog.Logger, []string) (T, error)) if !is { - return nil, errors.New("addon main has incorrect type") + return nil, errors.New("addon main function has incorrect type") } logger := log.Logger.With().Str("addon", file).Logger() From 10fea7d4101b6f177aacf7ad53c46dada71c0ee2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 09:59:15 +0000 Subject: [PATCH 30/38] [pre-commit.ci] auto fixes from pre-commit.com hooks [CI SKIP] for more information, see https://pre-commit.ci --- docs/docs/30-administration/75-addons/20-creating-addons.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index 43b55e5197..10024caa66 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -22,8 +22,8 @@ Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpe ### Return types -| Addon type | Return type | -| ---------- | ---------------------------------------------------------------------------- | +| Addon type | Return type | +| ---------- | ------------------------------------------------------------------------------- | | `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge".Forge` | | `Engine` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Engine` | From 94a89eb2e4ad624344dcd31c4db0e0750a098dfa Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 14 Dec 2023 10:59:26 +0100 Subject: [PATCH 31/38] Rename new occurences to backend --- cmd/agent/agent.go | 14 +++++++------- shared/addon/types/types.go | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 4faf78c04a..2f4b43653d 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -157,7 +157,7 @@ func run(c *cli.Context) error { // new engine backendCtx := context.WithValue(ctx, types.CliContext, c) - engine, err := getEngine(backendCtx, c.String("backend-engine"), c.StringSlice("addons")) + engine, err := getBackend(backendCtx, c.String("backend-engine"), c.StringSlice("addons")) if err != nil { return err } @@ -251,20 +251,20 @@ func run(c *cli.Context) error { return nil } -func getEngine(backendCtx context.Context, engineName string, addons []string) (types.Engine, error) { - addonEngine, err := addon.Load[types.Engine](addons, addonTypes.TypeEngine) +func getBackend(backendCtx context.Context, backendName string, addons []string) (types.Engine, error) { + addonBackend, err := addon.Load[types.Engine](addons, addonTypes.TypeBackend) if err != nil { log.Error().Err(err).Msg("cannot load backend addon") return nil, err } - if addonEngine != nil { - return addonEngine.Value, nil + if addonBackend != nil { + return addonBackend.Value, nil } backend.Init(backendCtx) - engine, err := backend.FindEngine(backendCtx, engineName) + engine, err := backend.FindEngine(backendCtx, backendName) if err != nil { - log.Error().Err(err).Msgf("cannot find backend engine '%s'", engineName) + log.Error().Err(err).Msgf("cannot find backend engine '%s'", backendName) return nil, err } return engine, nil diff --git a/shared/addon/types/types.go b/shared/addon/types/types.go index 6835b01609..1a70daffeb 100644 --- a/shared/addon/types/types.go +++ b/shared/addon/types/types.go @@ -3,6 +3,6 @@ package types type Type string const ( - TypeForge Type = "forge" - TypeEngine Type = "engine" + TypeForge Type = "forge" + TypeBackend Type = "backend" ) From 81084e4a475221bce3d28a9a9412111e80f26d47 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 14 Dec 2023 11:01:45 +0100 Subject: [PATCH 32/38] add trust warning --- docs/docs/30-administration/75-addons/00-overview.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/30-administration/75-addons/00-overview.md b/docs/docs/30-administration/75-addons/00-overview.md index e92ce249dc..7ce6d3d276 100644 --- a/docs/docs/30-administration/75-addons/00-overview.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -4,6 +4,10 @@ Addons are still experimental. Their implementation can change and break at any time. ::: +:::danger +You need to trust the author of the addons you use. Depending on their type, addons can access forge authentication codes, your secrets or other sensitive information. +::: + To adapt Woodpecker to your needs beyond the [configuration](../10-server-config.md), Woodpecker has its own **addon** system, built ontop of [Go's internal plugin system](https://go.dev/pkg/plugin). Addons can be used for: From 4d10d0ebee75fc8be65f35a6e938e1d15fb7b074 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 14 Dec 2023 11:02:52 +0100 Subject: [PATCH 33/38] different wording --- docs/docs/30-administration/75-addons/00-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/75-addons/00-overview.md b/docs/docs/30-administration/75-addons/00-overview.md index 7ce6d3d276..c200e3f1fe 100644 --- a/docs/docs/30-administration/75-addons/00-overview.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -37,7 +37,7 @@ services: + - WOODPECKER_ADDONS=/path/to/your/addon/file.so ``` -You may need to [mount the addon file as volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to access it from inside the Docker container. +In case you run Woodpecker as container, you probably want to mount the addon binaries to `/opt/addons/`. You can list multiple addons, Woodpecker will automatically determine their type. If you specify multiple addons with the same type, only the first one will be used. From 47c0fee754b8557730cf8b52d0ffd631fea2655a Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 19 Dec 2023 14:26:44 +0100 Subject: [PATCH 34/38] Apply suggestions from code review Co-authored-by: Michalis Zampetakis --- cmd/agent/flags.go | 1 + docs/docs/30-administration/75-addons/20-creating-addons.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/agent/flags.go b/cmd/agent/flags.go index 1a86e262e2..07a19fb318 100644 --- a/cmd/agent/flags.go +++ b/cmd/agent/flags.go @@ -100,5 +100,6 @@ var flags = []cli.Flag{ &cli.StringSliceFlag{ EnvVars: []string{"WOODPECKER_ADDONS"}, Name: "addons", + Usage: "list of addon files", }, } diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index 10024caa66..7f164d6853 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -29,7 +29,7 @@ Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpe ## Compiling -After you wrote your addon code, compile your addon: +After you write your addon code, compile your addon: ```sh go build -buildmode plugin @@ -51,7 +51,7 @@ It is recommended to at least support the latest released version of Woodpecker. ### Compile for different versions -As long as there were no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `go.woodpecker-ci.org/woodpecker/woodpecker/v2` using `go get` before compiling. +As long as there are no changes to Woodpecker's interfaces or they are backwards-compatible, you can easily compile the addon for multiple version by changing the version of `go.woodpecker-ci.org/woodpecker/woodpecker/v2` using `go get` before compiling. ## Logging From ea53cb2b60e0a4268d6a20896cb86e19089824e3 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 19 Dec 2023 14:45:47 +0100 Subject: [PATCH 35/38] fix --- cmd/agent/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/agent/flags.go b/cmd/agent/flags.go index 07a19fb318..0020d3ab0d 100644 --- a/cmd/agent/flags.go +++ b/cmd/agent/flags.go @@ -100,6 +100,6 @@ var flags = []cli.Flag{ &cli.StringSliceFlag{ EnvVars: []string{"WOODPECKER_ADDONS"}, Name: "addons", - Usage: "list of addon files", + Usage: "list of addon files", }, } From 861d9e82647068005d47781d842a8af18c8dc7bc Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Wed, 20 Dec 2023 12:05:31 +0100 Subject: [PATCH 36/38] rename to getBackendEngine --- cmd/agent/agent.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/agent/agent.go b/cmd/agent/agent.go index 3709ce4abf..1ff953d73c 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/agent.go @@ -157,7 +157,7 @@ func run(c *cli.Context) error { // new engine backendCtx := context.WithValue(ctx, types.CliContext, c) - backendEngine, err := getBackend(backendCtx, c.String("backend-engine"), c.StringSlice("addons")) + backendEngine, err := getBackendEngine(backendCtx, c.String("backend-engine"), c.StringSlice("addons")) if err != nil { return err } @@ -251,7 +251,7 @@ func run(c *cli.Context) error { return nil } -func getBackend(backendCtx context.Context, backendName string, addons []string) (types.Backend, error) { +func getBackendEngine(backendCtx context.Context, backendName string, addons []string) (types.Backend, error) { addonBackend, err := addon.Load[types.Backend](addons, addonTypes.TypeBackend) if err != nil { log.Error().Err(err).Msg("cannot load backend addon") From 8b9c7445b87762240fd930695a253129e05d231c Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 20 Dec 2023 14:14:43 +0100 Subject: [PATCH 37/38] Update docs/docs/30-administration/75-addons/20-creating-addons.md --- docs/docs/30-administration/75-addons/20-creating-addons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index 7f164d6853..6f4b88bab6 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -25,7 +25,7 @@ Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpe | Addon type | Return type | | ---------- | ------------------------------------------------------------------------------- | | `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge".Forge` | -| `Engine` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Engine` | +| `Backend` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Backend` | ## Compiling From 2c4546df38f81ef5e48be3c880e89e047e5ab15d Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 20 Dec 2023 14:15:18 +0100 Subject: [PATCH 38/38] fmt --- .../30-administration/75-addons/20-creating-addons.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/30-administration/75-addons/20-creating-addons.md b/docs/docs/30-administration/75-addons/20-creating-addons.md index 6f4b88bab6..745ac624e2 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -22,10 +22,10 @@ Directly import Woodpecker's Go package (`go.woodpecker-ci.org/woodpecker/woodpe ### Return types -| Addon type | Return type | -| ---------- | ------------------------------------------------------------------------------- | -| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge".Forge` | -| `Backend` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Backend` | +| Addon type | Return type | +| ---------- | -------------------------------------------------------------------------------- | +| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge".Forge` | +| `Backend` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Backend` | ## Compiling