Migrate to github.com/urfave/cli/v3 (#2951)

This commit is contained in:
6543 2024-07-17 16:26:35 -07:00 committed by GitHub
parent e39345688d
commit cd5f6f71a2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
112 changed files with 817 additions and 673 deletions

View file

@ -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,
},
}

View file

@ -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,

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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,

View file

@ -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():

View file

@ -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
}
}

View file

@ -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)
}

View file

@ -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,

View file

@ -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,
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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,

View file

@ -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
}

View file

@ -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

View file

@ -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",
},
}

View file

@ -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"),

View file

@ -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
}

View file

@ -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
}

View file

@ -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,
},

View file

@ -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

View file

@ -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,
},
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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,
},
}

View file

@ -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()

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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 {

View file

@ -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)
})
}
}

View file

@ -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
}

View file

@ -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")

View file

@ -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)
})
}
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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()

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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,

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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")
)

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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",

View file

@ -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
}

View file

@ -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,

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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 {

View file

@ -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,

View file

@ -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

View file

@ -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
}
}

View file

@ -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)
}

View file

@ -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

View file

@ -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)
}

View file

@ -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
}
}

View file

@ -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 != "" {

View file

@ -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

View file

@ -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, ":") {

View file

@ -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")
}
}

View file

@ -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 {

View file

@ -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
View file

@ -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
View file

@ -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=

View file

@ -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
}

View file

@ -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)",
},

View file

@ -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"
)

View file

@ -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,

View file

@ -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"),

View file

@ -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