You've already forked woodpecker
							
							
				mirror of
				https://github.com/woodpecker-ci/woodpecker.git
				synced 2025-10-30 23:27:39 +02:00 
			
		
		
		
	Migrate to github.com/urfave/cli/v3 (#2951)
This commit is contained in:
		| @@ -15,7 +15,7 @@ | ||||
| package admin | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/admin/registry" | ||||
| ) | ||||
| @@ -24,7 +24,7 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "admin", | ||||
| 	Usage: "administer server settings", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		registry.Command, | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -15,14 +15,14 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| // Command exports the registry command set. | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "registry", | ||||
| 	Usage: "manage global registries", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		registryCreateCmd, | ||||
| 		registryDeleteCmd, | ||||
| 		registryUpdateCmd, | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -45,14 +46,14 @@ var registryCreateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryCreate(c *cli.Context) error { | ||||
| func registryCreate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		username = c.String("username") | ||||
| 		password = c.String("password") | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -38,13 +39,13 @@ var registryInfoCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryInfo(c *cli.Context) error { | ||||
| func registryInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		format   = c.String("format") + "\n" | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -33,10 +34,10 @@ var registryListCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryList(c *cli.Context) error { | ||||
| func registryList(ctx context.Context, c *cli.Command) error { | ||||
| 	format := c.String("format") + "\n" | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,9 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -33,10 +35,10 @@ var registryDeleteCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryDelete(c *cli.Context) error { | ||||
| func registryDelete(ctx context.Context, c *cli.Command) error { | ||||
| 	hostname := c.String("hostname") | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -47,14 +48,14 @@ var registryUpdateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryUpdate(c *cli.Context) error { | ||||
| func registryUpdate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		username = c.String("username") | ||||
| 		password = c.String("password") | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,49 +15,49 @@ | ||||
| package common | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/logger" | ||||
| ) | ||||
|  | ||||
| var GlobalFlags = append([]cli.Flag{ | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_CONFIG"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_CONFIG"), | ||||
| 		Name:    "config", | ||||
| 		Aliases: []string{"c"}, | ||||
| 		Usage:   "path to config file", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SERVER"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SERVER"), | ||||
| 		Name:    "server", | ||||
| 		Aliases: []string{"s"}, | ||||
| 		Usage:   "server address", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_TOKEN"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_TOKEN"), | ||||
| 		Name:    "token", | ||||
| 		Aliases: []string{"t"}, | ||||
| 		Usage:   "server auth token", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DISABLE_UPDATE_CHECK"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DISABLE_UPDATE_CHECK"), | ||||
| 		Name:    "disable-update-check", | ||||
| 		Usage:   "disable update check", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SKIP_VERIFY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SKIP_VERIFY"), | ||||
| 		Name:    "skip-verify", | ||||
| 		Usage:   "skip ssl verification", | ||||
| 		Hidden:  true, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"SOCKS_PROXY"}, | ||||
| 		Sources: cli.EnvVars("SOCKS_PROXY"), | ||||
| 		Name:    "socks-proxy", | ||||
| 		Usage:   "socks proxy address", | ||||
| 		Hidden:  true, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"SOCKS_PROXY_OFF"}, | ||||
| 		Sources: cli.EnvVars("SOCKS_PROXY_OFF"), | ||||
| 		Name:    "socks-proxy-off", | ||||
| 		Usage:   "socks proxy ignored", | ||||
| 		Hidden:  true, | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal/config" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/update" | ||||
| @@ -17,12 +17,12 @@ var ( | ||||
| 	cancelWaitForUpdate context.CancelCauseFunc | ||||
| ) | ||||
|  | ||||
| func Before(c *cli.Context) error { | ||||
| 	if err := setupGlobalLogger(c); err != nil { | ||||
| func Before(ctx context.Context, c *cli.Command) error { | ||||
| 	if err := setupGlobalLogger(ctx, c); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	go func() { | ||||
| 	go func(context.Context) { | ||||
| 		if c.Bool("disable-update-check") { | ||||
| 			return | ||||
| 		} | ||||
| @@ -37,23 +37,23 @@ func Before(c *cli.Context) error { | ||||
|  | ||||
| 		log.Debug().Msg("Checking for updates ...") | ||||
|  | ||||
| 		newVersion, err := update.CheckForUpdate(waitForUpdateCheck, false) | ||||
| 		newVersion, err := update.CheckForUpdate(waitForUpdateCheck, false) //nolint:contextcheck | ||||
| 		if err != nil { | ||||
| 			log.Error().Err(err).Msgf("Failed to check for updates") | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		if newVersion != nil { | ||||
| 			log.Warn().Msgf("A new version of woodpecker-cli is available: %s. Update by running: %s update", newVersion.Version, c.App.Name) | ||||
| 			log.Warn().Msgf("A new version of woodpecker-cli is available: %s. Update by running: %s update", newVersion.Version, c.Root().Name) | ||||
| 		} else { | ||||
| 			log.Debug().Msgf("No update required") | ||||
| 		} | ||||
| 	}() | ||||
| 	}(ctx) | ||||
|  | ||||
| 	return config.Load(c) | ||||
| 	return config.Load(ctx, c) | ||||
| } | ||||
|  | ||||
| func After(_ *cli.Context) error { | ||||
| func After(_ context.Context, _ *cli.Command) error { | ||||
| 	if waitForUpdateCheck != nil { | ||||
| 		select { | ||||
| 		case <-waitForUpdateCheck.Done(): | ||||
|   | ||||
| @@ -15,11 +15,12 @@ | ||||
| package common | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/constant" | ||||
| ) | ||||
| @@ -37,16 +38,16 @@ func DetectPipelineConfig() (isDir bool, config string, _ error) { | ||||
| 	return false, "", fmt.Errorf("could not detect pipeline config") | ||||
| } | ||||
|  | ||||
| func RunPipelineFunc(c *cli.Context, fileFunc, dirFunc func(*cli.Context, string) error) error { | ||||
| func RunPipelineFunc(ctx context.Context, c *cli.Command, fileFunc, dirFunc func(context.Context, *cli.Command, string) error) error { | ||||
| 	if c.Args().Len() == 0 { | ||||
| 		isDir, path, err := DetectPipelineConfig() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if isDir { | ||||
| 			return dirFunc(c, path) | ||||
| 			return dirFunc(ctx, c, path) | ||||
| 		} | ||||
| 		return fileFunc(c, path) | ||||
| 		return fileFunc(ctx, c, path) | ||||
| 	} | ||||
|  | ||||
| 	multiArgs := c.Args().Len() > 1 | ||||
| @@ -59,11 +60,11 @@ func RunPipelineFunc(c *cli.Context, fileFunc, dirFunc func(*cli.Context, string | ||||
| 			fmt.Println("#", fi.Name()) | ||||
| 		} | ||||
| 		if fi.IsDir() { | ||||
| 			if err := dirFunc(c, arg); err != nil { | ||||
| 			if err := dirFunc(ctx, c, arg); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} else { | ||||
| 			if err := fileFunc(c, arg); err != nil { | ||||
| 			if err := fileFunc(ctx, c, arg); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -15,11 +15,13 @@ | ||||
| package common | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/logger" | ||||
| ) | ||||
|  | ||||
| func setupGlobalLogger(c *cli.Context) error { | ||||
| 	return logger.SetupGlobalLogger(c, false) | ||||
| func setupGlobalLogger(ctx context.Context, c *cli.Command) error { | ||||
| 	return logger.SetupGlobalLogger(ctx, c, false) | ||||
| } | ||||
|   | ||||
| @@ -15,14 +15,14 @@ | ||||
| package cron | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| // Command exports the cron command set. | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "cron", | ||||
| 	Usage: "manage cron jobs", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		cronCreateCmd, | ||||
| 		cronDeleteCmd, | ||||
| 		cronUpdateCmd, | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package cron | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -50,9 +51,9 @@ var cronCreateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func cronCreate(c *cli.Context) error { | ||||
| func cronCreate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		jobName          = c.String("name") | ||||
| 		cronName         = c.String("name") | ||||
| 		branch           = c.String("branch") | ||||
| 		schedule         = c.String("schedule") | ||||
| 		repoIDOrFullName = c.String("repository") | ||||
| @@ -62,7 +63,7 @@ func cronCreate(c *cli.Context) error { | ||||
| 		repoIDOrFullName = c.Args().First() | ||||
| 	} | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -73,7 +74,7 @@ func cronCreate(c *cli.Context) error { | ||||
| 	} | ||||
|  | ||||
| 	cron := &woodpecker.Cron{ | ||||
| 		Name:     jobName, | ||||
| 		Name:     cronName, | ||||
| 		Branch:   branch, | ||||
| 		Schedule: schedule, | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package cron | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -40,16 +41,16 @@ var cronInfoCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func cronInfo(c *cli.Context) error { | ||||
| func cronInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		jobID            = c.Int64("id") | ||||
| 		cronID           = c.Int("id") | ||||
| 		repoIDOrFullName = c.String("repository") | ||||
| 		format           = c.String("format") + "\n" | ||||
| 	) | ||||
| 	if repoIDOrFullName == "" { | ||||
| 		repoIDOrFullName = c.Args().First() | ||||
| 	} | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -58,7 +59,7 @@ func cronInfo(c *cli.Context) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	cron, err := client.CronGet(repoID, jobID) | ||||
| 	cron, err := client.CronGet(repoID, cronID) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package cron | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -35,7 +36,7 @@ var cronListCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func cronList(c *cli.Context) error { | ||||
| func cronList(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		format           = c.String("format") + "\n" | ||||
| 		repoIDOrFullName = c.String("repository") | ||||
| @@ -43,7 +44,7 @@ func cronList(c *cli.Context) error { | ||||
| 	if repoIDOrFullName == "" { | ||||
| 		repoIDOrFullName = c.Args().First() | ||||
| 	} | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package cron | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -38,15 +39,15 @@ var cronDeleteCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func cronDelete(c *cli.Context) error { | ||||
| func cronDelete(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		jobID            = c.Int64("id") | ||||
| 		cronID           = c.Int("id") | ||||
| 		repoIDOrFullName = c.String("repository") | ||||
| 	) | ||||
| 	if repoIDOrFullName == "" { | ||||
| 		repoIDOrFullName = c.Args().First() | ||||
| 	} | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -54,7 +55,7 @@ func cronDelete(c *cli.Context) error { | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err = client.CronDelete(repoID, jobID) | ||||
| 	err = client.CronDelete(repoID, cronID) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package cron | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -53,10 +54,10 @@ var cronUpdateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func cronUpdate(c *cli.Context) error { | ||||
| func cronUpdate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		repoIDOrFullName = c.String("repository") | ||||
| 		jobID            = c.Int64("id") | ||||
| 		cronID           = c.Int("id") | ||||
| 		jobName          = c.String("name") | ||||
| 		branch           = c.String("branch") | ||||
| 		schedule         = c.String("schedule") | ||||
| @@ -65,7 +66,7 @@ func cronUpdate(c *cli.Context) error { | ||||
| 	if repoIDOrFullName == "" { | ||||
| 		repoIDOrFullName = c.Args().First() | ||||
| 	} | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -74,7 +75,7 @@ func cronUpdate(c *cli.Context) error { | ||||
| 		return err | ||||
| 	} | ||||
| 	cron := &woodpecker.Cron{ | ||||
| 		ID:       jobID, | ||||
| 		ID:       cronID, | ||||
| 		Name:     jobName, | ||||
| 		Branch:   branch, | ||||
| 		Schedule: schedule, | ||||
|   | ||||
| @@ -15,12 +15,13 @@ | ||||
| package deploy | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -57,8 +58,8 @@ var Command = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func deploy(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func deploy(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -26,7 +26,7 @@ import ( | ||||
|  | ||||
| 	"github.com/drone/envsubst" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/lint" | ||||
| @@ -59,11 +59,11 @@ var backends = []backend_types.Backend{ | ||||
| 	local.New(), | ||||
| } | ||||
|  | ||||
| func run(c *cli.Context) error { | ||||
| 	return common.RunPipelineFunc(c, execFile, execDir) | ||||
| func run(ctx context.Context, c *cli.Command) error { | ||||
| 	return common.RunPipelineFunc(ctx, c, execFile, execDir) | ||||
| } | ||||
|  | ||||
| func execDir(c *cli.Context, dir string) error { | ||||
| func execDir(ctx context.Context, c *cli.Command, dir string) error { | ||||
| 	// TODO: respect pipeline dependency | ||||
| 	repoPath := c.String("repo-path") | ||||
| 	if repoPath != "" { | ||||
| @@ -82,7 +82,7 @@ func execDir(c *cli.Context, dir string) error { | ||||
| 		// check if it is a regular file (not dir) | ||||
| 		if info.Mode().IsRegular() && (strings.HasSuffix(info.Name(), ".yaml") || strings.HasSuffix(info.Name(), ".yml")) { | ||||
| 			fmt.Println("#", info.Name()) | ||||
| 			_ = runExec(c, path, repoPath) // TODO: should we drop errors or store them and report back? | ||||
| 			_ = runExec(ctx, c, path, repoPath) // TODO: should we drop errors or store them and report back? | ||||
| 			fmt.Println("") | ||||
| 			return nil | ||||
| 		} | ||||
| @@ -91,7 +91,7 @@ func execDir(c *cli.Context, dir string) error { | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func execFile(c *cli.Context, file string) error { | ||||
| func execFile(ctx context.Context, c *cli.Command, file string) error { | ||||
| 	repoPath := c.String("repo-path") | ||||
| 	if repoPath != "" { | ||||
| 		repoPath, _ = filepath.Abs(repoPath) | ||||
| @@ -101,10 +101,10 @@ func execFile(c *cli.Context, file string) error { | ||||
| 	if runtime.GOOS == "windows" { | ||||
| 		repoPath = convertPathForWindows(repoPath) | ||||
| 	} | ||||
| 	return runExec(c, file, repoPath) | ||||
| 	return runExec(ctx, c, file, repoPath) | ||||
| } | ||||
|  | ||||
| func runExec(c *cli.Context, file, repoPath string) error { | ||||
| func runExec(ctx context.Context, c *cli.Command, file, repoPath string) error { | ||||
| 	dat, err := os.ReadFile(file) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @@ -119,7 +119,7 @@ func runExec(c *cli.Context, file, repoPath string) error { | ||||
| 		axes = append(axes, matrix.Axis{}) | ||||
| 	} | ||||
| 	for _, axis := range axes { | ||||
| 		err := execWithAxis(c, file, repoPath, axis) | ||||
| 		err := execWithAxis(ctx, c, file, repoPath, axis) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -127,8 +127,8 @@ func runExec(c *cli.Context, file, repoPath string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func execWithAxis(c *cli.Context, file, repoPath string, axis matrix.Axis) error { | ||||
| 	metadata := metadataFromContext(c, axis) | ||||
| func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, axis matrix.Axis) error { | ||||
| 	metadata := metadataFromContext(ctx, c, axis) | ||||
| 	environ := metadata.Environ() | ||||
| 	var secrets []compiler.Secret | ||||
| 	for key, val := range metadata.Workflow.Matrix { | ||||
| @@ -235,7 +235,7 @@ func execWithAxis(c *cli.Context, file, repoPath string, axis matrix.Axis) error | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	backendCtx := context.WithValue(c.Context, backend_types.CliContext, c) | ||||
| 	backendCtx := context.WithValue(ctx, backend_types.CliCommand, c) | ||||
| 	backendEngine, err := backend.FindBackend(backendCtx, backends, c.String("backend-engine")) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @@ -245,21 +245,21 @@ func execWithAxis(c *cli.Context, file, repoPath string, axis matrix.Axis) error | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	ctx, cancel := context.WithTimeout(context.Background(), c.Duration("timeout")) | ||||
| 	pipelineCtx, cancel := context.WithTimeout(context.Background(), c.Duration("timeout")) | ||||
| 	defer cancel() | ||||
| 	ctx = utils.WithContextSigtermCallback(ctx, func() { | ||||
| 		fmt.Println("ctrl+c received, terminating process") | ||||
| 	pipelineCtx = utils.WithContextSigtermCallback(pipelineCtx, func() { | ||||
| 		fmt.Printf("ctrl+c received, terminating current pipeline '%s'\n", confStr) | ||||
| 	}) | ||||
|  | ||||
| 	return pipeline.New(compiled, | ||||
| 		pipeline.WithContext(ctx), | ||||
| 		pipeline.WithContext(pipelineCtx), //nolint:contextcheck | ||||
| 		pipeline.WithTracer(pipeline.DefaultTracer), | ||||
| 		pipeline.WithLogger(defaultLogger), | ||||
| 		pipeline.WithBackend(backendEngine), | ||||
| 		pipeline.WithDescription(map[string]string{ | ||||
| 			"CLI": "exec", | ||||
| 		}), | ||||
| 	).Run(c.Context) | ||||
| 	).Run(ctx) | ||||
| } | ||||
|  | ||||
| // convertPathForWindows converts a path to use slash separators | ||||
|   | ||||
| @@ -17,41 +17,41 @@ package exec | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/constant" | ||||
| ) | ||||
|  | ||||
| var flags = []cli.Flag{ | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LOCAL"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LOCAL"), | ||||
| 		Name:    "local", | ||||
| 		Usage:   "run from local directory", | ||||
| 		Value:   true, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_REPO_PATH"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_REPO_PATH"), | ||||
| 		Name:    "repo-path", | ||||
| 		Usage:   "path to local repository", | ||||
| 	}, | ||||
| 	&cli.DurationFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_TIMEOUT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_TIMEOUT"), | ||||
| 		Name:    "timeout", | ||||
| 		Usage:   "pipeline timeout", | ||||
| 		Value:   time.Hour, | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_VOLUMES"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_VOLUMES"), | ||||
| 		Name:    "volumes", | ||||
| 		Usage:   "pipeline volumes", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_NETWORKS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_NETWORKS"), | ||||
| 		Name:    "network", | ||||
| 		Usage:   "external networks", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_PREFIX"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_PREFIX"), | ||||
| 		Name:    "prefix", | ||||
| 		Value:   "woodpecker", | ||||
| 		Usage:   "prefix used for containers, volumes, networks, ... created by woodpecker", | ||||
| @@ -60,10 +60,10 @@ var flags = []cli.Flag{ | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		Name:  "privileged", | ||||
| 		Usage: "privileged plugins", | ||||
| 		Value: cli.NewStringSlice(constant.PrivilegedPlugins...), | ||||
| 		Value: constant.PrivilegedPlugins, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND"), | ||||
| 		Name:    "backend-engine", | ||||
| 		Usage:   "backend engine to run pipelines on", | ||||
| 		Value:   "auto-detect", | ||||
| @@ -73,17 +73,17 @@ var flags = []cli.Flag{ | ||||
| 	// backend options for pipeline compiler | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_NO_PROXY", "NO_PROXY", "no_proxy"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_NO_PROXY", "NO_PROXY", "no_proxy"), | ||||
| 		Usage:   "if set, pass the environment variable down as \"NO_PROXY\" to steps", | ||||
| 		Name:    "backend-no-proxy", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_HTTP_PROXY", "HTTP_PROXY", "http_proxy"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_HTTP_PROXY", "HTTP_PROXY", "http_proxy"), | ||||
| 		Usage:   "if set, pass the environment variable down as \"HTTP_PROXY\" to steps", | ||||
| 		Name:    "backend-http-proxy", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_HTTPS_PROXY", "HTTPS_PROXY", "https_proxy"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_HTTPS_PROXY", "HTTPS_PROXY", "https_proxy"), | ||||
| 		Usage:   "if set, pass the environment variable down as \"HTTPS_PROXY\" to steps", | ||||
| 		Name:    "backend-https-proxy", | ||||
| 	}, | ||||
| @@ -97,12 +97,12 @@ var flags = []cli.Flag{ | ||||
| 	// workspace default | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_WORKSPACE_BASE"}, | ||||
| 		Sources: cli.EnvVars("CI_WORKSPACE_BASE"), | ||||
| 		Name:    "workspace-base", | ||||
| 		Value:   "/woodpecker", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_WORKSPACE_PATH"}, | ||||
| 		Sources: cli.EnvVars("CI_WORKSPACE_PATH"), | ||||
| 		Name:    "workspace-path", | ||||
| 		Value:   "src", | ||||
| 	}, | ||||
| @@ -110,218 +110,218 @@ var flags = []cli.Flag{ | ||||
| 	// netrc parameters | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_NETRC_USERNAME"}, | ||||
| 		Sources: cli.EnvVars("CI_NETRC_USERNAME"), | ||||
| 		Name:    "netrc-username", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_NETRC_PASSWORD"}, | ||||
| 		Sources: cli.EnvVars("CI_NETRC_PASSWORD"), | ||||
| 		Name:    "netrc-password", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_NETRC_MACHINE"}, | ||||
| 		Sources: cli.EnvVars("CI_NETRC_MACHINE"), | ||||
| 		Name:    "netrc-machine", | ||||
| 	}, | ||||
| 	// | ||||
| 	// metadata parameters | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_SYSTEM_PLATFORM"}, | ||||
| 		Sources: cli.EnvVars("CI_SYSTEM_PLATFORM"), | ||||
| 		Name:    "system-platform", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_SYSTEM_NAME"}, | ||||
| 		Sources: cli.EnvVars("CI_SYSTEM_NAME"), | ||||
| 		Name:    "system-name", | ||||
| 		Value:   "woodpecker", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_SYSTEM_URL"}, | ||||
| 		Sources: cli.EnvVars("CI_SYSTEM_URL"), | ||||
| 		Name:    "system-url", | ||||
| 		Value:   "https://github.com/woodpecker-ci/woodpecker", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_REPO"}, | ||||
| 		Sources: cli.EnvVars("CI_REPO"), | ||||
| 		Name:    "repo", | ||||
| 		Usage:   "full repo name", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_REPO_REMOTE_ID"}, | ||||
| 		Sources: cli.EnvVars("CI_REPO_REMOTE_ID"), | ||||
| 		Name:    "repo-remote-id", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_REPO_URL"}, | ||||
| 		Sources: cli.EnvVars("CI_REPO_URL"), | ||||
| 		Name:    "repo-url", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_REPO_CLONE_URL"}, | ||||
| 		Sources: cli.EnvVars("CI_REPO_CLONE_URL"), | ||||
| 		Name:    "repo-clone-url", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_REPO_CLONE_SSH_URL"}, | ||||
| 		Sources: cli.EnvVars("CI_REPO_CLONE_SSH_URL"), | ||||
| 		Name:    "repo-clone-ssh-url", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_REPO_PRIVATE"}, | ||||
| 		Sources: cli.EnvVars("CI_REPO_PRIVATE"), | ||||
| 		Name:    "repo-private", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"CI_REPO_TRUSTED"}, | ||||
| 		Sources: cli.EnvVars("CI_REPO_TRUSTED"), | ||||
| 		Name:    "repo-trusted", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_NUMBER"}, | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_NUMBER"), | ||||
| 		Name:    "pipeline-number", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_PARENT"}, | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_PARENT"), | ||||
| 		Name:    "pipeline-parent", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_CREATED"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_CREATED"), | ||||
| 		Name:    "pipeline-created", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_STARTED"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_STARTED"), | ||||
| 		Name:    "pipeline-started", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_FINISHED"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_FINISHED"), | ||||
| 		Name:    "pipeline-finished", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_STATUS"}, | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_STATUS"), | ||||
| 		Name:    "pipeline-status", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_EVENT"}, | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_EVENT"), | ||||
| 		Name:    "pipeline-event", | ||||
| 		Value:   "manual", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_URL"}, | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_URL"), | ||||
| 		Name:    "pipeline-url", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_DEPLOY_TARGET", "CI_PIPELINE_TARGET"}, // TODO: remove CI_PIPELINE_TARGET in 3.x | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_DEPLOY_TARGET", "CI_PIPELINE_TARGET"), // TODO: remove CI_PIPELINE_TARGET in 3.x | ||||
| 		Name:    "pipeline-deploy-to", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PIPELINE_DEPLOY_TASK", "CI_PIPELINE_TASK"}, // TODO: remove CI_PIPELINE_TASK in 3.x | ||||
| 		Sources: cli.EnvVars("CI_PIPELINE_DEPLOY_TASK", "CI_PIPELINE_TASK"), // TODO: remove CI_PIPELINE_TASK in 3.x | ||||
| 		Name:    "pipeline-deploy-task", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_SHA"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_SHA"), | ||||
| 		Name:    "commit-sha", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_REF"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_REF"), | ||||
| 		Name:    "commit-ref", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_REFSPEC"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_REFSPEC"), | ||||
| 		Name:    "commit-refspec", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_BRANCH"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_BRANCH"), | ||||
| 		Name:    "commit-branch", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_MESSAGE"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_MESSAGE"), | ||||
| 		Name:    "commit-message", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_AUTHOR_NAME"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_AUTHOR_NAME"), | ||||
| 		Name:    "commit-author-name", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_AUTHOR_AVATAR"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_AUTHOR_AVATAR"), | ||||
| 		Name:    "commit-author-avatar", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_COMMIT_AUTHOR_EMAIL"}, | ||||
| 		Sources: cli.EnvVars("CI_COMMIT_AUTHOR_EMAIL"), | ||||
| 		Name:    "commit-author-email", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_PIPELINE_NUMBER"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_PIPELINE_NUMBER"), | ||||
| 		Name:    "prev-pipeline-number", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"CI_PREV_PIPELINE_CREATED"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("CI_PREV_PIPELINE_CREATED"), | ||||
| 		Name:    "prev-pipeline-created", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"CI_PREV_PIPELINE_STARTED"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("CI_PREV_PIPELINE_STARTED"), | ||||
| 		Name:    "prev-pipeline-started", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"CI_PREV_PIPELINE_FINISHED"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("CI_PREV_PIPELINE_FINISHED"), | ||||
| 		Name:    "prev-pipeline-finished", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_PIPELINE_STATUS"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_PIPELINE_STATUS"), | ||||
| 		Name:    "prev-pipeline-status", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_PIPELINE_EVENT"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_PIPELINE_EVENT"), | ||||
| 		Name:    "prev-pipeline-event", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_PIPELINE_URL"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_PIPELINE_URL"), | ||||
| 		Name:    "prev-pipeline-url", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_SHA"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_SHA"), | ||||
| 		Name:    "prev-commit-sha", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_REF"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_REF"), | ||||
| 		Name:    "prev-commit-ref", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_REFSPEC"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_REFSPEC"), | ||||
| 		Name:    "prev-commit-refspec", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_BRANCH"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_BRANCH"), | ||||
| 		Name:    "prev-commit-branch", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_MESSAGE"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_MESSAGE"), | ||||
| 		Name:    "prev-commit-message", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_AUTHOR_NAME"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_NAME"), | ||||
| 		Name:    "prev-commit-author-name", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_AUTHOR_AVATAR"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_AVATAR"), | ||||
| 		Name:    "prev-commit-author-avatar", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_PREV_COMMIT_AUTHOR_EMAIL"}, | ||||
| 		Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_EMAIL"), | ||||
| 		Name:    "prev-commit-author-email", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"CI_WORKFLOW_NAME"}, | ||||
| 		Sources: cli.EnvVars("CI_WORKFLOW_NAME"), | ||||
| 		Name:    "workflow-name", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"CI_WORKFLOW_NUMBER"}, | ||||
| 		Sources: cli.EnvVars("CI_WORKFLOW_NUMBER"), | ||||
| 		Name:    "workflow-number", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"CI_STEP_NAME"}, | ||||
| 		Sources: cli.EnvVars("CI_STEP_NAME"), | ||||
| 		Name:    "step-name", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"CI_ENV"}, | ||||
| 		Sources: cli.EnvVars("CI_ENV"), | ||||
| 		Name:    "env", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_FORGE_TYPE"}, | ||||
| 		Sources: cli.EnvVars("CI_FORGE_TYPE"), | ||||
| 		Name:    "forge-type", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"CI_FORGE_URL"}, | ||||
| 		Sources: cli.EnvVars("CI_FORGE_URL"), | ||||
| 		Name:    "forge-url", | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package exec | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"runtime" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/metadata" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/matrix" | ||||
| @@ -26,7 +27,7 @@ import ( | ||||
| ) | ||||
|  | ||||
| // return the metadata from the cli context. | ||||
| func metadataFromContext(c *cli.Context, axis matrix.Axis) metadata.Metadata { | ||||
| func metadataFromContext(_ context.Context, c *cli.Command, axis matrix.Axis) metadata.Metadata { | ||||
| 	platform := c.String("system-platform") | ||||
| 	if platform == "" { | ||||
| 		platform = runtime.GOOS + "/" + runtime.GOARCH | ||||
| @@ -52,11 +53,11 @@ func metadataFromContext(c *cli.Context, axis matrix.Axis) metadata.Metadata { | ||||
| 			Trusted:     c.Bool("repo-trusted"), | ||||
| 		}, | ||||
| 		Curr: metadata.Pipeline{ | ||||
| 			Number:     c.Int64("pipeline-number"), | ||||
| 			Parent:     c.Int64("pipeline-parent"), | ||||
| 			Created:    c.Int64("pipeline-created"), | ||||
| 			Started:    c.Int64("pipeline-started"), | ||||
| 			Finished:   c.Int64("pipeline-finished"), | ||||
| 			Number:     c.Int("pipeline-number"), | ||||
| 			Parent:     c.Int("pipeline-parent"), | ||||
| 			Created:    c.Int("pipeline-created"), | ||||
| 			Started:    c.Int("pipeline-started"), | ||||
| 			Finished:   c.Int("pipeline-finished"), | ||||
| 			Status:     c.String("pipeline-status"), | ||||
| 			Event:      c.String("pipeline-event"), | ||||
| 			ForgeURL:   c.String("pipeline-url"), | ||||
| @@ -76,10 +77,10 @@ func metadataFromContext(c *cli.Context, axis matrix.Axis) metadata.Metadata { | ||||
| 			}, | ||||
| 		}, | ||||
| 		Prev: metadata.Pipeline{ | ||||
| 			Number:   c.Int64("prev-pipeline-number"), | ||||
| 			Created:  c.Int64("prev-pipeline-created"), | ||||
| 			Started:  c.Int64("prev-pipeline-started"), | ||||
| 			Finished: c.Int64("prev-pipeline-finished"), | ||||
| 			Number:   c.Int("prev-pipeline-number"), | ||||
| 			Created:  c.Int("prev-pipeline-created"), | ||||
| 			Started:  c.Int("prev-pipeline-started"), | ||||
| 			Finished: c.Int("prev-pipeline-finished"), | ||||
| 			Status:   c.String("prev-pipeline-status"), | ||||
| 			Event:    c.String("prev-pipeline-event"), | ||||
| 			ForgeURL: c.String("prev-pipeline-url"), | ||||
| @@ -98,12 +99,12 @@ func metadataFromContext(c *cli.Context, axis matrix.Axis) metadata.Metadata { | ||||
| 		}, | ||||
| 		Workflow: metadata.Workflow{ | ||||
| 			Name:   c.String("workflow-name"), | ||||
| 			Number: c.Int("workflow-number"), | ||||
| 			Number: int(c.Int("workflow-number")), | ||||
| 			Matrix: axis, | ||||
| 		}, | ||||
| 		Step: metadata.Step{ | ||||
| 			Name:   c.String("step-name"), | ||||
| 			Number: c.Int("step-number"), | ||||
| 			Number: int(c.Int("step-number")), | ||||
| 		}, | ||||
| 		Sys: metadata.System{ | ||||
| 			Name:     c.String("system-name"), | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package info | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -33,8 +34,8 @@ var Command = &cli.Command{ | ||||
| 	Flags:     []cli.Flag{common.FormatFlag(tmplInfo, true)}, | ||||
| } | ||||
|  | ||||
| func info(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func info(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package config | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"os" | ||||
| @@ -8,7 +9,7 @@ import ( | ||||
|  | ||||
| 	"github.com/adrg/xdg" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| 	"github.com/zalando/go-keyring" | ||||
| ) | ||||
|  | ||||
| @@ -32,12 +33,12 @@ func (c *Config) MergeIfNotSet(c2 *Config) { | ||||
|  | ||||
| var skipSetupForCommands = []string{"setup", "help", "h", "version", "update", "lint", "exec", ""} | ||||
|  | ||||
| func Load(c *cli.Context) error { | ||||
| func Load(ctx context.Context, c *cli.Command) error { | ||||
| 	if firstArg := c.Args().First(); slices.Contains(skipSetupForCommands, firstArg) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	config, err := Get(c, c.String("config")) | ||||
| 	config, err := Get(ctx, c, c.String("config")) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -80,11 +81,11 @@ func getConfigPath(configPath string) (string, error) { | ||||
| 	return configPath, nil | ||||
| } | ||||
|  | ||||
| func Get(ctx *cli.Context, _configPath string) (*Config, error) { | ||||
| 	c := &Config{ | ||||
| 		LogLevel:  ctx.String("log-level"), | ||||
| 		Token:     ctx.String("token"), | ||||
| 		ServerURL: ctx.String("server"), | ||||
| func Get(_ context.Context, c *cli.Command, _configPath string) (*Config, error) { | ||||
| 	conf := &Config{ | ||||
| 		LogLevel:  c.String("log-level"), | ||||
| 		Token:     c.String("token"), | ||||
| 		ServerURL: c.String("server"), | ||||
| 	} | ||||
|  | ||||
| 	configPath, err := getConfigPath(_configPath) | ||||
| @@ -109,33 +110,33 @@ func Get(ctx *cli.Context, _configPath string) (*Config, error) { | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		c.MergeIfNotSet(configFromFile) | ||||
| 		conf.MergeIfNotSet(configFromFile) | ||||
| 		log.Debug().Msg("Loaded config from file") | ||||
| 	} | ||||
|  | ||||
| 	// if server or token are explicitly set, use them | ||||
| 	if ctx.IsSet("server") || ctx.IsSet("token") { | ||||
| 		return c, nil | ||||
| 	if c.IsSet("server") || c.IsSet("token") { | ||||
| 		return conf, nil | ||||
| 	} | ||||
|  | ||||
| 	// load token from keyring | ||||
| 	service := ctx.App.Name | ||||
| 	secret, err := keyring.Get(service, c.ServerURL) | ||||
| 	service := c.Root().Name | ||||
| 	secret, err := keyring.Get(service, conf.ServerURL) | ||||
| 	if errors.Is(err, keyring.ErrUnsupportedPlatform) { | ||||
| 		log.Warn().Msg("Keyring is not supported on this platform") | ||||
| 		return c, nil | ||||
| 		return conf, nil | ||||
| 	} | ||||
| 	if errors.Is(err, keyring.ErrNotFound) { | ||||
| 		log.Warn().Msg("Token not found in keyring") | ||||
| 		return c, nil | ||||
| 		return conf, nil | ||||
| 	} | ||||
| 	c.Token = secret | ||||
| 	conf.Token = secret | ||||
|  | ||||
| 	return c, nil | ||||
| 	return conf, nil | ||||
| } | ||||
|  | ||||
| func Save(ctx *cli.Context, _configPath string, c *Config) error { | ||||
| 	config, err := json.Marshal(c) | ||||
| func Save(_ context.Context, c *cli.Command, _configPath string, conf *Config) error { | ||||
| 	config, err := json.Marshal(conf) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -146,8 +147,8 @@ func Save(ctx *cli.Context, _configPath string, c *Config) error { | ||||
| 	} | ||||
|  | ||||
| 	// save token to keyring | ||||
| 	service := ctx.App.Name | ||||
| 	err = keyring.Set(service, c.ServerURL, c.Token) | ||||
| 	service := c.Root().Name | ||||
| 	err = keyring.Set(service, conf.ServerURL, conf.Token) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,6 +15,7 @@ | ||||
| package internal | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/tls" | ||||
| 	"crypto/x509" | ||||
| 	"fmt" | ||||
| @@ -25,7 +26,7 @@ import ( | ||||
|  | ||||
| 	vsc_url "github.com/gitsight/go-vcsurl" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| 	"golang.org/x/net/proxy" | ||||
| 	"golang.org/x/oauth2" | ||||
|  | ||||
| @@ -33,7 +34,7 @@ import ( | ||||
| ) | ||||
|  | ||||
| // NewClient returns a new client from the CLI context. | ||||
| func NewClient(c *cli.Context) (woodpecker.Client, error) { | ||||
| func NewClient(ctx context.Context, c *cli.Command) (woodpecker.Client, error) { | ||||
| 	var ( | ||||
| 		skip     = c.Bool("skip-verify") | ||||
| 		socks    = c.String("socks-proxy") | ||||
| @@ -63,8 +64,7 @@ func NewClient(c *cli.Context) (woodpecker.Client, error) { | ||||
| 	} | ||||
|  | ||||
| 	config := new(oauth2.Config) | ||||
| 	client := config.Client( | ||||
| 		c.Context, | ||||
| 	client := config.Client(ctx, | ||||
| 		&oauth2.Token{ | ||||
| 			AccessToken: token, | ||||
| 		}, | ||||
|   | ||||
| @@ -15,13 +15,14 @@ | ||||
| package lint | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml" | ||||
| @@ -36,11 +37,11 @@ var Command = &cli.Command{ | ||||
| 	Action:    lint, | ||||
| } | ||||
|  | ||||
| func lint(c *cli.Context) error { | ||||
| 	return common.RunPipelineFunc(c, lintFile, lintDir) | ||||
| func lint(ctx context.Context, c *cli.Command) error { | ||||
| 	return common.RunPipelineFunc(ctx, c, lintFile, lintDir) | ||||
| } | ||||
|  | ||||
| func lintDir(c *cli.Context, dir string) error { | ||||
| func lintDir(ctx context.Context, c *cli.Command, dir string) error { | ||||
| 	var errorStrings []string | ||||
| 	if err := filepath.Walk(dir, func(path string, info os.FileInfo, e error) error { | ||||
| 		if e != nil { | ||||
| @@ -50,7 +51,7 @@ func lintDir(c *cli.Context, dir string) error { | ||||
| 		// check if it is a regular file (not dir) | ||||
| 		if info.Mode().IsRegular() && (strings.HasSuffix(info.Name(), ".yaml") || strings.HasSuffix(info.Name(), ".yml")) { | ||||
| 			fmt.Println("#", info.Name()) | ||||
| 			if err := lintFile(c, path); err != nil { | ||||
| 			if err := lintFile(ctx, c, path); err != nil { | ||||
| 				errorStrings = append(errorStrings, err.Error()) | ||||
| 			} | ||||
| 			fmt.Println("") | ||||
| @@ -68,7 +69,7 @@ func lintDir(c *cli.Context, dir string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func lintFile(_ *cli.Context, file string) error { | ||||
| func lintFile(_ context.Context, _ *cli.Command, file string) error { | ||||
| 	fi, err := os.Open(file) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
|   | ||||
| @@ -15,14 +15,14 @@ | ||||
| package log | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| // Command exports the log command set. | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "log", | ||||
| 	Usage: "manage logs", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		logPurgeCmd, | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package log | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -30,8 +31,8 @@ var logPurgeCmd = &cli.Command{ | ||||
| 	Action:    logPurge, | ||||
| } | ||||
|  | ||||
| func logPurge(c *cli.Context) (err error) { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func logPurge(ctx context.Context, c *cli.Command) (err error) { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,11 @@ | ||||
| package loglevel | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/rs/zerolog" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -31,8 +33,8 @@ var Command = &cli.Command{ | ||||
| 	Action:    logLevel, | ||||
| } | ||||
|  | ||||
| func logLevel(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func logLevel(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| package org | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/org/registry" | ||||
| ) | ||||
| @@ -24,7 +24,7 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "org", | ||||
| 	Usage: "manage organizations", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		registry.Command, | ||||
| 	}, | ||||
| } | ||||
|   | ||||
| @@ -17,7 +17,7 @@ package registry | ||||
| import ( | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| ) | ||||
| @@ -26,7 +26,7 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "registry", | ||||
| 	Usage: "manage organization registries", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		registryCreateCmd, | ||||
| 		registryDeleteCmd, | ||||
| 		registryUpdateCmd, | ||||
| @@ -35,7 +35,7 @@ var Command = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func parseTargetArgs(client woodpecker.Client, c *cli.Context) (orgID int64, err error) { | ||||
| func parseTargetArgs(client woodpecker.Client, c *cli.Command) (orgID int64, err error) { | ||||
| 	orgIDOrName := c.String("organization") | ||||
| 	if orgIDOrName == "" { | ||||
| 		orgIDOrName = c.Args().First() | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -48,14 +49,14 @@ var registryCreateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryCreate(c *cli.Context) error { | ||||
| func registryCreate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		username = c.String("username") | ||||
| 		password = c.String("password") | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -40,13 +41,13 @@ var registryInfoCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryInfo(c *cli.Context) error { | ||||
| func registryInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		format   = c.String("format") + "\n" | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -35,10 +36,10 @@ var registryListCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryList(c *cli.Context) error { | ||||
| func registryList(ctx context.Context, c *cli.Command) error { | ||||
| 	format := c.String("format") + "\n" | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,9 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -36,10 +38,10 @@ var registryDeleteCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryDelete(c *cli.Context) error { | ||||
| func registryDelete(ctx context.Context, c *cli.Command) error { | ||||
| 	hostname := c.String("hostname") | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -48,14 +49,14 @@ var registryUpdateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryUpdate(c *cli.Context) error { | ||||
| func registryUpdate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		username = c.String("username") | ||||
| 		password = c.String("password") | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -30,9 +31,9 @@ var pipelineApproveCmd = &cli.Command{ | ||||
| 	Action:    pipelineApprove, | ||||
| } | ||||
|  | ||||
| func pipelineApprove(c *cli.Context) (err error) { | ||||
| func pipelineApprove(ctx context.Context, c *cli.Command) (err error) { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -42,9 +43,9 @@ var pipelineCreateCmd = &cli.Command{ | ||||
| 	}...), | ||||
| } | ||||
|  | ||||
| func pipelineCreate(c *cli.Context) error { | ||||
| func pipelineCreate(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -30,9 +31,9 @@ var pipelineDeclineCmd = &cli.Command{ | ||||
| 	Action:    pipelineDecline, | ||||
| } | ||||
|  | ||||
| func pipelineDecline(c *cli.Context) (err error) { | ||||
| func pipelineDecline(ctx context.Context, c *cli.Command) (err error) { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -32,9 +33,9 @@ var pipelineInfoCmd = &cli.Command{ | ||||
| 	Flags:     common.OutputFlags("table"), | ||||
| } | ||||
|  | ||||
| func pipelineInfo(c *cli.Context) error { | ||||
| func pipelineInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -31,14 +32,14 @@ var pipelineKillCmd = &cli.Command{ | ||||
| 	Hidden:    true, | ||||
| } | ||||
|  | ||||
| func pipelineKill(c *cli.Context) (err error) { | ||||
| func pipelineKill(ctx context.Context, c *cli.Command) (err error) { | ||||
| 	number, err := strconv.ParseInt(c.Args().Get(1), 10, 64) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,9 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -36,9 +38,9 @@ var pipelineLastCmd = &cli.Command{ | ||||
| 	}...), | ||||
| } | ||||
|  | ||||
| func pipelineLast(c *cli.Context) error { | ||||
| func pipelineLast(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,9 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -49,19 +51,19 @@ var pipelineListCmd = &cli.Command{ | ||||
| 	}...), | ||||
| } | ||||
|  | ||||
| func List(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func List(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	resources, err := pipelineList(c, client) | ||||
| 	resources, err := pipelineList(ctx, c, client) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return pipelineOutput(c, resources) | ||||
| } | ||||
|  | ||||
| func pipelineList(c *cli.Context, client woodpecker.Client) ([]woodpecker.Pipeline, error) { | ||||
| func pipelineList(_ context.Context, c *cli.Command, client woodpecker.Client) ([]woodpecker.Pipeline, error) { | ||||
| 	resources := make([]woodpecker.Pipeline, 0) | ||||
|  | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| @@ -78,7 +80,7 @@ func pipelineList(c *cli.Context, client woodpecker.Client) ([]woodpecker.Pipeli | ||||
| 	branch := c.String("branch") | ||||
| 	event := c.String("event") | ||||
| 	status := c.String("status") | ||||
| 	limit := c.Int("limit") | ||||
| 	limit := int(c.Int("limit")) | ||||
|  | ||||
| 	var count int | ||||
| 	for _, pipeline := range pipelines { | ||||
|   | ||||
| @@ -1,13 +1,14 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/stretchr/testify/mock" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker/mocks" | ||||
| @@ -109,12 +110,10 @@ func TestPipelineList(t *testing.T) { | ||||
| 			mockClient.On("PipelineList", mock.Anything).Return(tt.pipelines, tt.pipelineErr) | ||||
| 			mockClient.On("RepoLookup", mock.Anything).Return(&woodpecker.Repo{ID: tt.repoID}, nil) | ||||
|  | ||||
| 			app := &cli.App{Writer: io.Discard} | ||||
| 			c := cli.NewContext(app, nil, nil) | ||||
|  | ||||
| 			command := pipelineListCmd | ||||
| 			command.Action = func(c *cli.Context) error { | ||||
| 				pipelines, err := pipelineList(c, mockClient) | ||||
| 			command.Writer = io.Discard | ||||
| 			command.Action = func(ctx context.Context, c *cli.Command) error { | ||||
| 				pipelines, err := pipelineList(ctx, c, mockClient) | ||||
| 				if tt.wantErr != nil { | ||||
| 					assert.EqualError(t, err, tt.wantErr.Error()) | ||||
| 					return nil | ||||
| @@ -126,7 +125,7 @@ func TestPipelineList(t *testing.T) { | ||||
| 				return nil | ||||
| 			} | ||||
|  | ||||
| 			_ = command.Run(c, tt.args...) | ||||
| 			_ = command.Run(context.Background(), tt.args) | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -30,9 +31,9 @@ var pipelineLogsCmd = &cli.Command{ | ||||
| 	Action:    pipelineLogs, | ||||
| } | ||||
|  | ||||
| func pipelineLogs(c *cli.Context) error { | ||||
| func pipelineLogs(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import ( | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/output" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -30,7 +30,7 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "pipeline", | ||||
| 	Usage: "manage pipelines", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		pipelineListCmd, | ||||
| 		pipelineLastCmd, | ||||
| 		pipelineLogsCmd, | ||||
| @@ -46,7 +46,7 @@ var Command = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func pipelineOutput(c *cli.Context, resources []woodpecker.Pipeline, fd ...io.Writer) error { | ||||
| func pipelineOutput(c *cli.Command, resources []woodpecker.Pipeline, fd ...io.Writer) error { | ||||
| 	outFmt, outOpt := output.ParseOutputOptions(c.String("output")) | ||||
| 	noHeader := c.Bool("output-no-headers") | ||||
|  | ||||
|   | ||||
| @@ -2,11 +2,12 @@ package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -59,28 +60,27 @@ func TestPipelineOutput(t *testing.T) { | ||||
|  | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			app := &cli.App{Writer: io.Discard} | ||||
| 			c := cli.NewContext(app, nil, nil) | ||||
| 			command := &cli.Command{ | ||||
| 				Writer: io.Discard, | ||||
| 				Name:   "output", | ||||
| 				Flags:  common.OutputFlags("table"), | ||||
| 				Action: func(_ context.Context, c *cli.Command) error { | ||||
| 					var buf bytes.Buffer | ||||
| 					err := pipelineOutput(c, pipelines, &buf) | ||||
|  | ||||
| 			command := &cli.Command{} | ||||
| 			command.Name = "output" | ||||
| 			command.Flags = common.OutputFlags("table") | ||||
| 			command.Action = func(c *cli.Context) error { | ||||
| 				var buf bytes.Buffer | ||||
| 				err := pipelineOutput(c, pipelines, &buf) | ||||
| 					if tt.wantErr { | ||||
| 						assert.Error(t, err) | ||||
| 						return nil | ||||
| 					} | ||||
|  | ||||
| 					assert.NoError(t, err) | ||||
| 					assert.Equal(t, tt.expected, buf.String()) | ||||
|  | ||||
| 				if tt.wantErr { | ||||
| 					assert.Error(t, err) | ||||
| 					return nil | ||||
| 				} | ||||
|  | ||||
| 				assert.NoError(t, err) | ||||
| 				assert.Equal(t, tt.expected, buf.String()) | ||||
|  | ||||
| 				return nil | ||||
| 				}, | ||||
| 			} | ||||
|  | ||||
| 			_ = command.Run(c, tt.args...) | ||||
| 			_ = command.Run(context.Background(), tt.args) | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -15,11 +15,12 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -33,9 +34,9 @@ var pipelinePsCmd = &cli.Command{ | ||||
| 	Flags:     []cli.Flag{common.FormatFlag(tmplPipelinePs)}, | ||||
| } | ||||
|  | ||||
| func pipelinePs(c *cli.Context) error { | ||||
| func pipelinePs(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,11 +15,12 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -33,8 +34,8 @@ var pipelineQueueCmd = &cli.Command{ | ||||
| 	Flags:     []cli.Flag{common.FormatFlag(tmplPipelineQueue)}, | ||||
| } | ||||
|  | ||||
| func pipelineQueue(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func pipelineQueue(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,11 +15,12 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -38,9 +39,9 @@ var pipelineStartCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func pipelineStart(c *cli.Context) (err error) { | ||||
| func pipelineStart(ctx context.Context, c *cli.Command) (err error) { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package pipeline | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -30,9 +31,9 @@ var pipelineStopCmd = &cli.Command{ | ||||
| 	Action:    pipelineStop, | ||||
| } | ||||
|  | ||||
| func pipelineStop(c *cli.Context) (err error) { | ||||
| func pipelineStop(ctx context.Context, c *cli.Command) (err error) { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -25,7 +25,7 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "registry", | ||||
| 	Usage: "manage registries", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		registryCreateCmd, | ||||
| 		registryDeleteCmd, | ||||
| 		registryUpdateCmd, | ||||
| @@ -34,7 +34,7 @@ var Command = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func parseTargetArgs(client woodpecker.Client, c *cli.Context) (repoID int64, err error) { | ||||
| func parseTargetArgs(client woodpecker.Client, c *cli.Command) (repoID int64, err error) { | ||||
| 	repoIDOrFullName := c.String("repository") | ||||
| 	if repoIDOrFullName == "" { | ||||
| 		repoIDOrFullName = c.Args().First() | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -48,14 +49,14 @@ var registryCreateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryCreate(c *cli.Context) error { | ||||
| func registryCreate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		username = c.String("username") | ||||
| 		password = c.String("password") | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -40,13 +41,13 @@ var registryInfoCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryInfo(c *cli.Context) error { | ||||
| func registryInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		format   = c.String("format") + "\n" | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -35,10 +36,10 @@ var registryListCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryList(c *cli.Context) error { | ||||
| func registryList(ctx context.Context, c *cli.Command) error { | ||||
| 	format := c.String("format") + "\n" | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,9 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -36,10 +38,10 @@ var registryDeleteCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryDelete(c *cli.Context) error { | ||||
| func registryDelete(ctx context.Context, c *cli.Command) error { | ||||
| 	hostname := c.String("hostname") | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -48,14 +49,14 @@ var registryUpdateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func registryUpdate(c *cli.Context) error { | ||||
| func registryUpdate(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		hostname = c.String("hostname") | ||||
| 		username = c.String("username") | ||||
| 		password = c.String("password") | ||||
| 	) | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/repo/registry" | ||||
| ) | ||||
| @@ -24,7 +24,7 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "repo", | ||||
| 	Usage: "manage repositories", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		repoListCmd, | ||||
| 		repoInfoCmd, | ||||
| 		repoAddCmd, | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -30,14 +31,14 @@ var repoAddCmd = &cli.Command{ | ||||
| 	Action:    repoAdd, | ||||
| } | ||||
|  | ||||
| func repoAdd(c *cli.Context) error { | ||||
| func repoAdd(ctx context.Context, c *cli.Command) error { | ||||
| 	_forgeRemoteID := c.Args().First() | ||||
| 	forgeRemoteID, err := strconv.Atoi(_forgeRemoteID) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("invalid forge remote id: %s", _forgeRemoteID) | ||||
| 	} | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -29,9 +30,9 @@ var repoChownCmd = &cli.Command{ | ||||
| 	Action:    repoChown, | ||||
| } | ||||
|  | ||||
| func repoChown(c *cli.Context) error { | ||||
| func repoChown(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -32,9 +33,9 @@ var repoInfoCmd = &cli.Command{ | ||||
| 	Flags:     []cli.Flag{common.FormatFlag(tmplRepoInfo)}, | ||||
| } | ||||
|  | ||||
| func repoInfo(c *cli.Context) error { | ||||
| func repoInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -38,8 +39,8 @@ var repoListCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func repoList(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func repoList(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -29,9 +30,9 @@ var repoRepairCmd = &cli.Command{ | ||||
| 	Action:    repoRepair, | ||||
| } | ||||
|  | ||||
| func repoRepair(c *cli.Context) error { | ||||
| func repoRepair(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -29,9 +30,9 @@ var repoRemoveCmd = &cli.Command{ | ||||
| 	Action:    repoRemove, | ||||
| } | ||||
|  | ||||
| func repoRemove(c *cli.Context) error { | ||||
| func repoRemove(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -33,8 +34,8 @@ var repoSyncCmd = &cli.Command{ | ||||
| } | ||||
|  | ||||
| // TODO: remove this and add an option to the list cmd as we do not store the remote repo list anymore | ||||
| func repoSync(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func repoSync(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -61,9 +62,9 @@ var repoUpdateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func repoUpdate(c *cli.Context) error { | ||||
| func repoUpdate(ctx context.Context, c *cli.Command) error { | ||||
| 	repoIDOrFullName := c.Args().First() | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -78,7 +79,7 @@ func repoUpdate(c *cli.Context) error { | ||||
| 		timeout         = c.Duration("timeout") | ||||
| 		trusted         = c.Bool("trusted") | ||||
| 		gated           = c.Bool("gated") | ||||
| 		pipelineCounter = c.Int("pipeline-counter") | ||||
| 		pipelineCounter = int(c.Int("pipeline-counter")) | ||||
| 		unsafe          = c.Bool("unsafe") | ||||
| 	) | ||||
|  | ||||
|   | ||||
| @@ -19,7 +19,7 @@ import ( | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -29,7 +29,7 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "secret", | ||||
| 	Usage: "manage secrets", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		secretCreateCmd, | ||||
| 		secretDeleteCmd, | ||||
| 		secretUpdateCmd, | ||||
| @@ -38,7 +38,7 @@ var Command = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func parseTargetArgs(client woodpecker.Client, c *cli.Context) (global bool, orgID, repoID int64, err error) { | ||||
| func parseTargetArgs(client woodpecker.Client, c *cli.Command) (global bool, orgID, repoID int64, err error) { | ||||
| 	if c.Bool("global") { | ||||
| 		return true, -1, -1, nil | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package secret | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -56,8 +57,8 @@ var secretCreateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func secretCreate(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func secretCreate(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package secret | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -45,12 +46,12 @@ var secretInfoCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func secretInfo(c *cli.Context) error { | ||||
| func secretInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	var ( | ||||
| 		secretName = c.String("name") | ||||
| 		format     = c.String("format") + "\n" | ||||
| 	) | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,11 +15,12 @@ | ||||
| package secret | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"html/template" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -42,10 +43,10 @@ var secretListCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func secretList(c *cli.Context) error { | ||||
| func secretList(ctx context.Context, c *cli.Command) error { | ||||
| 	format := c.String("format") + "\n" | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,7 +15,9 @@ | ||||
| package secret | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -40,10 +42,10 @@ var secretDeleteCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func secretDelete(c *cli.Context) error { | ||||
| func secretDelete(ctx context.Context, c *cli.Command) error { | ||||
| 	secretName := c.String("name") | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package secret | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -56,8 +57,8 @@ var secretUpdateCmd = &cli.Command{ | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func secretUpdate(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func secretUpdate(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -1,11 +1,12 @@ | ||||
| package setup | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal/config" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/setup/ui" | ||||
| @@ -15,7 +16,6 @@ import ( | ||||
| var Command = &cli.Command{ | ||||
| 	Name:      "setup", | ||||
| 	Usage:     "setup the woodpecker-cli for the first time", | ||||
| 	Args:      true, | ||||
| 	ArgsUsage: "[server]", | ||||
| 	Flags: []cli.Flag{ | ||||
| 		&cli.StringFlag{ | ||||
| @@ -30,8 +30,8 @@ var Command = &cli.Command{ | ||||
| 	Action: setup, | ||||
| } | ||||
|  | ||||
| func setup(c *cli.Context) error { | ||||
| 	_config, err := config.Get(c, c.String("config")) | ||||
| func setup(ctx context.Context, c *cli.Command) error { | ||||
| 	_config, err := config.Get(ctx, c, c.String("config")) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} else if _config != nil { | ||||
| @@ -68,7 +68,7 @@ func setup(c *cli.Context) error { | ||||
|  | ||||
| 	token := c.String("token") | ||||
| 	if token == "" { | ||||
| 		token, err = receiveTokenFromUI(c.Context, serverURL) | ||||
| 		token, err = receiveTokenFromUI(ctx, serverURL) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -78,7 +78,7 @@ func setup(c *cli.Context) error { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	err = config.Save(c, c.String("config"), &config.Config{ | ||||
| 	err = config.Save(ctx, c, c.String("config"), &config.Config{ | ||||
| 		ServerURL: serverURL, | ||||
| 		Token:     token, | ||||
| 		LogLevel:  "info", | ||||
|   | ||||
| @@ -1,12 +1,13 @@ | ||||
| package update | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| // Command exports the update command. | ||||
| @@ -22,10 +23,10 @@ var Command = &cli.Command{ | ||||
| 	Action: update, | ||||
| } | ||||
|  | ||||
| func update(c *cli.Context) error { | ||||
| func update(ctx context.Context, c *cli.Command) error { | ||||
| 	log.Info().Msg("Checking for updates ...") | ||||
|  | ||||
| 	newVersion, err := CheckForUpdate(c.Context, c.Bool("force")) | ||||
| 	newVersion, err := CheckForUpdate(ctx, c.Bool("force")) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -38,7 +39,7 @@ func update(c *cli.Context) error { | ||||
| 	log.Info().Msgf("New version %s is available! Updating ...", newVersion.Version) | ||||
|  | ||||
| 	var tarFilePath string | ||||
| 	tarFilePath, err = downloadNewVersion(c.Context, newVersion.AssetURL) | ||||
| 	tarFilePath, err = downloadNewVersion(ctx, newVersion.AssetURL) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,14 +15,14 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| // Command exports the user command set. | ||||
| var Command = &cli.Command{ | ||||
| 	Name:  "user", | ||||
| 	Usage: "manage users", | ||||
| 	Subcommands: []*cli.Command{ | ||||
| 	Commands: []*cli.Command{ | ||||
| 		userListCmd, | ||||
| 		userInfoCmd, | ||||
| 		userAddCmd, | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" | ||||
| @@ -30,10 +31,10 @@ var userAddCmd = &cli.Command{ | ||||
| 	Action:    userAdd, | ||||
| } | ||||
|  | ||||
| func userAdd(c *cli.Context) error { | ||||
| func userAdd(ctx context.Context, c *cli.Command) error { | ||||
| 	login := c.Args().First() | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,11 +15,12 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -33,8 +34,8 @@ var userInfoCmd = &cli.Command{ | ||||
| 	Flags:     []cli.Flag{common.FormatFlag(tmplUserInfo)}, | ||||
| } | ||||
|  | ||||
| func userInfo(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func userInfo(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,10 +15,11 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| @@ -32,8 +33,8 @@ var userListCmd = &cli.Command{ | ||||
| 	Flags:     []cli.Flag{common.FormatFlag(tmplUserList)}, | ||||
| } | ||||
|  | ||||
| func userList(c *cli.Context) error { | ||||
| 	client, err := internal.NewClient(c) | ||||
| func userList(ctx context.Context, c *cli.Command) error { | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -15,9 +15,10 @@ | ||||
| package user | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/internal" | ||||
| ) | ||||
| @@ -29,10 +30,10 @@ var userRemoveCmd = &cli.Command{ | ||||
| 	Action:    userRemove, | ||||
| } | ||||
|  | ||||
| func userRemove(c *cli.Context) error { | ||||
| func userRemove(ctx context.Context, c *cli.Command) error { | ||||
| 	login := c.Args().First() | ||||
|  | ||||
| 	client, err := internal.NewClient(c) | ||||
| 	client, err := internal.NewClient(ctx, c) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -27,7 +27,7 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| 	"golang.org/x/sync/errgroup" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| @@ -62,11 +62,7 @@ var ( | ||||
| 	shutdownCtx                                = context.Background() | ||||
| ) | ||||
|  | ||||
| func run(c *cli.Context, backends []types.Backend) error { | ||||
| 	ctx := utils.WithContextSigtermCallback(c.Context, func() { | ||||
| 		log.Info().Msg("termination signal is received, shutting down agent") | ||||
| 	}) | ||||
|  | ||||
| func run(ctx context.Context, c *cli.Command, backends []types.Backend) error { | ||||
| 	agentCtx, ctxCancel := context.WithCancelCause(ctx) | ||||
| 	stopAgentFunc = func(err error) { | ||||
| 		msg := "shutdown of whole agent" | ||||
| @@ -90,7 +86,7 @@ func run(c *cli.Context, backends []types.Backend) error { | ||||
| 		hostname, _ = os.Hostname() | ||||
| 	} | ||||
|  | ||||
| 	counter.Polling = c.Int("max-workflows") | ||||
| 	counter.Polling = int(c.Int("max-workflows")) | ||||
| 	counter.Running = 0 | ||||
|  | ||||
| 	if c.Bool("healthcheck") { | ||||
| @@ -139,7 +135,7 @@ func run(c *cli.Context, backends []types.Backend) error { | ||||
| 	grpcClientCtx, grpcClientCtxCancel := context.WithCancelCause(context.Background()) | ||||
| 	defer grpcClientCtxCancel(nil) | ||||
| 	authClient := agent_rpc.NewAuthGrpcClient(authConn, agentToken, agentConfig.AgentID) | ||||
| 	authInterceptor, err := agent_rpc.NewAuthInterceptor(grpcClientCtx, authClient, authInterceptorRefreshInterval) | ||||
| 	authInterceptor, err := agent_rpc.NewAuthInterceptor(grpcClientCtx, authClient, authInterceptorRefreshInterval) //nolint:contextcheck | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -165,7 +161,7 @@ func run(c *cli.Context, backends []types.Backend) error { | ||||
| 	grpcCtx := metadata.NewOutgoingContext(grpcClientCtx, metadata.Pairs("hostname", hostname)) | ||||
|  | ||||
| 	// check if grpc server version is compatible with agent | ||||
| 	grpcServerVersion, err := client.Version(grpcCtx) | ||||
| 	grpcServerVersion, err := client.Version(grpcCtx) //nolint:contextcheck | ||||
| 	if err != nil { | ||||
| 		log.Error().Err(err).Msg("could not get grpc server version") | ||||
| 		return err | ||||
| @@ -180,7 +176,7 @@ func run(c *cli.Context, backends []types.Backend) error { | ||||
| 	} | ||||
|  | ||||
| 	// new engine | ||||
| 	backendCtx := context.WithValue(agentCtx, types.CliContext, c) | ||||
| 	backendCtx := context.WithValue(agentCtx, types.CliCommand, c) | ||||
| 	backendName := c.String("backend-engine") | ||||
| 	backendEngine, err := backend.FindBackend(backendCtx, backends, backendName) | ||||
| 	if err != nil { | ||||
| @@ -200,8 +196,8 @@ func run(c *cli.Context, backends []types.Backend) error { | ||||
| 	} | ||||
| 	log.Debug().Msgf("loaded %s backend engine", backendEngine.Name()) | ||||
|  | ||||
| 	maxWorkflows := c.Int("max-workflows") | ||||
| 	agentConfig.AgentID, err = client.RegisterAgent(grpcCtx, engInfo.Platform, backendEngine.Name(), version.String(), maxWorkflows) | ||||
| 	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 | ||||
| 	} | ||||
| @@ -291,19 +287,19 @@ func run(c *cli.Context, backends []types.Backend) error { | ||||
| 	return serviceWaitingGroup.Wait() | ||||
| } | ||||
|  | ||||
| func runWithRetry(backendEngines []types.Backend) func(c *cli.Context) error { | ||||
| 	return func(c *cli.Context) error { | ||||
| 		if err := logger.SetupGlobalLogger(c, true); err != nil { | ||||
| func runWithRetry(backendEngines []types.Backend) func(ctx context.Context, c *cli.Command) error { | ||||
| 	return func(ctx context.Context, c *cli.Command) error { | ||||
| 		if err := logger.SetupGlobalLogger(ctx, c, true); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		initHealth() | ||||
|  | ||||
| 		retryCount := c.Int("connect-retry-count") | ||||
| 		retryCount := int(c.Int("connect-retry-count")) | ||||
| 		retryDelay := c.Duration("connect-retry-delay") | ||||
| 		var err error | ||||
| 		for i := 0; i < retryCount; i++ { | ||||
| 			if err = run(c, backendEngines); status.Code(err) == codes.Unavailable { | ||||
| 			if err = run(ctx, c, 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 { | ||||
|   | ||||
| @@ -19,93 +19,94 @@ import ( | ||||
| 	"os" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| //nolint:mnd | ||||
| var flags = []cli.Flag{ | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SERVER"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SERVER"), | ||||
| 		Name:    "server", | ||||
| 		Usage:   "server address", | ||||
| 		Value:   "localhost:9000", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_AGENT_SECRET"}, | ||||
| 		Name:     "grpc-token", | ||||
| 		Usage:    "server-agent shared token", | ||||
| 		FilePath: os.Getenv("WOODPECKER_AGENT_SECRET_FILE"), | ||||
| 		Name:  "grpc-token", | ||||
| 		Usage: "server-agent shared token", | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_AGENT_SECRET_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_AGENT_SECRET")), | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GRPC_SECURE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GRPC_SECURE"), | ||||
| 		Name:    "grpc-secure", | ||||
| 		Usage:   "should the connection to WOODPECKER_SERVER be made using a secure transport", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GRPC_VERIFY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GRPC_VERIFY"), | ||||
| 		Name:    "grpc-skip-insecure", | ||||
| 		Usage:   "should the grpc server certificate be verified, only valid when WOODPECKER_GRPC_SECURE is true", | ||||
| 		Value:   true, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_HOSTNAME"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_HOSTNAME"), | ||||
| 		Name:    "hostname", | ||||
| 		Usage:   "agent hostname", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_AGENT_CONFIG_FILE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_AGENT_CONFIG_FILE"), | ||||
| 		Name:    "agent-config", | ||||
| 		Usage:   "agent config file path, if set empty the agent will be stateless and unregister on termination", | ||||
| 		Value:   "/etc/woodpecker/agent.conf", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_FILTER_LABELS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_FILTER_LABELS"), | ||||
| 		Name:    "filter", | ||||
| 		Usage:   "List of labels to filter tasks on. An agent must be assigned every tag listed in a task to be selected.", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_MAX_WORKFLOWS", "WOODPECKER_MAX_PROCS"}, // cspell:words PROCS | ||||
| 		Sources: cli.EnvVars("WOODPECKER_MAX_WORKFLOWS", "WOODPECKER_MAX_PROCS"), // cspell:words PROCS | ||||
| 		Name:    "max-workflows", | ||||
| 		Usage:   "agent parallel workflows", | ||||
| 		Value:   1, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_HEALTHCHECK"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_HEALTHCHECK"), | ||||
| 		Name:    "healthcheck", | ||||
| 		Usage:   "enable healthcheck endpoint", | ||||
| 		Value:   true, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_HEALTHCHECK_ADDR"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_HEALTHCHECK_ADDR"), | ||||
| 		Name:    "healthcheck-addr", | ||||
| 		Usage:   "healthcheck endpoint address", | ||||
| 		Value:   ":3000", | ||||
| 	}, | ||||
| 	&cli.DurationFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_KEEPALIVE_TIME"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_KEEPALIVE_TIME"), | ||||
| 		Name:    "keepalive-time", | ||||
| 		Usage:   "after a duration of this time of no activity, the agent pings the server to check if the transport is still alive", | ||||
| 	}, | ||||
| 	&cli.DurationFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_KEEPALIVE_TIMEOUT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_KEEPALIVE_TIMEOUT"), | ||||
| 		Name:    "keepalive-timeout", | ||||
| 		Usage:   "after pinging for a keepalive check, the agent waits for a duration of this time before closing the connection if no activity", | ||||
| 		Value:   time.Second * 20, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND"), | ||||
| 		Name:    "backend-engine", | ||||
| 		Usage:   "backend to run pipelines on", | ||||
| 		Value:   "auto-detect", | ||||
| 	}, | ||||
| 	&cli.IntFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_CONNECT_RETRY_COUNT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_CONNECT_RETRY_COUNT"), | ||||
| 		Name:    "connect-retry-count", | ||||
| 		Usage:   "number of times to retry connecting to the server", | ||||
| 		Value:   5, | ||||
| 	}, | ||||
| 	&cli.DurationFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_CONNECT_RETRY_DELAY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_CONNECT_RETRY_DELAY"), | ||||
| 		Name:    "connect-retry-delay", | ||||
| 		Usage:   "duration to wait before retrying to connect to the server", | ||||
| 		Value:   time.Second * 2, | ||||
|   | ||||
| @@ -15,13 +15,14 @@ | ||||
| package core | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/agent" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/version" | ||||
| @@ -81,8 +82,7 @@ var counter = &agent.State{ | ||||
|  | ||||
| // handles pinging the endpoint and returns an error if the | ||||
| // agent is in an unhealthy state. | ||||
| func pinger(c *cli.Context) error { | ||||
| 	ctx := c.Context | ||||
| func pinger(ctx context.Context, c *cli.Command) error { | ||||
| 	healthcheckAddress := c.String("healthcheck-addr") | ||||
| 	if strings.HasPrefix(healthcheckAddress, ":") { | ||||
| 		// this seems sufficient according to https://pkg.go.dev/net#Dial | ||||
|   | ||||
| @@ -15,12 +15,13 @@ | ||||
| package core | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
|  | ||||
| 	// Load config from .env file. | ||||
| 	_ "github.com/joho/godotenv/autoload" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/logger" | ||||
| @@ -28,8 +29,8 @@ import ( | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/version" | ||||
| ) | ||||
|  | ||||
| func RunAgent(backends []backend.Backend) { | ||||
| 	app := cli.NewApp() | ||||
| func RunAgent(ctx context.Context, backends []backend.Backend) { | ||||
| 	app := &cli.Command{} | ||||
| 	app.Name = "woodpecker-agent" | ||||
| 	app.Version = version.String() | ||||
| 	app.Usage = "woodpecker agent" | ||||
| @@ -47,7 +48,7 @@ func RunAgent(backends []backend.Backend) { | ||||
| 	} | ||||
| 	app.Flags = agentFlags | ||||
|  | ||||
| 	if err := app.Run(os.Args); err != nil { | ||||
| 	if err := app.Run(ctx, os.Args); err != nil { | ||||
| 		log.Fatal().Err(err).Msg("error running agent") //nolint:forbidigo | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -15,11 +15,16 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
|  | ||||
| 	"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" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/utils" | ||||
| ) | ||||
|  | ||||
| var backends = []backendTypes.Backend{ | ||||
| @@ -29,5 +34,8 @@ var backends = []backendTypes.Backend{ | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	core.RunAgent(backends) | ||||
| 	ctx := utils.WithContextSigtermCallback(context.Background(), func() { | ||||
| 		log.Info().Msg("termination signal is received, shutting down agent") | ||||
| 	}) | ||||
| 	core.RunAgent(ctx, backends) | ||||
| } | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/admin" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/cli/common" | ||||
| @@ -38,12 +38,12 @@ import ( | ||||
| ) | ||||
|  | ||||
| //go:generate go run docs.go app.go | ||||
| func newApp() *cli.App { | ||||
| 	app := cli.NewApp() | ||||
| func newApp() *cli.Command { | ||||
| 	app := &cli.Command{} | ||||
| 	app.Name = "woodpecker-cli" | ||||
| 	app.Description = "Woodpecker command line utility" | ||||
| 	app.Version = version.String() | ||||
| 	app.EnableBashCompletion = true | ||||
| 	app.Usage = "command line utility" | ||||
| 	app.Flags = common.GlobalFlags | ||||
| 	app.Before = common.Before | ||||
| 	app.After = common.After | ||||
|   | ||||
| @@ -19,11 +19,13 @@ package main | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
|  | ||||
| 	docs "github.com/urfave/cli-docs/v3" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	app := newApp() | ||||
| 	md, err := app.ToMarkdown() | ||||
| 	md, err := docs.ToMarkdown(app) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|   | ||||
| @@ -15,15 +15,22 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
|  | ||||
| 	_ "github.com/joho/godotenv/autoload" | ||||
| 	"github.com/rs/zerolog/log" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/utils" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	ctx := utils.WithContextSigtermCallback(context.Background(), func() { | ||||
| 		log.Info().Msg("termination signal is received, terminate cli") | ||||
| 	}) | ||||
|  | ||||
| 	app := newApp() | ||||
| 	if err := app.Run(os.Args); err != nil { | ||||
| 	if err := app.Run(ctx, os.Args); err != nil { | ||||
| 		log.Fatal().Err(err).Msg("error running cli") //nolint:forbidigo | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| // Copyright 2023 Woodpecker Authors | ||||
| // Copyright 2019 Laszlo Fogas | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| @@ -18,7 +19,7 @@ import ( | ||||
| 	"os" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/constant" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/logger" | ||||
| @@ -26,229 +27,232 @@ import ( | ||||
|  | ||||
| var flags = append([]cli.Flag{ | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LOG_XORM"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LOG_XORM"), | ||||
| 		Name:    "log-xorm", | ||||
| 		Usage:   "enable xorm logging", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LOG_XORM_SQL"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LOG_XORM_SQL"), | ||||
| 		Name:    "log-xorm-sql", | ||||
| 		Usage:   "enable xorm sql command logging", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_HOST"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_HOST"), | ||||
| 		Name:    "server-host", | ||||
| 		Usage:   "server fully qualified url. Format: <scheme>://<host>[/<prefix path>]", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SERVER_ADDR"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SERVER_ADDR"), | ||||
| 		Name:    "server-addr", | ||||
| 		Usage:   "server address", | ||||
| 		Value:   ":8000", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SERVER_ADDR_TLS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SERVER_ADDR_TLS"), | ||||
| 		Name:    "server-addr-tls", | ||||
| 		Usage:   "port https with tls (:443)", | ||||
| 		Value:   ":443", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SERVER_CERT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SERVER_CERT"), | ||||
| 		Name:    "server-cert", | ||||
| 		Usage:   "server ssl cert path", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SERVER_KEY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SERVER_KEY"), | ||||
| 		Name:    "server-key", | ||||
| 		Usage:   "server ssl key path", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_CUSTOM_CSS_FILE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_CUSTOM_CSS_FILE"), | ||||
| 		Name:    "custom-css-file", | ||||
| 		Usage:   "file path for the server to serve a custom .CSS file, used for customizing the UI", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_CUSTOM_JS_FILE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_CUSTOM_JS_FILE"), | ||||
| 		Name:    "custom-js-file", | ||||
| 		Usage:   "file path for the server to serve a custom .JS file, used for customizing the UI", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LETS_ENCRYPT_EMAIL"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LETS_ENCRYPT_EMAIL"), | ||||
| 		Name:    "lets-encrypt-email", | ||||
| 		Usage:   "let's encrypt email", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LETS_ENCRYPT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LETS_ENCRYPT"), | ||||
| 		Name:    "lets-encrypt", | ||||
| 		Usage:   "enable let's encrypt", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GRPC_ADDR"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GRPC_ADDR"), | ||||
| 		Name:    "grpc-addr", | ||||
| 		Usage:   "grpc address", | ||||
| 		Value:   ":9000", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_GRPC_SECRET"}, | ||||
| 		Name:     "grpc-secret", | ||||
| 		Usage:    "grpc jwt secret", | ||||
| 		Value:    "secret", | ||||
| 		FilePath: os.Getenv("WOODPECKER_GRPC_SECRET_FILE"), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_GRPC_SECRET_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_GRPC_SECRET")), | ||||
| 		Name:  "grpc-secret", | ||||
| 		Usage: "grpc jwt secret", | ||||
| 		Value: "secret", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_METRICS_SERVER_ADDR"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_METRICS_SERVER_ADDR"), | ||||
| 		Name:    "metrics-server-addr", | ||||
| 		Usage:   "metrics server address", | ||||
| 		Value:   "", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ADMIN"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ADMIN"), | ||||
| 		Name:    "admin", | ||||
| 		Usage:   "list of admin users", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ORGS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ORGS"), | ||||
| 		Name:    "orgs", | ||||
| 		Usage:   "list of approved organizations", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_REPO_OWNERS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_REPO_OWNERS"), | ||||
| 		Name:    "repo-owners", | ||||
| 		Usage:   "Repositories by those owners will be allowed to be used in woodpecker", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_OPEN"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_OPEN"), | ||||
| 		Name:    "open", | ||||
| 		Usage:   "enable open user registration", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_AUTHENTICATE_PUBLIC_REPOS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_AUTHENTICATE_PUBLIC_REPOS"), | ||||
| 		Name:    "authenticate-public-repos", | ||||
| 		Usage:   "Always use authentication to clone repositories even if they are public. Needed if the SCM requires to always authenticate as used by many companies.", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DEFAULT_CANCEL_PREVIOUS_PIPELINE_EVENTS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DEFAULT_CANCEL_PREVIOUS_PIPELINE_EVENTS"), | ||||
| 		Name:    "default-cancel-previous-pipeline-events", | ||||
| 		Usage:   "List of event names that will be canceled when a new pipeline for the same context (tag, branch) is created.", | ||||
| 		Value:   cli.NewStringSlice("push", "pull_request"), | ||||
| 		Value:   []string{"push", "pull_request"}, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DEFAULT_CLONE_IMAGE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DEFAULT_CLONE_IMAGE"), | ||||
| 		Name:    "default-clone-image", | ||||
| 		Usage:   "The default docker image to be used when cloning the repo", | ||||
| 		Value:   constant.DefaultCloneImage, | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DEFAULT_PIPELINE_TIMEOUT"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DEFAULT_PIPELINE_TIMEOUT"), | ||||
| 		Name:    "default-pipeline-timeout", | ||||
| 		Usage:   "The default time in minutes for a repo in minutes before a pipeline gets killed", | ||||
| 		Value:   60, | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"WOODPECKER_MAX_PIPELINE_TIMEOUT"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("WOODPECKER_MAX_PIPELINE_TIMEOUT"), | ||||
| 		Name:    "max-pipeline-timeout", | ||||
| 		Usage:   "The maximum time in minutes you can set in the repo settings before a pipeline gets killed", | ||||
| 		Value:   120, | ||||
| 	}, | ||||
| 	&cli.DurationFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_SESSION_EXPIRES"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_SESSION_EXPIRES"), | ||||
| 		Name:    "session-expires", | ||||
| 		Usage:   "session expiration time", | ||||
| 		Value:   time.Hour * 72, | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ESCALATE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ESCALATE"), | ||||
| 		Name:    "escalate", | ||||
| 		Usage:   "images to run in privileged mode", | ||||
| 		Value:   cli.NewStringSlice(constant.PrivilegedPlugins...), | ||||
| 		Value:   constant.PrivilegedPlugins, | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_VOLUME"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_VOLUME"), | ||||
| 		Name:    "volume", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DOCKER_CONFIG"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DOCKER_CONFIG"), | ||||
| 		Name:    "docker-config", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ENVIRONMENT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ENVIRONMENT"), | ||||
| 		Name:    "environment", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_NETWORK"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_NETWORK"), | ||||
| 		Name:    "network", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_AGENT_SECRET"}, | ||||
| 		Name:     "agent-secret", | ||||
| 		Usage:    "server-agent shared password", | ||||
| 		FilePath: os.Getenv("WOODPECKER_AGENT_SECRET_FILE"), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_AGENT_SECRET_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_AGENT_SECRET")), | ||||
| 		Name:  "agent-secret", | ||||
| 		Usage: "server-agent shared password", | ||||
| 	}, | ||||
| 	&cli.DurationFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_KEEPALIVE_MIN_TIME"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_KEEPALIVE_MIN_TIME"), | ||||
| 		Name:    "keepalive-min-time", | ||||
| 		Usage:   "server-side enforcement policy on the minimum amount of time a client should wait before sending a keepalive ping.", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_CONFIG_SERVICE_ENDPOINT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_CONFIG_SERVICE_ENDPOINT"), | ||||
| 		Name:    "config-service-endpoint", | ||||
| 		Usage:   "url used for calling configuration service endpoint", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DATABASE_DRIVER"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DATABASE_DRIVER"), | ||||
| 		Name:    "driver", | ||||
| 		Usage:   "database driver", | ||||
| 		Value:   "sqlite3", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_DATABASE_DATASOURCE"}, | ||||
| 		Name:     "datasource", | ||||
| 		Usage:    "database driver configuration string", | ||||
| 		Value:    datasourceDefaultValue(), | ||||
| 		FilePath: os.Getenv("WOODPECKER_DATABASE_DATASOURCE_FILE"), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_DATABASE_DATASOURCE_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_DATABASE_DATASOURCE")), | ||||
| 		Name:  "datasource", | ||||
| 		Usage: "database driver configuration string", | ||||
| 		Value: datasourceDefaultValue(), | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_PROMETHEUS_AUTH_TOKEN"}, | ||||
| 		Name:     "prometheus-auth-token", | ||||
| 		Usage:    "token to secure prometheus metrics endpoint", | ||||
| 		Value:    "", | ||||
| 		FilePath: os.Getenv("WOODPECKER_PROMETHEUS_AUTH_TOKEN_FILE"), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_PROMETHEUS_AUTH_TOKEN_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_PROMETHEUS_AUTH_TOKEN")), | ||||
| 		Name:  "prometheus-auth-token", | ||||
| 		Usage: "token to secure prometheus metrics endpoint", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_STATUS_CONTEXT", "WOODPECKER_GITHUB_CONTEXT", "WOODPECKER_GITEA_CONTEXT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_STATUS_CONTEXT", "WOODPECKER_GITHUB_CONTEXT", "WOODPECKER_GITEA_CONTEXT"), | ||||
| 		Name:    "status-context", | ||||
| 		Usage:   "status context prefix", | ||||
| 		Value:   "ci/woodpecker", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_STATUS_CONTEXT_FORMAT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_STATUS_CONTEXT_FORMAT"), | ||||
| 		Name:    "status-context-format", | ||||
| 		Usage:   "status context format", | ||||
| 		Value:   "{{ .context }}/{{ .event }}/{{ .workflow }}{{if not (eq .axis_id 0)}}/{{.axis_id}}{{end}}", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_MIGRATIONS_ALLOW_LONG"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_MIGRATIONS_ALLOW_LONG"), | ||||
| 		Name:    "migrations-allow-long", | ||||
| 		Value:   false, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ENABLE_SWAGGER"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ENABLE_SWAGGER"), | ||||
| 		Name:    "enable-swagger", | ||||
| 		Value:   true, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DISABLE_VERSION_CHECK"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DISABLE_VERSION_CHECK"), | ||||
| 		Usage:   "Disable version check in admin web ui.", | ||||
| 		Name:    "skip-version-check", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LOG_STORE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LOG_STORE"), | ||||
| 		Name:    "log-store", | ||||
| 		Usage:   "log store to use ('database' or 'file')", | ||||
| 		Value:   "database", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LOG_STORE_FILE_PATH"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LOG_STORE_FILE_PATH"), | ||||
| 		Name:    "log-store-file-path", | ||||
| 		Usage:   "directory used for file based log storage", | ||||
| 	}, | ||||
| @@ -256,17 +260,17 @@ var flags = append([]cli.Flag{ | ||||
| 	// backend options for pipeline compiler | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_NO_PROXY", "NO_PROXY", "no_proxy"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_NO_PROXY", "NO_PROXY", "no_proxy"), | ||||
| 		Usage:   "if set, pass the environment variable down as \"NO_PROXY\" to steps", | ||||
| 		Name:    "backend-no-proxy", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_HTTP_PROXY", "HTTP_PROXY", "http_proxy"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_HTTP_PROXY", "HTTP_PROXY", "http_proxy"), | ||||
| 		Usage:   "if set, pass the environment variable down as \"HTTP_PROXY\" to steps", | ||||
| 		Name:    "backend-http-proxy", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_HTTPS_PROXY", "HTTPS_PROXY", "https_proxy"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_HTTPS_PROXY", "HTTPS_PROXY", "https_proxy"), | ||||
| 		Usage:   "if set, pass the environment variable down as \"HTTPS_PROXY\" to steps", | ||||
| 		Name:    "backend-https-proxy", | ||||
| 	}, | ||||
| @@ -274,44 +278,44 @@ var flags = append([]cli.Flag{ | ||||
| 	// resource limit parameters | ||||
| 	// | ||||
| 	&cli.DurationFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_FORGE_TIMEOUT"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_FORGE_TIMEOUT"), | ||||
| 		Name:    "forge-timeout", | ||||
| 		Usage:   "how many seconds before timeout when fetching the Woodpecker configuration from a Forge", | ||||
| 		Value:   time.Second * 3, | ||||
| 	}, | ||||
| 	&cli.UintFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_FORGE_RETRY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_FORGE_RETRY"), | ||||
| 		Name:    "forge-retry", | ||||
| 		Usage:   "How many retries of fetching the Woodpecker configuration from a forge are done before we fail", | ||||
| 		Value:   3, | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LIMIT_MEM_SWAP"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LIMIT_MEM_SWAP"), | ||||
| 		Name:    "limit-mem-swap", | ||||
| 		Usage:   "maximum memory used for swap in bytes", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LIMIT_MEM"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LIMIT_MEM"), | ||||
| 		Name:    "limit-mem", | ||||
| 		Usage:   "maximum memory allowed in bytes", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LIMIT_SHM_SIZE"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LIMIT_SHM_SIZE"), | ||||
| 		Name:    "limit-shm-size", | ||||
| 		Usage:   "docker compose /dev/shm allowed in bytes", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LIMIT_CPU_QUOTA"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LIMIT_CPU_QUOTA"), | ||||
| 		Name:    "limit-cpu-quota", | ||||
| 		Usage:   "impose a cpu quota", | ||||
| 	}, | ||||
| 	&cli.Int64Flag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LIMIT_CPU_SHARES"}, | ||||
| 	&cli.IntFlag{ | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LIMIT_CPU_SHARES"), | ||||
| 		Name:    "limit-cpu-shares", | ||||
| 		Usage:   "change the cpu shares", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_LIMIT_CPU_SET"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_LIMIT_CPU_SET"), | ||||
| 		Name:    "limit-cpu-set", | ||||
| 		Usage:   "set the cpus allowed to execute containers", | ||||
| 	}, | ||||
| @@ -319,27 +323,62 @@ var flags = append([]cli.Flag{ | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "forge-url", | ||||
| 		Usage:   "url of the forge", | ||||
| 		EnvVars: []string{"WOODPECKER_FORGE_URL", "WOODPECKER_GITHUB_URL", "WOODPECKER_GITLAB_URL", "WOODPECKER_GITEA_URL", "WOODPECKER_FORGEJO_URL", "WOODPECKER_BITBUCKET_URL", "WOODPECKER_BITBUCKET_DC_URL"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_FORGE_URL", "WOODPECKER_GITHUB_URL", "WOODPECKER_GITLAB_URL", "WOODPECKER_GITEA_URL", "WOODPECKER_FORGEJO_URL", "WOODPECKER_BITBUCKET_URL", "WOODPECKER_BITBUCKET_DC_URL"), | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:     "forge-oauth-client", | ||||
| 		Usage:    "oauth2 client id", | ||||
| 		EnvVars:  []string{"WOODPECKER_FORGE_CLIENT", "WOODPECKER_GITHUB_CLIENT", "WOODPECKER_GITLAB_CLIENT", "WOODPECKER_GITEA_CLIENT", "WOODPECKER_FORGEJO_CLIENT", "WOODPECKER_BITBUCKET_CLIENT", "WOODPECKER_BITBUCKET_DC_CLIENT_ID"}, | ||||
| 		FilePath: getFirstNonEmptyEnvVar([]string{"WOODPECKER_FORGE_CLIENT_FILE", "WOODPECKER_GITHUB_CLIENT_FILE", "WOODPECKER_GITLAB_CLIENT_FILE", "WOODPECKER_GITEA_CLIENT_FILE", "WOODPECKER_FORGEJO_CLIENT_FILE", "WOODPECKER_BITBUCKET_CLIENT_FILE", "WOODPECKER_BITBUCKET_DC_CLIENT_ID_FILE"}), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(getFirstNonEmptyEnvVar( | ||||
| 				"WOODPECKER_FORGE_CLIENT_FILE", | ||||
| 				"WOODPECKER_GITHUB_CLIENT_FILE", | ||||
| 				"WOODPECKER_GITLAB_CLIENT_FILE", | ||||
| 				"WOODPECKER_GITEA_CLIENT_FILE", | ||||
| 				"WOODPECKER_FORGEJO_CLIENT_FILE", | ||||
| 				"WOODPECKER_BITBUCKET_CLIENT_FILE", | ||||
| 				"WOODPECKER_BITBUCKET_DC_CLIENT_ID_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_FORGE_CLIENT"), | ||||
| 			cli.EnvVar("WOODPECKER_GITHUB_CLIENT"), | ||||
| 			cli.EnvVar("WOODPECKER_GITLAB_CLIENT"), | ||||
| 			cli.EnvVar("WOODPECKER_GITEA_CLIENT"), | ||||
| 			cli.EnvVar("WOODPECKER_FORGEJO_CLIENT"), | ||||
| 			cli.EnvVar("WOODPECKER_BITBUCKET_CLIENT"), | ||||
| 			cli.EnvVar("WOODPECKER_BITBUCKET_DC_CLIENT_ID")), | ||||
| 		Name:  "forge-oauth-client", | ||||
| 		Usage: "oauth2 client id", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:     "forge-oauth-secret", | ||||
| 		Usage:    "oauth2 client secret", | ||||
| 		EnvVars:  []string{"WOODPECKER_FORGE_SECRET", "WOODPECKER_GITHUB_SECRET", "WOODPECKER_GITLAB_SECRET", "WOODPECKER_GITEA_SECRET", "WOODPECKER_FORGEJO_SECRET", "WOODPECKER_BITBUCKET_SECRET", "WOODPECKER_BITBUCKET_DC_CLIENT_SECRET"}, | ||||
| 		FilePath: getFirstNonEmptyEnvVar([]string{"WOODPECKER_FORGE_SECRET_FILE", "WOODPECKER_GITHUB_SECRET_FILE", "WOODPECKER_GITLAB_SECRET_FILE", "WOODPECKER_GITEA_SECRET_FILE", "WOODPECKER_FORGEJO_SECRET_FILE", "WOODPECKER_BITBUCKET_SECRET_FILE", "WOODPECKER_BITBUCKET_DC_CLIENT_SECRET_FILE"}), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(getFirstNonEmptyEnvVar( | ||||
| 				"WOODPECKER_FORGE_SECRET_FILE", | ||||
| 				"WOODPECKER_GITHUB_SECRET_FILE", | ||||
| 				"WOODPECKER_GITLAB_SECRET_FILE", | ||||
| 				"WOODPECKER_GITEA_SECRET_FILE", | ||||
| 				"WOODPECKER_FORGEJO_SECRET_FILE", | ||||
| 				"WOODPECKER_BITBUCKET_SECRET_FILE", | ||||
| 				"WOODPECKER_BITBUCKET_DC_CLIENT_SECRET_FILE", | ||||
| 			)), | ||||
| 			cli.EnvVar("WOODPECKER_FORGE_SECRET"), | ||||
| 			cli.EnvVar("WOODPECKER_GITHUB_SECRET"), | ||||
| 			cli.EnvVar("WOODPECKER_GITLAB_SECRET"), | ||||
| 			cli.EnvVar("WOODPECKER_GITEA_SECRET"), | ||||
| 			cli.EnvVar("WOODPECKER_FORGEJO_SECRET"), | ||||
| 			cli.EnvVar("WOODPECKER_BITBUCKET_SECRET"), | ||||
| 			cli.EnvVar("WOODPECKER_BITBUCKET_DC_CLIENT_SECRET")), | ||||
| 		Name:  "forge-oauth-secret", | ||||
| 		Usage: "oauth2 client secret", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		Name:    "forge-skip-verify", | ||||
| 		Usage:   "skip ssl verification", | ||||
| 		EnvVars: []string{"WOODPECKER_FORGE_SKIP_VERIFY", "WOODPECKER_GITHUB_SKIP_VERIFY", "WOODPECKER_GITLAB_SKIP_VERIFY", "WOODPECKER_GITEA_SKIP_VERIFY", "WOODPECKER_FORGEJO_SKIP_VERIFY", "WOODPECKER_BITBUCKET_SKIP_VERIFY"}, | ||||
| 		Name:  "forge-skip-verify", | ||||
| 		Usage: "skip ssl verification", | ||||
| 		Sources: cli.EnvVars( | ||||
| 			"WOODPECKER_FORGE_SKIP_VERIFY", | ||||
| 			"WOODPECKER_GITHUB_SKIP_VERIFY", | ||||
| 			"WOODPECKER_GITLAB_SKIP_VERIFY", | ||||
| 			"WOODPECKER_GITEA_SKIP_VERIFY", | ||||
| 			"WOODPECKER_FORGEJO_SKIP_VERIFY", | ||||
| 			"WOODPECKER_BITBUCKET_SKIP_VERIFY"), | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_EXPERT_FORGE_OAUTH_HOST", "WOODPECKER_DEV_GITEA_OAUTH_URL"}, // TODO: remove WOODPECKER_DEV_GITEA_OAUTH_URL in next major release | ||||
| 		Sources: cli.EnvVars("WOODPECKER_EXPERT_FORGE_OAUTH_HOST", "WOODPECKER_DEV_GITEA_OAUTH_URL"), // TODO: remove WOODPECKER_DEV_GITEA_OAUTH_URL in next major release | ||||
| 		Name:    "forge-oauth-host", | ||||
| 		Usage:   "!!!for experts!!! fully qualified public forge url. Use it if your forge url WOODPECKER_FORGE_URL or WOODPECKER_GITEA_URL, ... isn't a public url. Format: <scheme>://<host>[/<prefix path>]", | ||||
| 	}, | ||||
| @@ -347,7 +386,7 @@ var flags = append([]cli.Flag{ | ||||
| 	// Addon | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ADDON_FORGE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ADDON_FORGE"), | ||||
| 		Name:    "addon-forge", | ||||
| 		Usage:   "path to forge addon executable", | ||||
| 	}, | ||||
| @@ -355,18 +394,18 @@ var flags = append([]cli.Flag{ | ||||
| 	// GitHub | ||||
| 	// | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GITHUB"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GITHUB"), | ||||
| 		Name:    "github", | ||||
| 		Usage:   "github driver is enabled", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GITHUB_MERGE_REF"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GITHUB_MERGE_REF"), | ||||
| 		Name:    "github-merge-ref", | ||||
| 		Usage:   "github pull requests use merge ref", | ||||
| 		Value:   true, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GITHUB_PUBLIC_ONLY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GITHUB_PUBLIC_ONLY"), | ||||
| 		Name:    "github-public-only", | ||||
| 		Usage:   "github tokens should only get access to public repos", | ||||
| 		Value:   false, | ||||
| @@ -375,7 +414,7 @@ var flags = append([]cli.Flag{ | ||||
| 	// Gitea | ||||
| 	// | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GITEA"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GITEA"), | ||||
| 		Name:    "gitea", | ||||
| 		Usage:   "gitea driver is enabled", | ||||
| 	}, | ||||
| @@ -383,7 +422,7 @@ var flags = append([]cli.Flag{ | ||||
| 	// Forgejo | ||||
| 	// | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_FORGEJO"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_FORGEJO"), | ||||
| 		Name:    "forgejo", | ||||
| 		Usage:   "forgejo driver is enabled", | ||||
| 	}, | ||||
| @@ -391,7 +430,7 @@ var flags = append([]cli.Flag{ | ||||
| 	// Bitbucket | ||||
| 	// | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BITBUCKET"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BITBUCKET"), | ||||
| 		Name:    "bitbucket", | ||||
| 		Usage:   "bitbucket driver is enabled", | ||||
| 	}, | ||||
| @@ -399,7 +438,7 @@ var flags = append([]cli.Flag{ | ||||
| 	// Gitlab | ||||
| 	// | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_GITLAB"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_GITLAB"), | ||||
| 		Name:    "gitlab", | ||||
| 		Usage:   "gitlab driver is enabled", | ||||
| 	}, | ||||
| @@ -407,27 +446,29 @@ var flags = append([]cli.Flag{ | ||||
| 	// Bitbucket DataCenter/Server (previously Stash) | ||||
| 	// | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BITBUCKET_DC"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BITBUCKET_DC"), | ||||
| 		Name:    "bitbucket-dc", | ||||
| 		Usage:   "Bitbucket DataCenter/Server driver is enabled", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_BITBUCKET_DC_GIT_USERNAME"}, | ||||
| 		Name:     "bitbucket-dc-git-username", | ||||
| 		Usage:    "Bitbucket DataCenter/Server service account username", | ||||
| 		FilePath: os.Getenv("WOODPECKER_BITBUCKET_DC_GIT_USERNAME_FILE"), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_BITBUCKET_DC_GIT_USERNAME_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_BITBUCKET_DC_GIT_USERNAME")), | ||||
| 		Name:  "bitbucket-dc-git-username", | ||||
| 		Usage: "Bitbucket DataCenter/Server service account username", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_BITBUCKET_DC_GIT_PASSWORD"}, | ||||
| 		Name:     "bitbucket-dc-git-password", | ||||
| 		Usage:    "Bitbucket DataCenter/Server service account password", | ||||
| 		FilePath: os.Getenv("WOODPECKER_BITBUCKET_DC_GIT_PASSWORD_FILE"), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_BITBUCKET_DC_GIT_PASSWORD_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_BITBUCKET_DC_GIT_PASSWORD")), | ||||
| 		Name:  "bitbucket-dc-git-password", | ||||
| 		Usage: "Bitbucket DataCenter/Server service account password", | ||||
| 	}, | ||||
| 	// | ||||
| 	// development flags | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DEV_WWW_PROXY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DEV_WWW_PROXY"), | ||||
| 		Name:    "www-proxy", | ||||
| 		Usage:   "serve the website by using a proxy (used for development)", | ||||
| 		Hidden:  true, | ||||
| @@ -436,13 +477,13 @@ var flags = append([]cli.Flag{ | ||||
| 	// expert flags | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_EXPERT_WEBHOOK_HOST", "WOODPECKER_WEBHOOK_HOST"}, // TODO: remove WOODPECKER_WEBHOOK_HOST in next major release | ||||
| 		Sources: cli.EnvVars("WOODPECKER_EXPERT_WEBHOOK_HOST", "WOODPECKER_WEBHOOK_HOST"), // TODO: remove WOODPECKER_WEBHOOK_HOST in next major release | ||||
| 		Name:    "server-webhook-host", | ||||
| 		Usage:   "!!!for experts!!! fully qualified woodpecker server url called by forge's webhooks. Format: <scheme>://<host>[/<prefix path>]", | ||||
| 	}, | ||||
| 	// TODO: remove in next major release | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_DEV_OAUTH_HOST"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_DEV_OAUTH_HOST"), | ||||
| 		Name:    "server-dev-oauth-host-deprecated", | ||||
| 		Usage:   "DEPRECATED: use WOODPECKER_EXPERT_FORGE_OAUTH_HOST instead\nfully qualified url used for oauth redirects. Format: <scheme>://<host>[/<prefix path>]", | ||||
| 		Value:   "", | ||||
| @@ -452,18 +493,19 @@ var flags = append([]cli.Flag{ | ||||
| 	// secrets encryption in DB | ||||
| 	// | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars:  []string{"WOODPECKER_ENCRYPTION_KEY"}, | ||||
| 		Name:     "encryption-raw-key", | ||||
| 		Usage:    "Raw encryption key", | ||||
| 		FilePath: os.Getenv("WOODPECKER_ENCRYPTION_KEY_FILE"), | ||||
| 		Sources: cli.NewValueSourceChain( | ||||
| 			cli.File(os.Getenv("WOODPECKER_ENCRYPTION_KEY_FILE")), | ||||
| 			cli.EnvVar("WOODPECKER_ENCRYPTION_KEY")), | ||||
| 		Name:  "encryption-raw-key", | ||||
| 		Usage: "Raw encryption key", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ENCRYPTION_TINK_KEYSET_FILE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ENCRYPTION_TINK_KEYSET_FILE"), | ||||
| 		Name:    "encryption-tink-keyset", | ||||
| 		Usage:   "Google tink AEAD-compatible keyset file to encrypt secrets in DB", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_ENCRYPTION_DISABLE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_ENCRYPTION_DISABLE"), | ||||
| 		Name:    "encryption-disable-flag", | ||||
| 		Usage:   "Flag to decrypt all encrypted data and disable encryption on server", | ||||
| 	}, | ||||
| @@ -479,7 +521,7 @@ func datasourceDefaultValue() string { | ||||
| 	return "woodpecker.sqlite" | ||||
| } | ||||
|  | ||||
| func getFirstNonEmptyEnvVar(envVars []string) string { | ||||
| func getFirstNonEmptyEnvVar(envVars ...string) string { | ||||
| 	for _, envVar := range envVars { | ||||
| 		val := os.Getenv(envVar) | ||||
| 		if val != "" { | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import ( | ||||
| 	"net" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/keepalive" | ||||
|  | ||||
| @@ -30,7 +30,7 @@ import ( | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/server/store" | ||||
| ) | ||||
|  | ||||
| func runGrpcServer(ctx context.Context, c *cli.Context, _store store.Store) error { | ||||
| func runGrpcServer(ctx context.Context, c *cli.Command, _store store.Store) error { | ||||
| 	lis, err := net.Listen("tcp", c.String("grpc-addr")) | ||||
| 	if err != nil { | ||||
| 		log.Fatal().Err(err).Msg("failed to listen on grpc-addr") //nolint:forbidigo | ||||
|   | ||||
| @@ -16,20 +16,21 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| const pingTimeout = 1 * time.Second | ||||
|  | ||||
| // handles pinging the endpoint and returns an error if the | ||||
| // server is in an unhealthy state. | ||||
| func pinger(c *cli.Context) error { | ||||
| func pinger(_ context.Context, c *cli.Command) error { | ||||
| 	scheme := "http" | ||||
| 	serverAddr := c.String("server-addr") | ||||
| 	if strings.HasPrefix(serverAddr, ":") { | ||||
|   | ||||
| @@ -15,18 +15,24 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
|  | ||||
| 	_ "github.com/joho/godotenv/autoload" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	_ "go.woodpecker-ci.org/woodpecker/v2/cmd/server/docs" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/utils" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/version" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	app := cli.NewApp() | ||||
| 	ctx := utils.WithContextSigtermCallback(context.Background(), func() { | ||||
| 		log.Info().Msg("termination signal is received, shutting down server") | ||||
| 	}) | ||||
|  | ||||
| 	app := cli.Command{} | ||||
| 	app.Name = "woodpecker-server" | ||||
| 	app.Version = version.String() | ||||
| 	app.Usage = "woodpecker server" | ||||
| @@ -42,7 +48,7 @@ func main() { | ||||
|  | ||||
| 	setupSwaggerStaticConfig() | ||||
|  | ||||
| 	if err := app.Run(os.Args); err != nil { | ||||
| 	if err := app.Run(ctx, os.Args); err != nil { | ||||
| 		log.Error().Err(err).Msgf("error running server") | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -30,7 +30,7 @@ import ( | ||||
| 	prometheus_http "github.com/prometheus/client_golang/prometheus/promhttp" | ||||
| 	"github.com/rs/zerolog" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| 	"golang.org/x/sync/errgroup" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/server" | ||||
| @@ -39,7 +39,6 @@ import ( | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/server/router/middleware" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/server/web" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/logger" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/utils" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/version" | ||||
| ) | ||||
|  | ||||
| @@ -53,15 +52,11 @@ var ( | ||||
| 	shutdownCtx                                = context.Background() | ||||
| ) | ||||
|  | ||||
| func run(c *cli.Context) error { | ||||
| 	if err := logger.SetupGlobalLogger(c, true); err != nil { | ||||
| func run(ctx context.Context, c *cli.Command) error { | ||||
| 	if err := logger.SetupGlobalLogger(ctx, c, true); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	ctx := utils.WithContextSigtermCallback(c.Context, func() { | ||||
| 		log.Info().Msg("termination signal is received, shutting down server") | ||||
| 	}) | ||||
|  | ||||
| 	ctx, ctxCancel := context.WithCancelCause(ctx) | ||||
| 	stopServerFunc = func(err error) { | ||||
| 		if err != nil { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ import ( | ||||
|  | ||||
| 	"github.com/gorilla/securecookie" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/server" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/server/cache" | ||||
| @@ -51,7 +51,7 @@ const ( | ||||
| 	storeInfoRefreshInterval = 10 * time.Second | ||||
| ) | ||||
|  | ||||
| func setupStore(ctx context.Context, c *cli.Context) (store.Store, error) { | ||||
| func setupStore(ctx context.Context, c *cli.Command) (store.Store, error) { | ||||
| 	datasource := c.String("datasource") | ||||
| 	driver := c.String("driver") | ||||
| 	xorm := store.XORM{ | ||||
| @@ -112,7 +112,7 @@ func setupMembershipService(_ context.Context, _store store.Store) cache.Members | ||||
| 	return cache.NewMembershipService(_store) | ||||
| } | ||||
|  | ||||
| func setupLogStore(c *cli.Context, s store.Store) (logService.Service, error) { | ||||
| func setupLogStore(c *cli.Command, s store.Store) (logService.Service, error) { | ||||
| 	switch c.String("log-store") { | ||||
| 	case "file": | ||||
| 		return file.NewLogStore(c.String("log-store-file-path")) | ||||
| @@ -144,7 +144,7 @@ func setupJWTSecret(_store store.Store) (string, error) { | ||||
| 	return jwtSecret, nil | ||||
| } | ||||
|  | ||||
| func setupEvilGlobals(ctx context.Context, c *cli.Context, s store.Store) error { | ||||
| func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store) error { | ||||
| 	// services | ||||
| 	server.Config.Services.Queue = setupQueue(ctx, s) | ||||
| 	server.Config.Services.Logs = logging.New() | ||||
| @@ -175,15 +175,15 @@ func setupEvilGlobals(ctx context.Context, c *cli.Context, s store.Store) error | ||||
| 		events = append(events, model.WebhookEvent(v)) | ||||
| 	} | ||||
| 	server.Config.Pipeline.DefaultCancelPreviousPipelineEvents = events | ||||
| 	server.Config.Pipeline.DefaultTimeout = c.Int64("default-pipeline-timeout") | ||||
| 	server.Config.Pipeline.MaxTimeout = c.Int64("max-pipeline-timeout") | ||||
| 	server.Config.Pipeline.DefaultTimeout = c.Int("default-pipeline-timeout") | ||||
| 	server.Config.Pipeline.MaxTimeout = c.Int("max-pipeline-timeout") | ||||
|  | ||||
| 	// limits | ||||
| 	server.Config.Pipeline.Limits.MemSwapLimit = c.Int64("limit-mem-swap") | ||||
| 	server.Config.Pipeline.Limits.MemLimit = c.Int64("limit-mem") | ||||
| 	server.Config.Pipeline.Limits.ShmSize = c.Int64("limit-shm-size") | ||||
| 	server.Config.Pipeline.Limits.CPUQuota = c.Int64("limit-cpu-quota") | ||||
| 	server.Config.Pipeline.Limits.CPUShares = c.Int64("limit-cpu-shares") | ||||
| 	server.Config.Pipeline.Limits.MemSwapLimit = c.Int("limit-mem-swap") | ||||
| 	server.Config.Pipeline.Limits.MemLimit = c.Int("limit-mem") | ||||
| 	server.Config.Pipeline.Limits.ShmSize = c.Int("limit-shm-size") | ||||
| 	server.Config.Pipeline.Limits.CPUQuota = c.Int("limit-cpu-quota") | ||||
| 	server.Config.Pipeline.Limits.CPUShares = c.Int("limit-cpu-shares") | ||||
| 	server.Config.Pipeline.Limits.CPUSet = c.String("limit-cpu-set") | ||||
|  | ||||
| 	// backend options for pipeline compiler | ||||
|   | ||||
							
								
								
									
										4
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.mod
									
									
									
									
									
								
							| @@ -56,7 +56,8 @@ require ( | ||||
| 	github.com/swaggo/files v1.0.1 | ||||
| 	github.com/swaggo/gin-swagger v1.6.0 | ||||
| 	github.com/swaggo/swag v1.16.3 | ||||
| 	github.com/urfave/cli/v2 v2.27.2 | ||||
| 	github.com/urfave/cli-docs/v3 v3.0.0-alpha5.0.20240714105325-1da00919bcb4 | ||||
| 	github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240711030030-937cfe918cb1 | ||||
| 	github.com/xanzy/go-gitlab v0.106.0 | ||||
| 	github.com/xeipuuv/gojsonschema v1.2.0 | ||||
| 	github.com/zalando/go-keyring v0.2.5 | ||||
| @@ -180,7 +181,6 @@ require ( | ||||
| 	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect | ||||
| 	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect | ||||
| 	github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect | ||||
| 	github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect | ||||
| 	github.com/zeebo/blake3 v0.2.3 // indirect | ||||
| 	go.uber.org/zap v1.27.0 // indirect | ||||
| 	golang.org/x/arch v0.8.0 // indirect | ||||
|   | ||||
							
								
								
									
										8
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.sum
									
									
									
									
									
								
							| @@ -482,8 +482,10 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS | ||||
| github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= | ||||
| github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= | ||||
| github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= | ||||
| github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= | ||||
| github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= | ||||
| github.com/urfave/cli-docs/v3 v3.0.0-alpha5.0.20240714105325-1da00919bcb4 h1:exFN/ZOxXslYr9t2AjrniP7wPjp/VLLAJhgazj92EBg= | ||||
| github.com/urfave/cli-docs/v3 v3.0.0-alpha5.0.20240714105325-1da00919bcb4/go.mod h1:AIqom6Q60U4tiqHp41i7+/AB2XHgi1WvQ7jOFlccmZ4= | ||||
| github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240711030030-937cfe918cb1 h1:oxO/Jem1QPy4lxbDtX8PMiFbL79dNMA6CNAfbC06rn4= | ||||
| github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240711030030-937cfe918cb1/go.mod h1:Z1ItyMma7t6I7zHG9OpbExhHQOSkFf/96n+mAZ9MtVI= | ||||
| github.com/xanzy/go-gitlab v0.106.0 h1:EDfD03K74cIlQo2EducfiupVrip+Oj02bq9ofw5F8sA= | ||||
| github.com/xanzy/go-gitlab v0.106.0/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI= | ||||
| github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= | ||||
| @@ -495,8 +497,6 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 | ||||
| github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= | ||||
| github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= | ||||
| github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= | ||||
| github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= | ||||
| github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||
|   | ||||
| @@ -31,7 +31,7 @@ import ( | ||||
| 	std_copy "github.com/moby/moby/pkg/stdcopy" | ||||
| 	"github.com/moby/term" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" | ||||
| 	"go.woodpecker-ci.org/woodpecker/v2/shared/utils" | ||||
| @@ -63,7 +63,7 @@ func (e *docker) Name() string { | ||||
| } | ||||
|  | ||||
| func (e *docker) IsAvailable(ctx context.Context) bool { | ||||
| 	if c, ok := ctx.Value(backend.CliContext).(*cli.Context); ok { | ||||
| 	if c, ok := ctx.Value(backend.CliCommand).(*cli.Command); ok { | ||||
| 		if c.IsSet("backend-docker-host") { | ||||
| 			return true | ||||
| 		} | ||||
| @@ -101,7 +101,7 @@ func (e *docker) Flags() []cli.Flag { | ||||
|  | ||||
| // 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) | ||||
| 	c, ok := ctx.Value(backend.CliCommand).(*cli.Command) | ||||
| 	if !ok { | ||||
| 		return nil, backend.ErrNoCliContextFound | ||||
| 	} | ||||
|   | ||||
| @@ -15,44 +15,44 @@ | ||||
| package docker | ||||
|  | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| var Flags = []cli.Flag{ | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_DOCKER_HOST", "DOCKER_HOST"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_HOST", "DOCKER_HOST"), | ||||
| 		Name:    "backend-docker-host", | ||||
| 		Usage:   "path to docker socket or url to the docker server", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_DOCKER_API_VERSION", "DOCKER_API_VERSION"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_API_VERSION", "DOCKER_API_VERSION"), | ||||
| 		Name:    "backend-docker-api-version", | ||||
| 		Usage:   "the version of the API to reach, leave empty for latest.", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_DOCKER_CERT_PATH", "DOCKER_CERT_PATH"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_CERT_PATH", "DOCKER_CERT_PATH"), | ||||
| 		Name:    "backend-docker-cert", | ||||
| 		Usage:   "path to load the TLS certificates for connecting to docker server", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_DOCKER_TLS_VERIFY", "DOCKER_TLS_VERIFY"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_TLS_VERIFY", "DOCKER_TLS_VERIFY"), | ||||
| 		Name:    "backend-docker-tls-verify", | ||||
| 		Usage:   "enable or disable TLS verification for connecting to docker server", | ||||
| 		Value:   true, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_DOCKER_ENABLE_IPV6"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_ENABLE_IPV6"), | ||||
| 		Name:    "backend-docker-ipv6", | ||||
| 		Usage:   "backend docker enable IPV6", | ||||
| 		Value:   false, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_DOCKER_NETWORK"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_NETWORK"), | ||||
| 		Name:    "backend-docker-network", | ||||
| 		Usage:   "backend docker network", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_DOCKER_VOLUMES"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_VOLUMES"), | ||||
| 		Name:    "backend-docker-volumes", | ||||
| 		Usage:   "backend docker volumes (comma separated)", | ||||
| 	}, | ||||
|   | ||||
| @@ -27,7 +27,7 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
|  | ||||
| 	backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types" | ||||
| ) | ||||
|   | ||||
| @@ -14,76 +14,78 @@ | ||||
|  | ||||
| package kubernetes | ||||
|  | ||||
| import "github.com/urfave/cli/v2" | ||||
| import ( | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| var Flags = []cli.Flag{ | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_NAMESPACE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_NAMESPACE"), | ||||
| 		Name:    "backend-k8s-namespace", | ||||
| 		Usage:   "backend k8s namespace", | ||||
| 		Value:   "woodpecker", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_VOLUME_SIZE"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_VOLUME_SIZE"), | ||||
| 		Name:    "backend-k8s-volume-size", | ||||
| 		Usage:   "backend k8s volume size (default 10G)", | ||||
| 		Value:   "10G", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_STORAGE_CLASS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_STORAGE_CLASS"), | ||||
| 		Name:    "backend-k8s-storage-class", | ||||
| 		Usage:   "backend k8s storage class", | ||||
| 		Value:   "", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_STORAGE_RWX"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_STORAGE_RWX"), | ||||
| 		Name:    "backend-k8s-storage-rwx", | ||||
| 		Usage:   "backend k8s storage access mode, should ReadWriteMany (RWX) instead of ReadWriteOnce (RWO) be used? (default: true)", | ||||
| 		Value:   true, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_POD_LABELS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_POD_LABELS"), | ||||
| 		Name:    "backend-k8s-pod-labels", | ||||
| 		Usage:   "backend k8s additional Agent-wide worker pod labels", | ||||
| 		Value:   "", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_POD_LABELS_ALLOW_FROM_STEP"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_POD_LABELS_ALLOW_FROM_STEP"), | ||||
| 		Name:    "backend-k8s-pod-labels-allow-from-step", | ||||
| 		Usage:   "whether to allow using labels from step's backend options", | ||||
| 		Value:   false, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_POD_ANNOTATIONS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_POD_ANNOTATIONS"), | ||||
| 		Name:    "backend-k8s-pod-annotations", | ||||
| 		Usage:   "backend k8s additional Agent-wide worker pod annotations", | ||||
| 		Value:   "", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_POD_NODE_SELECTOR"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_POD_NODE_SELECTOR"), | ||||
| 		Name:    "backend-k8s-pod-node-selector", | ||||
| 		Usage:   "backend k8s Agent-wide worker pod node selector", | ||||
| 		Value:   "", | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_POD_ANNOTATIONS_ALLOW_FROM_STEP"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_POD_ANNOTATIONS_ALLOW_FROM_STEP"), | ||||
| 		Name:    "backend-k8s-pod-annotations-allow-from-step", | ||||
| 		Usage:   "whether to allow using annotations from step's backend options", | ||||
| 		Value:   false, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_SECCTX_NONROOT"}, // cspell:words secctx nonroot | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_SECCTX_NONROOT"), // cspell:words secctx nonroot | ||||
| 		Name:    "backend-k8s-secctx-nonroot", | ||||
| 		Usage:   "`run as non root` Kubernetes security context option", | ||||
| 	}, | ||||
| 	&cli.StringSliceFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_PULL_SECRET_NAMES"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_PULL_SECRET_NAMES"), | ||||
| 		Name:    "backend-k8s-pod-image-pull-secret-names", | ||||
| 		Usage:   "backend k8s pull secret names for private registries", | ||||
| 		Value:   cli.NewStringSlice("regcred"), | ||||
| 		Value:   []string{"regcred"}, | ||||
| 	}, | ||||
| 	&cli.BoolFlag{ | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_K8S_ALLOW_NATIVE_SECRETS"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_ALLOW_NATIVE_SECRETS"), | ||||
| 		Name:    "backend-k8s-allow-native-secrets", | ||||
| 		Usage:   "whether to allow existing Kubernetes secrets to be referenced from steps", | ||||
| 		Value:   false, | ||||
|   | ||||
| @@ -25,7 +25,7 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| 	"gopkg.in/yaml.v3" | ||||
| 	v1 "k8s.io/api/core/v1" | ||||
| 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| @@ -83,7 +83,7 @@ func newDefaultDeleteOptions() meta_v1.DeleteOptions { | ||||
|  | ||||
| func configFromCliContext(ctx context.Context) (*config, error) { | ||||
| 	if ctx != nil { | ||||
| 		if c, ok := ctx.Value(types.CliContext).(*cli.Context); ok { | ||||
| 		if c, ok := ctx.Value(types.CliCommand).(*cli.Command); ok { | ||||
| 			config := config{ | ||||
| 				Namespace:                   c.String("backend-k8s-namespace"), | ||||
| 				StorageClass:                c.String("backend-k8s-storage-class"), | ||||
|   | ||||
| @@ -17,13 +17,13 @@ package local | ||||
| import ( | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/urfave/cli/v2" | ||||
| 	"github.com/urfave/cli/v3" | ||||
| ) | ||||
|  | ||||
| var Flags = []cli.Flag{ | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "backend-local-temp-dir", | ||||
| 		EnvVars: []string{"WOODPECKER_BACKEND_LOCAL_TEMP_DIR"}, | ||||
| 		Sources: cli.EnvVars("WOODPECKER_BACKEND_LOCAL_TEMP_DIR"), | ||||
| 		Usage:   "set a different temp dir to clone workflows into", | ||||
| 		Value:   os.TempDir(), | ||||
| 	}, | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user