From 908095075c59df9d92538775c99f392a40ddd39b Mon Sep 17 00:00:00 2001 From: Max Anurin Date: Wed, 5 Jun 2024 23:11:24 +0300 Subject: [PATCH 1/4] Single workflow mode. Configures the agent to exit(shutdown) after first workflow. --- cmd/agent/core/agent.go | 27 +++++++++++++++---- cmd/agent/core/flags.go | 6 +++++ .../docs/30-administration/15-agent-config.md | 5 ++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/cmd/agent/core/agent.go b/cmd/agent/core/agent.go index c845222dca9..a0e79c1f1a3 100644 --- a/cmd/agent/core/agent.go +++ b/cmd/agent/core/agent.go @@ -54,7 +54,14 @@ func run(c *cli.Context, backends []types.Backend) error { hostname, _ = os.Hostname() } - counter.Polling = c.Int("max-workflows") + parallel := c.Int("max-workflows") + singleWorkflow := c.Bool("single-workflow") + if singleWorkflow && parallel > 1 { + log.Warn().Msgf("max-workflows forced from %d to 1 due to agent running single workflow mode.", parallel) + parallel = 1 + } + + counter.Polling = parallel counter.Running = 0 if c.Bool("healthcheck") { @@ -148,7 +155,6 @@ func run(c *cli.Context, backends []types.Backend) error { } var wg sync.WaitGroup - parallel := c.Int("max-workflows") wg.Add(parallel) // new engine @@ -236,13 +242,24 @@ func run(c *cli.Context, backends []types.Backend) error { log.Error().Err(err).Msg("pipeline done with error") return } + + if singleWorkflow { + log.Info().Msg("shutdowning single workflow runner") + return + } } }() } - log.Info().Msgf( - "starting Woodpecker agent with version '%s' and backend '%s' using platform '%s' running up to %d pipelines in parallel", - version.String(), backendEngine.Name(), engInfo.Platform, parallel) + if singleWorkflow { + log.Info().Msgf( + "starting Woodpecker agent with version '%s' and backend '%s' using platform '%s' running up in single worflow mode", + version.String(), backendEngine.Name(), engInfo.Platform) + } else { + log.Info().Msgf( + "starting Woodpecker agent with version '%s' and backend '%s' using platform '%s' running up to %d pipelines in parallel", + version.String(), backendEngine.Name(), engInfo.Platform, parallel) + } wg.Wait() return nil diff --git a/cmd/agent/core/flags.go b/cmd/agent/core/flags.go index 1034438f28b..64111853cb4 100644 --- a/cmd/agent/core/flags.go +++ b/cmd/agent/core/flags.go @@ -69,6 +69,12 @@ var flags = []cli.Flag{ Usage: "agent parallel workflows", Value: 1, }, + &cli.BoolFlag{ + EnvVars: []string{"WOODPECKER_AGENT_SINGLE_WORKFLOW"}, + Name: "single-workflow", + Usage: "exit the agent after first workflow", + Value: false, + }, &cli.BoolFlag{ EnvVars: []string{"WOODPECKER_HEALTHCHECK"}, Name: "healthcheck", diff --git a/docs/docs/30-administration/15-agent-config.md b/docs/docs/30-administration/15-agent-config.md index 15792b38bdc..908d3cc49f5 100644 --- a/docs/docs/30-administration/15-agent-config.md +++ b/docs/docs/30-administration/15-agent-config.md @@ -120,6 +120,11 @@ Configures the path of the agent config file. Configures the number of parallel workflows. +### `WOODPECKER_AGENT_SINGLE_WORKFLOW` +> Default: `false` + +Configures the agent to exit(shutdown) after first workflow. When configured, `WOODPECKER_MAX_WORKFLOWS` is forced to 1. + ### `WOODPECKER_FILTER_LABELS` > Default: empty From 0e26350da28341380d5a221ec56a3850dc7bbef5 Mon Sep 17 00:00:00 2001 From: Max Anurin Date: Sat, 10 Aug 2024 21:03:20 +0300 Subject: [PATCH 2/4] Fix resolution of maxWorkflows --- cmd/agent/core/agent.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cmd/agent/core/agent.go b/cmd/agent/core/agent.go index f558e0b5fe6..d97dc7cecfb 100644 --- a/cmd/agent/core/agent.go +++ b/cmd/agent/core/agent.go @@ -86,14 +86,14 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error { hostname, _ = os.Hostname() } - parallel := int(c.Int("max-workflows")) + maxWorkflows := int(c.Int("max-workflows")) singleWorkflow := c.Bool("single-workflow") - if singleWorkflow && parallel > 1 { - log.Warn().Msgf("max-workflows forced from %d to 1 due to agent running single workflow mode.", parallel) - parallel = 1 + if singleWorkflow && maxWorkflows > 1 { + log.Warn().Msgf("max-workflows forced from %d to 1 due to agent running single workflow mode.", maxWorkflows) + maxWorkflows = 1 } - counter.Polling = parallel + counter.Polling = maxWorkflows counter.Running = 0 if c.Bool("healthcheck") { @@ -203,7 +203,6 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error { } log.Debug().Msgf("loaded %s backend engine", backendEngine.Name()) - maxWorkflows := int(c.Int("max-workflows")) agentConfig.AgentID, err = client.RegisterAgent(grpcCtx, engInfo.Platform, backendEngine.Name(), version.String(), maxWorkflows) //nolint:contextcheck if err != nil { return err @@ -299,8 +298,8 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error { } else { log.Info().Msgf( "starting Woodpecker agent with version '%s' and backend '%s' using platform '%s' running up to %d pipelines in parallel", - version.String(), backendEngine.Name(), engInfo.Platform, parallel) - } + version.String(), backendEngine.Name(), engInfo.Platform, maxWorkflows) + } return serviceWaitingGroup.Wait() } From e527ba3b4214b04b36f0b3efbc732bd173922321 Mon Sep 17 00:00:00 2001 From: Max Anurin Date: Sat, 10 Aug 2024 22:00:38 +0300 Subject: [PATCH 3/4] Force shutdown when runner routine exit --- cmd/agent/core/agent.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/agent/core/agent.go b/cmd/agent/core/agent.go index d97dc7cecfb..dfbebed232e 100644 --- a/cmd/agent/core/agent.go +++ b/cmd/agent/core/agent.go @@ -280,11 +280,15 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error { log.Debug().Msg("polling new steps") if err := runner.Run(agentCtx, shutdownCtx); err != nil { log.Error().Err(err).Msg("runner done with error") + if singleWorkflow { + ctxCancel(nil) + } return err } if singleWorkflow { log.Info().Msg("shutdown single workflow runner") + ctxCancel(nil) return nil } } From 5fb2babfb3d464308e14c67ac83cf0f71f59aa18 Mon Sep 17 00:00:00 2001 From: Max Anurin Date: Mon, 1 Sep 2025 16:59:37 +0300 Subject: [PATCH 4/4] Add DEV.md --- DEV.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 DEV.md diff --git a/DEV.md b/DEV.md new file mode 100644 index 00000000000..e8c8d3366b3 --- /dev/null +++ b/DEV.md @@ -0,0 +1,2 @@ +go mod vendor +make release-agent CI_COMMIT_TAG=v2.7.0-single-workflow-0