From 268c2db394ce5f909230fb150b6c9f3af4cc0fa8 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Wed, 24 Jan 2024 13:53:36 +0100 Subject: [PATCH 1/7] Modularize agent (wip) --- cli/exec/exec.go | 13 +++-- cmd/agent/{ => core}/agent.go | 65 +++++++---------------- cmd/agent/{ => core}/agent_test.go | 2 +- cmd/agent/{ => core}/config.go | 2 +- cmd/agent/{ => core}/config_test.go | 2 +- cmd/agent/{ => core}/flags.go | 2 +- cmd/agent/{ => core}/health.go | 2 +- cmd/agent/{ => core}/health_test.go | 2 +- cmd/agent/core/run.go | 48 +++++++++++++++++ cmd/agent/docker.go | 6 +++ cmd/agent/kubernetes.go | 7 +++ cmd/agent/local.go | 7 +++ cmd/agent/main.go | 31 +---------- pipeline/backend/backend.go | 2 +- pipeline/backend/docker/docker.go | 4 ++ pipeline/backend/kubernetes/kubernetes.go | 4 ++ pipeline/backend/local/local.go | 4 ++ pipeline/backend/types/backend.go | 5 ++ 18 files changed, 122 insertions(+), 86 deletions(-) rename cmd/agent/{ => core}/agent.go (83%) rename cmd/agent/{ => core}/agent_test.go (99%) rename cmd/agent/{ => core}/config.go (99%) rename cmd/agent/{ => core}/config_test.go (99%) rename cmd/agent/{ => core}/flags.go (99%) rename cmd/agent/{ => core}/health.go (99%) rename cmd/agent/{ => core}/health_test.go (99%) create mode 100644 cmd/agent/core/run.go create mode 100644 cmd/agent/docker.go create mode 100644 cmd/agent/kubernetes.go create mode 100644 cmd/agent/local.go diff --git a/cli/exec/exec.go b/cli/exec/exec.go index 7a28593168..91eb23f33f 100644 --- a/cli/exec/exec.go +++ b/cli/exec/exec.go @@ -30,7 +30,6 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/common" "go.woodpecker-ci.org/woodpecker/v2/pipeline" - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/docker" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/kubernetes" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" @@ -213,11 +212,15 @@ func execWithAxis(c *cli.Context, file, repoPath string, axis matrix.Axis) error } backendCtx := context.WithValue(c.Context, backendTypes.CliContext, c) - backend.Init() + backendsByName := map[string]backendTypes.Backend{ + "docker": docker.New(), + "local": local.New(), + kubernetes.EngineName: kubernetes.New(), + } - backendEngine, err := backend.FindBackend(backendCtx, c.String("backend-engine")) - if err != nil { - return err + backendEngine, ok := backendsByName[c.String("backend-engine")] + if !ok { + return fmt.Errorf("backend engine '%s' not found", c.String("backend-engine")) } if _, err = backendEngine.Load(backendCtx); err != nil { diff --git a/cmd/agent/agent.go b/cmd/agent/core/agent.go similarity index 83% rename from cmd/agent/agent.go rename to cmd/agent/core/agent.go index 4ee9ca0074..e42d2eb97d 100644 --- a/cmd/agent/agent.go +++ b/cmd/agent/core/agent.go @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package core import ( "context" @@ -39,17 +39,14 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/agent" agentRpc "go.woodpecker-ci.org/woodpecker/v2/agent/rpc" - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend" "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/woodpecker/v2/shared/addon/types" "go.woodpecker-ci.org/woodpecker/v2/shared/logger" "go.woodpecker-ci.org/woodpecker/v2/shared/utils" "go.woodpecker-ci.org/woodpecker/v2/version" ) -func run(c *cli.Context) error { +func run(c *cli.Context, backendEngine types.Backend) error { agentConfigPath := c.String("agent-config") hostname := c.String("hostname") if len(hostname) == 0 { @@ -155,11 +152,6 @@ func run(c *cli.Context) error { // new engine backendCtx := context.WithValue(ctx, types.CliContext, c) - backendEngine, err := getBackendEngine(backendCtx, c.String("backend-engine"), c.StringSlice("addons")) - if err != nil { - return err - } - if !backendEngine.IsAvailable(backendCtx) { log.Error().Str("engine", backendEngine.Name()).Msg("selected backend engine is unavailable") return fmt.Errorf("selected backend engine %s is unavailable", backendEngine.Name()) @@ -249,44 +241,27 @@ func run(c *cli.Context) error { return nil } -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") - return nil, err - } - if addonBackend != nil { - return addonBackend.Value, nil - } - - backend.Init() - engine, err := backend.FindBackend(backendCtx, backendName) - if err != nil { - log.Error().Err(err).Msgf("cannot find backend engine '%s'", backendName) - return nil, err - } - return engine, nil -} - -func runWithRetry(context *cli.Context) error { - if err := logger.SetupGlobalLogger(context, true); err != nil { - return err - } +func runWithRetry(backendEngine types.Backend) func(context *cli.Context) error { + return func(context *cli.Context) error { + if err := logger.SetupGlobalLogger(context, true); err != nil { + return err + } - initHealth() - - retryCount := context.Int("connect-retry-count") - retryDelay := context.Duration("connect-retry-delay") - var err error - for i := 0; i < retryCount; i++ { - if err = run(context); status.Code(err) == codes.Unavailable { - log.Warn().Err(err).Msg(fmt.Sprintf("cannot connect to server, retrying in %v", retryDelay)) - time.Sleep(retryDelay) - } else { - break + initHealth() + + retryCount := context.Int("connect-retry-count") + retryDelay := context.Duration("connect-retry-delay") + var err error + for i := 0; i < retryCount; i++ { + if err = run(context, backendEngine); status.Code(err) == codes.Unavailable { + log.Warn().Err(err).Msg(fmt.Sprintf("cannot connect to server, retrying in %v", retryDelay)) + time.Sleep(retryDelay) + } else { + break + } } + return err } - return err } func stringSliceAddToMap(sl []string, m map[string]string) error { diff --git a/cmd/agent/agent_test.go b/cmd/agent/core/agent_test.go similarity index 99% rename from cmd/agent/agent_test.go rename to cmd/agent/core/agent_test.go index 1e645e68de..8c3c92db47 100644 --- a/cmd/agent/agent_test.go +++ b/cmd/agent/core/agent_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package core import ( "testing" diff --git a/cmd/agent/config.go b/cmd/agent/core/config.go similarity index 99% rename from cmd/agent/config.go rename to cmd/agent/core/config.go index 61e700e1b0..f2bde30511 100644 --- a/cmd/agent/config.go +++ b/cmd/agent/core/config.go @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package core import ( "bytes" diff --git a/cmd/agent/config_test.go b/cmd/agent/core/config_test.go similarity index 99% rename from cmd/agent/config_test.go rename to cmd/agent/core/config_test.go index fa21ca6b1b..c3c94fd0bc 100644 --- a/cmd/agent/config_test.go +++ b/cmd/agent/core/config_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package core import ( "os" diff --git a/cmd/agent/flags.go b/cmd/agent/core/flags.go similarity index 99% rename from cmd/agent/flags.go rename to cmd/agent/core/flags.go index 0020d3ab0d..bc111d489f 100644 --- a/cmd/agent/flags.go +++ b/cmd/agent/core/flags.go @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package core import ( "os" diff --git a/cmd/agent/health.go b/cmd/agent/core/health.go similarity index 99% rename from cmd/agent/health.go rename to cmd/agent/core/health.go index 8c11589b61..80d5135eaf 100644 --- a/cmd/agent/health.go +++ b/cmd/agent/core/health.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package core import ( "encoding/json" diff --git a/cmd/agent/health_test.go b/cmd/agent/core/health_test.go similarity index 99% rename from cmd/agent/health_test.go rename to cmd/agent/core/health_test.go index 463928f762..326d37536a 100644 --- a/cmd/agent/health_test.go +++ b/cmd/agent/core/health_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package core import ( "testing" diff --git a/cmd/agent/core/run.go b/cmd/agent/core/run.go new file mode 100644 index 0000000000..b7edd133ad --- /dev/null +++ b/cmd/agent/core/run.go @@ -0,0 +1,48 @@ +// Copyright 2018 Drone.IO Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package core + +import ( + "os" + + _ "github.com/joho/godotenv/autoload" + "github.com/rs/zerolog/log" + "github.com/urfave/cli/v2" + + backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" + "go.woodpecker-ci.org/woodpecker/v2/shared/logger" + "go.woodpecker-ci.org/woodpecker/v2/shared/utils" + "go.woodpecker-ci.org/woodpecker/v2/version" +) + +func RunAgent(backend backend.Backend) { + app := cli.NewApp() + app.Name = "woodpecker-agent" + app.Version = version.String() + app.Usage = "woodpecker agent" + app.Action = runWithRetry(backend) + app.Commands = []*cli.Command{ + { + Name: "ping", + Usage: "ping the agent", + Action: pinger, + }, + } + app.Flags = utils.MergeSlices(flags, logger.GlobalLoggerFlags, backend.Flags()) + + if err := app.Run(os.Args); err != nil { + log.Fatal().Err(err).Msg("error running agent") //nolint:forbidigo + } +} diff --git a/cmd/agent/docker.go b/cmd/agent/docker.go new file mode 100644 index 0000000000..5abc8b6490 --- /dev/null +++ b/cmd/agent/docker.go @@ -0,0 +1,6 @@ +//go:build docker +package main + +import "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" + +var backend = local.New() diff --git a/cmd/agent/kubernetes.go b/cmd/agent/kubernetes.go new file mode 100644 index 0000000000..7ecf64de10 --- /dev/null +++ b/cmd/agent/kubernetes.go @@ -0,0 +1,7 @@ +//go:build kubernetes + +package main + +import "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" + +var backend = local.New() diff --git a/cmd/agent/local.go b/cmd/agent/local.go new file mode 100644 index 0000000000..9f83a75484 --- /dev/null +++ b/cmd/agent/local.go @@ -0,0 +1,7 @@ +//go:build !docker && !kubernetes + +package main + +import "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" + +var backend = local.New() diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 01bb60246c..0b3cc77abc 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -15,36 +15,9 @@ package main import ( - "os" - - _ "github.com/joho/godotenv/autoload" - "github.com/rs/zerolog/log" - "github.com/urfave/cli/v2" - - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/docker" - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/kubernetes" - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" - "go.woodpecker-ci.org/woodpecker/v2/shared/logger" - "go.woodpecker-ci.org/woodpecker/v2/shared/utils" - "go.woodpecker-ci.org/woodpecker/v2/version" + "go.woodpecker-ci.org/woodpecker/v2/cmd/agent/core" ) func main() { - app := cli.NewApp() - app.Name = "woodpecker-agent" - app.Version = version.String() - app.Usage = "woodpecker agent" - app.Action = runWithRetry - app.Commands = []*cli.Command{ - { - Name: "ping", - Usage: "ping the agent", - Action: pinger, - }, - } - app.Flags = utils.MergeSlices(flags, logger.GlobalLoggerFlags, docker.Flags, kubernetes.Flags, local.Flags) - - if err := app.Run(os.Args); err != nil { - log.Fatal().Err(err).Msg("error running agent") //nolint:forbidigo - } + core.RunAgent(backend) // TODO allow compiler option } diff --git a/pipeline/backend/backend.go b/pipeline/backend/backend.go index 99ecb69134..efe291cee3 100644 --- a/pipeline/backend/backend.go +++ b/pipeline/backend/backend.go @@ -29,7 +29,7 @@ var ( backends []types.Backend ) -func Init() { +func Init(backends []types.Backend) { backends = []types.Backend{ docker.New(), local.New(), diff --git a/pipeline/backend/docker/docker.go b/pipeline/backend/docker/docker.go index 2406910627..8a92deea5c 100644 --- a/pipeline/backend/docker/docker.go +++ b/pipeline/backend/docker/docker.go @@ -93,6 +93,10 @@ func httpClientOfOpts(dockerCertPath string, verifyTLS bool) *http.Client { } } +func (e *docker) Flags() []cli.Flag { + return Flags +} + // Load new client for Docker Backend using environment variables. func (e *docker) Load(ctx context.Context) (*backend.BackendInfo, error) { c, ok := ctx.Value(backend.CliContext).(*cli.Context) diff --git a/pipeline/backend/kubernetes/kubernetes.go b/pipeline/backend/kubernetes/kubernetes.go index 10c0ec841b..09bd7e9e66 100644 --- a/pipeline/backend/kubernetes/kubernetes.go +++ b/pipeline/backend/kubernetes/kubernetes.go @@ -129,6 +129,10 @@ func (e *kube) IsAvailable(context.Context) bool { return len(host) > 0 } +func (e *kube) Flags() []cli.Flag { + return Flags +} + func (e *kube) Load(ctx context.Context) (*types.BackendInfo, error) { config, err := configFromCliContext(ctx) if err != nil { diff --git a/pipeline/backend/local/local.go b/pipeline/backend/local/local.go index aee231c655..cd96b470c0 100644 --- a/pipeline/backend/local/local.go +++ b/pipeline/backend/local/local.go @@ -66,6 +66,10 @@ func (e *local) IsAvailable(context.Context) bool { return true } +func (e *local) Flags() []cli.Flag { + return Flags +} + func (e *local) Load(ctx context.Context) (*types.BackendInfo, error) { c, ok := ctx.Value(types.CliContext).(*cli.Context) if ok { diff --git a/pipeline/backend/types/backend.go b/pipeline/backend/types/backend.go index d6cfd09909..5bb765f5a8 100644 --- a/pipeline/backend/types/backend.go +++ b/pipeline/backend/types/backend.go @@ -17,6 +17,8 @@ package types import ( "context" "io" + + "github.com/urfave/cli/v2" ) // Backend defines a container orchestration backend and is used @@ -28,6 +30,9 @@ type Backend interface { // IsAvailable check if the backend is available. IsAvailable(ctx context.Context) bool + // Flags return the configuration flags of the backend. + Flags() []cli.Flag + // Load loads the backend engine. Load(ctx context.Context) (*BackendInfo, error) From 5ba8834435e97051ffd8edf690c124daea644ad1 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 28 Jan 2024 14:13:39 +0100 Subject: [PATCH 2/7] Add multi-backends back --- cli/exec/exec.go | 17 +++++++++-------- cmd/agent/core/agent.go | 14 +++++++++++--- cmd/agent/core/run.go | 10 +++++++--- cmd/agent/docker.go | 6 ------ cmd/agent/kubernetes.go | 7 ------- cmd/agent/local.go | 7 ------- cmd/agent/main.go | 10 +++++++++- pipeline/backend/backend.go | 9 --------- 8 files changed, 36 insertions(+), 44 deletions(-) delete mode 100644 cmd/agent/docker.go delete mode 100644 cmd/agent/kubernetes.go delete mode 100644 cmd/agent/local.go diff --git a/cli/exec/exec.go b/cli/exec/exec.go index 91eb23f33f..9fc374a39a 100644 --- a/cli/exec/exec.go +++ b/cli/exec/exec.go @@ -30,6 +30,7 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/common" "go.woodpecker-ci.org/woodpecker/v2/pipeline" + "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/docker" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/kubernetes" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" @@ -212,15 +213,15 @@ func execWithAxis(c *cli.Context, file, repoPath string, axis matrix.Axis) error } backendCtx := context.WithValue(c.Context, backendTypes.CliContext, c) - backendsByName := map[string]backendTypes.Backend{ - "docker": docker.New(), - "local": local.New(), - kubernetes.EngineName: kubernetes.New(), - } + backend.Init([]backendTypes.Backend{ + docker.New(), + local.New(), + kubernetes.New(), + }) - backendEngine, ok := backendsByName[c.String("backend-engine")] - if !ok { - return fmt.Errorf("backend engine '%s' not found", c.String("backend-engine")) + backendEngine, err := backend.FindBackend(backendCtx, c.String("backend-engine")) + if err != nil { + return err } if _, err = backendEngine.Load(backendCtx); err != nil { diff --git a/cmd/agent/core/agent.go b/cmd/agent/core/agent.go index e42d2eb97d..98fa215160 100644 --- a/cmd/agent/core/agent.go +++ b/cmd/agent/core/agent.go @@ -39,6 +39,7 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/agent" agentRpc "go.woodpecker-ci.org/woodpecker/v2/agent/rpc" + "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" "go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc" "go.woodpecker-ci.org/woodpecker/v2/shared/logger" @@ -46,7 +47,7 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/version" ) -func run(c *cli.Context, backendEngine types.Backend) error { +func run(c *cli.Context, backendEngines []types.Backend) error { agentConfigPath := c.String("agent-config") hostname := c.String("hostname") if len(hostname) == 0 { @@ -152,6 +153,13 @@ func run(c *cli.Context, backendEngine types.Backend) error { // new engine backendCtx := context.WithValue(ctx, types.CliContext, c) + backend.Init(backendEngines) + backendName := c.String("backend-engine") + backendEngine, err := backend.FindBackend(backendCtx, backendName) + if err != nil { + log.Error().Err(err).Msgf("cannot find backend engine '%s'", backendName) + return err + } if !backendEngine.IsAvailable(backendCtx) { log.Error().Str("engine", backendEngine.Name()).Msg("selected backend engine is unavailable") return fmt.Errorf("selected backend engine %s is unavailable", backendEngine.Name()) @@ -241,7 +249,7 @@ func run(c *cli.Context, backendEngine types.Backend) error { return nil } -func runWithRetry(backendEngine types.Backend) func(context *cli.Context) error { +func runWithRetry(backendEngines []types.Backend) func(context *cli.Context) error { return func(context *cli.Context) error { if err := logger.SetupGlobalLogger(context, true); err != nil { return err @@ -253,7 +261,7 @@ func runWithRetry(backendEngine types.Backend) func(context *cli.Context) error retryDelay := context.Duration("connect-retry-delay") var err error for i := 0; i < retryCount; i++ { - if err = run(context, backendEngine); status.Code(err) == codes.Unavailable { + if err = run(context, backendEngines); status.Code(err) == codes.Unavailable { log.Warn().Err(err).Msg(fmt.Sprintf("cannot connect to server, retrying in %v", retryDelay)) time.Sleep(retryDelay) } else { diff --git a/cmd/agent/core/run.go b/cmd/agent/core/run.go index b7edd133ad..d3541037a9 100644 --- a/cmd/agent/core/run.go +++ b/cmd/agent/core/run.go @@ -27,12 +27,12 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/version" ) -func RunAgent(backend backend.Backend) { +func RunAgent(backends []backend.Backend) { app := cli.NewApp() app.Name = "woodpecker-agent" app.Version = version.String() app.Usage = "woodpecker agent" - app.Action = runWithRetry(backend) + app.Action = runWithRetry(backends) app.Commands = []*cli.Command{ { Name: "ping", @@ -40,7 +40,11 @@ func RunAgent(backend backend.Backend) { Action: pinger, }, } - app.Flags = utils.MergeSlices(flags, logger.GlobalLoggerFlags, backend.Flags()) + agentFlags := utils.MergeSlices(flags, logger.GlobalLoggerFlags) + for _, b := range backends { + agentFlags = utils.MergeSlices(agentFlags, b.Flags()) + } + app.Flags = agentFlags if err := app.Run(os.Args); err != nil { log.Fatal().Err(err).Msg("error running agent") //nolint:forbidigo diff --git a/cmd/agent/docker.go b/cmd/agent/docker.go deleted file mode 100644 index 5abc8b6490..0000000000 --- a/cmd/agent/docker.go +++ /dev/null @@ -1,6 +0,0 @@ -//go:build docker -package main - -import "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" - -var backend = local.New() diff --git a/cmd/agent/kubernetes.go b/cmd/agent/kubernetes.go deleted file mode 100644 index 7ecf64de10..0000000000 --- a/cmd/agent/kubernetes.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build kubernetes - -package main - -import "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" - -var backend = local.New() diff --git a/cmd/agent/local.go b/cmd/agent/local.go deleted file mode 100644 index 9f83a75484..0000000000 --- a/cmd/agent/local.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build !docker && !kubernetes - -package main - -import "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" - -var backend = local.New() diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 0b3cc77abc..d83ba14007 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -16,8 +16,16 @@ package main import ( "go.woodpecker-ci.org/woodpecker/v2/cmd/agent/core" + "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/docker" + "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/kubernetes" + "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" + backendTypes "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" ) func main() { - core.RunAgent(backend) // TODO allow compiler option + core.RunAgent([]backendTypes.Backend{ + docker.New(), + local.New(), + kubernetes.New(), + }) } diff --git a/pipeline/backend/backend.go b/pipeline/backend/backend.go index efe291cee3..16688e9a30 100644 --- a/pipeline/backend/backend.go +++ b/pipeline/backend/backend.go @@ -18,9 +18,6 @@ import ( "context" "fmt" - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/docker" - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/kubernetes" - "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local" "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" ) @@ -30,12 +27,6 @@ var ( ) func Init(backends []types.Backend) { - backends = []types.Backend{ - docker.New(), - local.New(), - kubernetes.New(), - } - backendsByName = make(map[string]types.Backend) for _, engine := range backends { backendsByName[engine.Name()] = engine From 300f3f3331d3f167ae9b8096d41a29c1438aa538 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 28 Jan 2024 14:19:11 +0100 Subject: [PATCH 3/7] update docs --- cmd/agent/core/flags.go | 5 ---- .../75-addons/00-overview.md | 1 - .../75-addons/20-creating-addons.md | 1 - .../10-custom-agent-backends.md | 23 +++++++++++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 docs/docs/92-development/10-custom-agent-backends.md diff --git a/cmd/agent/core/flags.go b/cmd/agent/core/flags.go index bc111d489f..5e92f74be3 100644 --- a/cmd/agent/core/flags.go +++ b/cmd/agent/core/flags.go @@ -97,9 +97,4 @@ var flags = []cli.Flag{ Usage: "backend to run pipelines on", Value: "auto-detect", }, - &cli.StringSliceFlag{ - EnvVars: []string{"WOODPECKER_ADDONS"}, - Name: "addons", - Usage: "list of addon files", - }, } diff --git a/docs/docs/30-administration/75-addons/00-overview.md b/docs/docs/30-administration/75-addons/00-overview.md index 485f9ce84e..31c93e7824 100644 --- a/docs/docs/30-administration/75-addons/00-overview.md +++ b/docs/docs/30-administration/75-addons/00-overview.md @@ -13,7 +13,6 @@ To adapt Woodpecker to your needs beyond the [configuration](../10-server-config Addons can be used for: - Forges -- Agent backends - Config services - Secret services - Environment services 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 0fd6d2fe07..abae26587a 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,6 @@ 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` | -| `Backend` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Backend` | | `ConfigService` | `"go.woodpecker-ci.org/woodpecker/v2/server/plugins/config".Extension` | | `SecretService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".SecretService` | | `EnvironmentService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".EnvironmentService` | diff --git a/docs/docs/92-development/10-custom-agent-backends.md b/docs/docs/92-development/10-custom-agent-backends.md new file mode 100644 index 0000000000..dc1fd9d93d --- /dev/null +++ b/docs/docs/92-development/10-custom-agent-backends.md @@ -0,0 +1,23 @@ +# Custom agent backends + +If none of our backends fits your usecases, you can write your own. + +Therefore, implement the interface `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/pipeline/backend/types".Backend` and +build a custom agent using your backend with this `main.go`: + +```go +package main + +import ( + "go.woodpecker-ci.org/woodpecker/v2/cmd/agent/core" + backendTypes "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" +) + +func main() { + core.RunAgent([]backendTypes.Backend{ + yourBackend, + }) +} +``` + +It is also possible to use multiple backends, you can select with [`WOODPECKER_BACKEND`](../30-administration/15-agent-config.md#woodpecker_backend) between them. From ded2577785d9dd89f5e98df2eaa5f0234f18126e Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 28 Jan 2024 14:21:36 +0100 Subject: [PATCH 4/7] fix docs + copyright --- cmd/agent/core/run.go | 2 +- docs/docs/30-administration/15-agent-config.md | 6 ------ shared/addon/types/types.go | 1 - 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/cmd/agent/core/run.go b/cmd/agent/core/run.go index d3541037a9..90c3656eb7 100644 --- a/cmd/agent/core/run.go +++ b/cmd/agent/core/run.go @@ -1,4 +1,4 @@ -// Copyright 2018 Drone.IO Inc. +// Copyright 2024 Woodpecker Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/docs/docs/30-administration/15-agent-config.md b/docs/docs/30-administration/15-agent-config.md index 26005eaf5a..31a37ab1c7 100644 --- a/docs/docs/30-administration/15-agent-config.md +++ b/docs/docs/30-administration/15-agent-config.md @@ -168,12 +168,6 @@ 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-overview.md). - ### `WOODPECKER_BACKEND_DOCKER_*` See [Docker backend configuration](./22-backends/10-docker.md#configuration) diff --git a/shared/addon/types/types.go b/shared/addon/types/types.go index 158df423b1..3287efc575 100644 --- a/shared/addon/types/types.go +++ b/shared/addon/types/types.go @@ -4,7 +4,6 @@ type Type string const ( TypeForge Type = "forge" - TypeBackend Type = "backend" TypeConfigService Type = "config_service" TypeSecretService Type = "secret_service" TypeEnvironmentService Type = "environment_service" From 41d2a9b26540e9d27578a36d67a00b465a35dad7 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 28 Jan 2024 14:23:33 +0100 Subject: [PATCH 5/7] fix mdlint --- docs/docs/92-development/10-custom-agent-backends.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/92-development/10-custom-agent-backends.md b/docs/docs/92-development/10-custom-agent-backends.md index dc1fd9d93d..3514e73d9e 100644 --- a/docs/docs/92-development/10-custom-agent-backends.md +++ b/docs/docs/92-development/10-custom-agent-backends.md @@ -9,14 +9,14 @@ build a custom agent using your backend with this `main.go`: package main import ( - "go.woodpecker-ci.org/woodpecker/v2/cmd/agent/core" - backendTypes "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" + "go.woodpecker-ci.org/woodpecker/v2/cmd/agent/core" + backendTypes "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" ) func main() { - core.RunAgent([]backendTypes.Backend{ - yourBackend, - }) + core.RunAgent([]backendTypes.Backend{ + yourBackend, + }) } ``` From 844facb94ef98205c5416c3f755765464d772638 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 28 Jan 2024 14:30:06 +0100 Subject: [PATCH 6/7] prettier --- .../75-addons/20-creating-addons.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 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 abae26587a..8ad4fe3e9e 100644 --- a/docs/docs/30-administration/75-addons/20-creating-addons.md +++ b/docs/docs/30-administration/75-addons/20-creating-addons.md @@ -19,13 +19,13 @@ 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` | -| `ConfigService` | `"go.woodpecker-ci.org/woodpecker/v2/server/plugins/config".Extension` | -| `SecretService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".SecretService` | -| `EnvironmentService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".EnvironmentService` | -| `RegistryService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".RegistryService` | +| Addon type | Return type | +| -------------------- | ---------------------------------------------------------------------- | +| `Forge` | `"go.woodpecker-ci.org/woodpecker/woodpecker/v2/server/forge".Forge` | +| `ConfigService` | `"go.woodpecker-ci.org/woodpecker/v2/server/plugins/config".Extension` | +| `SecretService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".SecretService` | +| `EnvironmentService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".EnvironmentService` | +| `RegistryService` | `"go.woodpecker-ci.org/woodpecker/v2/server/model".RegistryService` | ### Using configurations From 9e403114337051f2de99d6c6c27f61cbb915bac4 Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Sun, 28 Jan 2024 14:40:58 +0100 Subject: [PATCH 7/7] Update run.go --- cmd/agent/core/run.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/agent/core/run.go b/cmd/agent/core/run.go index 90c3656eb7..b485f5019c 100644 --- a/cmd/agent/core/run.go +++ b/cmd/agent/core/run.go @@ -17,6 +17,7 @@ package core import ( "os" + // Load config from .env _ "github.com/joho/godotenv/autoload" "github.com/rs/zerolog/log" "github.com/urfave/cli/v2"