From 67b6cdf4a6a34c98488f860ff9530cd73bdded2b Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 22 Jul 2024 23:32:14 +0000 Subject: [PATCH] Migrate to github.com/urfave/cli/v3 (#29) Reviewed-on: https://codeberg.org/woodpecker-plugins/go-plugin/pulls/29 Reviewed-by: Patrick Schratz Co-authored-by: 6543 <6543@obermui.de> Co-committed-by: 6543 <6543@obermui.de> --- README.md | 4 +- commit.go | 180 ++++++++++++++++++++++++++++++----------------- flags.go | 2 +- forge.go | 18 ++--- go.mod | 5 +- go.sum | 10 +-- http.go | 42 ++++++----- logger.go | 14 ++-- metadata.go | 18 ++--- metadata_test.go | 2 +- pipeline.go | 60 ++++++++-------- plugin.go | 26 ++++--- plugin_test.go | 2 +- repo.go | 32 ++++----- step.go | 26 +++---- system.go | 34 ++++----- 16 files changed, 268 insertions(+), 207 deletions(-) diff --git a/README.md b/README.md index 752b6d7..bde3716 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ import ( "codeberg.org/woodpecker-plugins/go-plugin" "github.com/rs/zerolog/log" - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) type Settings struct { @@ -44,7 +44,7 @@ func (p *Plugin) Flags() []cli.Flag { &cli.StringFlag{ Name: "sample.flag", Usage: "sample flag", - EnvVars: []string{"PLUGIN_SAMPLE_FLAG"}, + Sources: cli.EnvVars("PLUGIN_SAMPLE_FLAG"), Destination: &p.Settings.SampleFlag, }, } diff --git a/commit.go b/commit.go index 4e8695c..fe5e5df 100644 --- a/commit.go +++ b/commit.go @@ -15,7 +15,7 @@ package plugin import ( - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) type ( @@ -44,69 +44,106 @@ type ( func commitFlags() []cli.Flag { return []cli.Flag{ &cli.StringFlag{ - Name: "commit.sha", - Usage: "commit SHA", - EnvVars: []string{"CI_COMMIT_SHA", "DRONE_COMMIT", "DRONE_COMMIT_SHA"}, + Name: "commit.sha", + Usage: "commit SHA", + Sources: cli.EnvVars( + "CI_COMMIT_SHA", + "DRONE_COMMIT", + "DRONE_COMMIT_SHA", + ), }, &cli.StringFlag{ - Name: "commit.ref", - Usage: "commit ref", - EnvVars: []string{"CI_COMMIT_REF", "DRONE_COMMIT_REF"}, + Name: "commit.ref", + Usage: "commit ref", + Sources: cli.EnvVars( + "CI_COMMIT_REF", + "DRONE_COMMIT_REF", + ), }, &cli.StringFlag{ - Name: "commit.refspec", - Usage: "commit refspec", - EnvVars: []string{"CI_COMMIT_REFSPEC"}, + Name: "commit.refspec", + Usage: "commit refspec", + Sources: cli.EnvVars( + "CI_COMMIT_REFSPEC", + ), }, &cli.StringFlag{ - Name: "commit.pull-request", - Usage: "commit pull request", - EnvVars: []string{"CI_COMMIT_PULL_REQUEST", "DRONE_PULL_REQUEST"}, + Name: "commit.pull-request", + Usage: "commit pull request", + Sources: cli.EnvVars( + "CI_COMMIT_PULL_REQUEST", + "DRONE_PULL_REQUEST", + ), }, &cli.StringFlag{ - Name: "commit.source-branch", - Usage: "commit source branch", - EnvVars: []string{"CI_COMMIT_SOURCE_BRANCH", "DRONE_SOURCE_BRANCH"}, + Name: "commit.source-branch", + Usage: "commit source branch", + Sources: cli.EnvVars( + "CI_COMMIT_SOURCE_BRANCH", + "DRONE_SOURCE_BRANCH", + ), }, &cli.StringFlag{ - Name: "commit.target-branch", - Usage: "commit target branch", - EnvVars: []string{"CI_COMMIT_TARGET_BRANCH", "DRONE_TARGET_BRANCH"}, + Name: "commit.target-branch", + Usage: "commit target branch", + Sources: cli.EnvVars( + "CI_COMMIT_TARGET_BRANCH", + "DRONE_TARGET_BRANCH", + ), }, &cli.StringFlag{ - Name: "commit.branch", - Usage: "commit branch", - EnvVars: []string{"CI_COMMIT_BRANCH", "DRONE_BRANCH"}, + Name: "commit.branch", + Usage: "commit branch", + Sources: cli.EnvVars( + "CI_COMMIT_BRANCH", + "DRONE_BRANCH", + ), }, &cli.StringFlag{ - Name: "commit.tag", - Usage: "commit tag", - EnvVars: []string{"CI_COMMIT_TAG", "DRONE_TAG"}, + Name: "commit.tag", + Usage: "commit tag", + Sources: cli.EnvVars( + "CI_COMMIT_TAG", + "DRONE_TAG", + ), }, &cli.StringFlag{ - Name: "commit.message", - Usage: "commit message", - EnvVars: []string{"CI_COMMIT_MESSAGE", "DRONE_COMMIT_MESSAGE"}, + Name: "commit.message", + Usage: "commit message", + Sources: cli.EnvVars( + "CI_COMMIT_MESSAGE", + "DRONE_COMMIT_MESSAGE", + ), }, &cli.StringFlag{ - Name: "commit.author.name", - Usage: "commit author name", - EnvVars: []string{"CI_COMMIT_AUTHOR", "DRONE_COMMIT_AUTHOR", "DRONE_COMMIT_AUTHOR_NAME"}, + Name: "commit.author.name", + Usage: "commit author name", + Sources: cli.EnvVars( + "CI_COMMIT_AUTHOR", + "DRONE_COMMIT_AUTHOR", + "DRONE_COMMIT_AUTHOR_NAME", + ), }, &cli.StringFlag{ - Name: "commit.author.email", - Usage: "commit author email", - EnvVars: []string{"CI_COMMIT_AUTHOR_EMAIL", "DRONE_COMMIT_AUTHOR_EMAIL"}, + Name: "commit.author.email", + Usage: "commit author email", + Sources: cli.EnvVars( + "CI_COMMIT_AUTHOR_EMAIL", + "DRONE_COMMIT_AUTHOR_EMAIL", + ), }, &cli.StringFlag{ - Name: "commit.author.avatar", - Usage: "commit author avatar", - EnvVars: []string{"CI_COMMIT_AUTHOR_AVATAR", "DRONE_COMMIT_AUTHOR_AVATAR"}, + Name: "commit.author.avatar", + Usage: "commit author avatar", + Sources: cli.EnvVars( + "CI_COMMIT_AUTHOR_AVATAR", + "DRONE_COMMIT_AUTHOR_AVATAR", + ), }, } } -func commitFromContext(c *cli.Context) Commit { +func commitFromContext(c *cli.Command) Commit { return Commit{ Sha: c.String("commit.sha"), Ref: c.String("commit.ref"), @@ -128,49 +165,66 @@ func commitFromContext(c *cli.Context) Commit { func previousCommitFlags() []cli.Flag { return []cli.Flag{ &cli.StringFlag{ - Name: "prev.commit.sha", - Usage: "previous commit SHA", - EnvVars: []string{"CI_PREV_COMMIT_SHA", "DRONE_COMMIT_BEFORE"}, + Name: "prev.commit.sha", + Usage: "previous commit SHA", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_SHA", + "DRONE_COMMIT_BEFORE", + ), }, &cli.StringFlag{ - Name: "prev.commit.ref", - Usage: "previous commit ref", - EnvVars: []string{"CI_PREV_COMMIT_REF"}, + Name: "prev.commit.ref", + Usage: "previous commit ref", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_REF", + ), }, &cli.StringFlag{ - Name: "prev.commit.refspec", - Usage: "previous commit refspec", - EnvVars: []string{"CI_PREV_COMMIT_REFSPEC"}, + Name: "prev.commit.refspec", + Usage: "previous commit refspec", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_REFSPEC", + ), }, &cli.StringFlag{ - Name: "prev.commit.branch", - Usage: "previous commit branch", - EnvVars: []string{"CI_PREV_COMMIT_BRANCH"}, + Name: "prev.commit.branch", + Usage: "previous commit branch", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_BRANCH", + ), }, &cli.StringFlag{ - Name: "prev.commit.message", - Usage: "previous commit message", - EnvVars: []string{"CI_PREV_COMMIT_MESSAGE"}, + Name: "prev.commit.message", + Usage: "previous commit message", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_MESSAGE", + ), }, &cli.StringFlag{ - Name: "prev.commit.author.name", - Usage: "previous commit author name", - EnvVars: []string{"CI_PREV_COMMIT_AUTHOR"}, + Name: "prev.commit.author.name", + Usage: "previous commit author name", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_AUTHOR", + ), }, &cli.StringFlag{ - Name: "prev.commit.author.email", - Usage: "previous commit author email", - EnvVars: []string{"CI_PREV_COMMIT_AUTHOR_EMAIL"}, + Name: "prev.commit.author.email", + Usage: "previous commit author email", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_AUTHOR_EMAIL", + ), }, &cli.StringFlag{ - Name: "prev.commit.author.avatar", - Usage: "previous commit author avatar", - EnvVars: []string{"CI_PREV_COMMIT_AUTHOR_AVATAR"}, + Name: "prev.commit.author.avatar", + Usage: "previous commit author avatar", + Sources: cli.EnvVars( + "CI_PREV_COMMIT_AUTHOR_AVATAR", + ), }, } } -func previousCommitFromContext(c *cli.Context) Commit { +func previousCommitFromContext(c *cli.Command) Commit { return Commit{ Sha: c.String("prev.commit.sha"), Ref: c.String("prev.commit.ref"), diff --git a/flags.go b/flags.go index 84394f6..714a744 100644 --- a/flags.go +++ b/flags.go @@ -15,7 +15,7 @@ package plugin import ( - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) // Flags has the cli.Flags for the Woodpecker plugin. diff --git a/forge.go b/forge.go index 63bcd9b..4115808 100644 --- a/forge.go +++ b/forge.go @@ -15,7 +15,7 @@ package plugin import ( - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) const ( @@ -40,26 +40,26 @@ func forgeFlags() []cli.Flag { &cli.StringFlag{ Name: "forge.type", Usage: "forge type (gitea, forgejo, github, gitlab, bitbucket)", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_FORGE_TYPE", - }, + ), }, &cli.StringFlag{ Name: "forge.url", Aliases: []string{"forge.link"}, Usage: "forge url", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_FORGE_URL", "CI_FORGE_LINK", - }, + ), }, } } -func forgeFromContext(ctx *cli.Context) Forge { +func forgeFromContext(c *cli.Command) Forge { return Forge{ - Type: ctx.String("forge.type"), - Link: ctx.String("forge.url"), - URL: ctx.String("forge.url"), + Type: c.String("forge.type"), + Link: c.String("forge.url"), + URL: c.String("forge.url"), } } diff --git a/go.mod b/go.mod index a694455..1c4687e 100644 --- a/go.mod +++ b/go.mod @@ -6,18 +6,15 @@ require ( github.com/joho/godotenv v1.5.1 github.com/rs/zerolog v1.33.0 github.com/stretchr/testify v1.9.0 - github.com/urfave/cli/v2 v2.27.2 + github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f golang.org/x/net v0.27.0 ) require ( - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect golang.org/x/sys v0.22.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 2f779a2..b31f100 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,4 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -17,14 +15,10 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -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/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/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f h1:yCJ90PBe7+45EQSF3qJXyAGW5rkE65lE8huv5pM0HY8= +github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240717192922-127cf54fac9f/go.mod h1:Z1ItyMma7t6I7zHG9OpbExhHQOSkFf/96n+mAZ9MtVI= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/http.go b/http.go index 066f3a9..0d18c7f 100644 --- a/http.go +++ b/http.go @@ -23,37 +23,43 @@ import ( "time" "github.com/rs/zerolog/log" - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" "golang.org/x/net/proxy" ) func httpClientFlags() []cli.Flag { return []cli.Flag{ &cli.BoolFlag{ - Name: "transport.skip-verify", - Usage: "skip ssl verify", - EnvVars: []string{"PLUGIN_SKIP_VERIFY"}, + Name: "transport.skip-verify", + Usage: "skip ssl verify", + Sources: cli.EnvVars( + "PLUGIN_SKIP_VERIFY", + ), }, &cli.StringFlag{ - Name: "transport.socks-proxy", - Usage: "socks proxy address", - EnvVars: []string{"SOCKS_PROXY"}, - Hidden: true, + Name: "transport.socks-proxy", + Usage: "socks proxy address", + Sources: cli.EnvVars( + "SOCKS_PROXY", + ), + Hidden: true, }, &cli.BoolFlag{ - Name: "transport.socks-proxy-off", - Usage: "socks proxy ignored", - EnvVars: []string{"SOCKS_PROXY_OFF"}, - Hidden: true, + Name: "transport.socks-proxy-off", + Usage: "socks proxy ignored", + Sources: cli.EnvVars( + "SOCKS_PROXY_OFF", + ), + Hidden: true, }, } } -func HTTPClientFromContext(ctx *cli.Context) *http.Client { +func HTTPClientFromContext(c *cli.Command) *http.Client { var ( - skip = ctx.Bool("transport.skip-verify") - socks = ctx.String("transport.socks-proxy") - socksoff = ctx.Bool("transport.socks-proxy-off") + skip = c.Bool("transport.skip-verify") + socks = c.String("transport.socks-proxy") + socksOff = c.Bool("transport.socks-proxy-off") ) certs, err := x509.SystemCertPool() @@ -80,7 +86,7 @@ func HTTPClientFromContext(ctx *cli.Context) *http.Client { DualStack: true, } - if len(socks) != 0 && !socksoff { + if len(socks) != 0 && !socksOff { proxyDialer, err := proxy.SOCKS5("tcp", socks, nil, dialer) if err != nil { log.Error().Err(err).Msg("failed to create socks proxy") @@ -88,7 +94,7 @@ func HTTPClientFromContext(ctx *cli.Context) *http.Client { if contextDialer, ok := proxyDialer.(proxy.ContextDialer); ok { transport.DialContext = contextDialer.DialContext } else { - transport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { + transport.DialContext = func(_ context.Context, network, addr string) (net.Conn, error) { return proxyDialer.Dial(network, addr) } } diff --git a/logger.go b/logger.go index 0770c00..6346948 100644 --- a/logger.go +++ b/logger.go @@ -19,22 +19,24 @@ import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) func loggingFlags() []cli.Flag { return []cli.Flag{ &cli.StringFlag{ - Name: "log-level", - Usage: "log level", - EnvVars: []string{"PLUGIN_LOG_LEVEL"}, - Value: "info", + Name: "log-level", + Usage: "log level", + Sources: cli.EnvVars( + "PLUGIN_LOG_LEVEL", + ), + Value: "info", }, } } // SetupConsoleLogger sets up the console logger. -func SetupConsoleLogger(c *cli.Context) error { +func SetupConsoleLogger(c *cli.Command) error { level := c.String("log-level") lvl, err := zerolog.ParseLevel(level) if err != nil { diff --git a/metadata.go b/metadata.go index 2be333c..419173b 100644 --- a/metadata.go +++ b/metadata.go @@ -15,7 +15,7 @@ package plugin import ( - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) // Metadata defines runtime metadata. @@ -36,18 +36,18 @@ type Metadata struct { } // MetadataFromContext creates a Metadata from the cli.Context. -func MetadataFromContext(ctx *cli.Context) Metadata { - commit := commitFromContext(ctx) - previousCommit := previousCommitFromContext(ctx) +func MetadataFromContext(c *cli.Command) Metadata { + commit := commitFromContext(c) + previousCommit := previousCommitFromContext(c) return Metadata{ - Repository: repositoryFromContext(ctx), - Pipeline: pipelineFromContext(ctx), + Repository: repositoryFromContext(c), + Pipeline: pipelineFromContext(c), Commit: commit, PreviousCommit: previousCommit, - Step: stepFromContext(ctx), - System: systemFromContext(ctx), - Forge: forgeFromContext(ctx), + Step: stepFromContext(c), + System: systemFromContext(c), + Forge: forgeFromContext(c), Curr: commit, Prev: previousCommit, diff --git a/metadata_test.go b/metadata_test.go index 3d8e89b..0103f4f 100644 --- a/metadata_test.go +++ b/metadata_test.go @@ -79,7 +79,7 @@ func TestMetadata(t *testing.T) { return nil }, }) - err := plugin.app.Run([]string{"test"}) + err := plugin.app.Run(plugin.ctx, []string{"test"}) require.NoError(t, err) // Repository diff --git a/pipeline.go b/pipeline.go index 65a4444..4b1cda0 100644 --- a/pipeline.go +++ b/pipeline.go @@ -17,7 +17,7 @@ package plugin import ( "time" - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) const ( @@ -47,94 +47,94 @@ type Pipeline struct { func pipelineFlags() []cli.Flag { return []cli.Flag{ - &cli.Int64Flag{ + &cli.IntFlag{ Name: "pipeline.number", Usage: "pipeline number", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_NUMBER", "DRONE_BUILD_NUMBER", - }, + ), }, &cli.StringFlag{ Name: "pipeline.status", Usage: "pipeline status", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_STATUS", "DRONE_BUILD_STATUS", - }, + ), }, &cli.StringFlag{ Name: "pipeline.event", Usage: "pipeline event", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_EVENT", "DRONE_BUILD_EVENT", - }, + ), }, &cli.StringFlag{ Name: "pipeline.url", Aliases: []string{"pipeline.link"}, Usage: "pipeline url", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_URL", "CI_PIPELINE_LINK", "DRONE_BUILD_LINK", - }, + ), }, &cli.StringFlag{ Name: "pipeline.deploy-target", Usage: "pipeline deployment target", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_DEPLOY_TARGET", "DRONE_DEPLOY_TO", - }, + ), }, - &cli.Int64Flag{ + &cli.IntFlag{ Name: "pipeline.created", Usage: "pipeline creation time", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_CREATED", "DRONE_BUILD_CREATED", - }, + ), }, - &cli.Int64Flag{ + &cli.IntFlag{ Name: "pipeline.started", Usage: "pipeline start time", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_STARTED", "DRONE_BUILD_STARTED", - }, + ), }, - &cli.Int64Flag{ + &cli.IntFlag{ Name: "pipeline.finished", Usage: "pipeline finish time", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_FINISHED", "DRONE_BUILD_FINISHED", - }, + ), }, - &cli.Int64Flag{ + &cli.IntFlag{ Name: "pipeline.parent", Usage: "pipeline parent", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_PIPELINE_PARENT", "DRONE_BUILD_PARENT", - }, + ), }, } } -func pipelineFromContext(c *cli.Context) Pipeline { +func pipelineFromContext(c *cli.Command) Pipeline { return Pipeline{ - Number: c.Int64("pipeline.number"), + Number: c.Int("pipeline.number"), Status: c.String("pipeline.status"), Event: c.String("pipeline.event"), URL: c.String("pipeline.url"), Link: c.String("pipeline.url"), DeployTarget: c.String("pipeline.deploy-target"), - Created: time.Unix(c.Int64("pipeline.created"), 0), - Started: time.Unix(c.Int64("pipeline.started"), 0), - Finished: time.Unix(c.Int64("pipeline.finished"), 0), - Parent: c.Int64("pipeline.parent"), + Created: time.Unix(c.Int("pipeline.created"), 0), + Started: time.Unix(c.Int("pipeline.started"), 0), + Finished: time.Unix(c.Int("pipeline.finished"), 0), + Parent: c.Int("pipeline.parent"), } } diff --git a/plugin.go b/plugin.go index bad2fe5..dd64f05 100644 --- a/plugin.go +++ b/plugin.go @@ -21,7 +21,7 @@ import ( "github.com/joho/godotenv" "github.com/rs/zerolog/log" - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) // Options defines the options for the plugin. @@ -36,13 +36,16 @@ type Options struct { Flags []cli.Flag // Execute function of the plugin. Execute ExecuteFunc + // Context the plugin will use while executing. + Context context.Context } // Plugin defines the plugin instance. type Plugin struct { - app *cli.App + app *cli.Command execute ExecuteFunc client *http.Client + ctx context.Context // Metadata of the current pipeline. Metadata Metadata } @@ -56,7 +59,7 @@ func New(opt Options) *Plugin { _ = godotenv.Overload("/run/woodpecker/env") } - app := &cli.App{ + app := &cli.Command{ Name: opt.Name, Usage: "Run the Woodpecker CI plugin", Description: opt.Description, @@ -67,25 +70,30 @@ func New(opt Options) *Plugin { plugin := &Plugin{ app: app, execute: opt.Execute, + ctx: opt.Context, } plugin.app.Action = plugin.action + if plugin.ctx == nil { + plugin.ctx = context.Background() + } + return plugin } -func (p *Plugin) action(ctx *cli.Context) error { - if err := SetupConsoleLogger(ctx); err != nil { +func (p *Plugin) action(ctx context.Context, c *cli.Command) error { + if err := SetupConsoleLogger(c); err != nil { return err } - p.Metadata = MetadataFromContext(ctx) - p.client = HTTPClientFromContext(ctx) + p.Metadata = MetadataFromContext(c) + p.client = HTTPClientFromContext(c) if p.execute == nil { panic("plugin execute function is not set") } - return p.execute(ctx.Context) + return p.execute(ctx) } // HTTPClient returns the http.Client instance. @@ -95,7 +103,7 @@ func (p *Plugin) HTTPClient() *http.Client { // Run the plugin. func (p *Plugin) Run() { - if err := p.app.Run(os.Args); err != nil { + if err := p.app.Run(p.ctx, os.Args); err != nil { log.Error().Err(err).Msg("execution failed") os.Exit(1) } diff --git a/plugin_test.go b/plugin_test.go index 65e66f7..c815146 100644 --- a/plugin_test.go +++ b/plugin_test.go @@ -30,7 +30,7 @@ func TestPlugin(t *testing.T) { return nil }, }) - err := p.app.Run([]string{"test"}) + err := p.app.Run(p.ctx, []string{"test"}) assert.NoError(t, err) assert.True(t, executed) } diff --git a/repo.go b/repo.go index 9040471..e4b1bb1 100644 --- a/repo.go +++ b/repo.go @@ -15,7 +15,7 @@ package plugin import ( - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) // Repository defines runtime metadata for a repository. @@ -38,64 +38,64 @@ func repositoryFlags() []cli.Flag { &cli.StringFlag{ Name: "repo.remote-id", Usage: "repo remote id", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_REPO_REMOTE_ID", - }, + ), }, &cli.StringFlag{ Name: "repo.name", Usage: "repo name", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_REPO_NAME", "DRONE_REPO_NAME", - }, + ), }, &cli.StringFlag{ Name: "repo.owner", Usage: "repo owner", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_REPO_OWNER", "DRONE_REPO_OWNER", - }, + ), }, &cli.StringFlag{ Name: "repo.url", Aliases: []string{"repo.link"}, Usage: "repo url", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_REPO_URL", "CI_REPO_LINK", "DRONE_REPO_LINK", - }, + ), }, &cli.StringFlag{ Name: "repo.clone-url", Usage: "repo clone url", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_REPO_CLONE_URL", "DRONE_GIT_HTTP_URL", - }, + ), }, &cli.BoolFlag{ Name: "repo.private", Usage: "repo private", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_REPO_PRIVATE", "DRONE_REPO_PRIVATE", - }, + ), }, &cli.StringFlag{ Name: "repo.default-branch", Usage: "repo default branch", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_REPO_DEFAULT_BRANCH", "DRONE_REPO_BRANCH", - }, + ), }, } } -func repositoryFromContext(c *cli.Context) Repository { +func repositoryFromContext(c *cli.Command) Repository { return Repository{ RemoteID: c.String("repo.remote-id"), Name: c.String("repo.name"), diff --git a/step.go b/step.go index c940fd2..51f2b31 100644 --- a/step.go +++ b/step.go @@ -17,7 +17,7 @@ package plugin import ( "time" - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) // Step defines runtime metadata for a step. @@ -32,32 +32,32 @@ func stepFlags() []cli.Flag { &cli.IntFlag{ Name: "step.number", Usage: "step number", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_STEP_NUMBER", "DRONE_STEP_NUMBER", - }, + ), }, - &cli.Int64Flag{ + &cli.IntFlag{ Name: "step.started", Usage: "step start time", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_STEP_STARTED", - }, + ), }, - &cli.Int64Flag{ + &cli.IntFlag{ Name: "step.finished", Usage: "step finish time", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_STEP_FINISHED", - }, + ), }, } } -func stepFromContext(c *cli.Context) Step { +func stepFromContext(c *cli.Command) Step { return Step{ - Number: c.Int("step.number"), - Started: time.Unix(c.Int64("step.started"), 0), - Finished: time.Unix(c.Int64("step.finished"), 0), + Number: int(c.Int("step.number")), + Started: time.Unix(c.Int("step.started"), 0), + Finished: time.Unix(c.Int("step.finished"), 0), } } diff --git a/system.go b/system.go index 59ed29e..3c26f11 100644 --- a/system.go +++ b/system.go @@ -17,7 +17,7 @@ package plugin import ( "os" - "github.com/urfave/cli/v2" + "github.com/urfave/cli/v3" ) // System defines runtime metadata for a ci/cd system. @@ -37,50 +37,50 @@ func systemFlags() []cli.Flag { &cli.StringFlag{ Name: "system.name", Usage: "system name", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_SYSTEM_NAME", - }, + ), }, &cli.StringFlag{ Name: "system.host", Usage: "system host", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_SYSTEM_HOST", "DRONE_SYSTEM_HOST", "DRONE_SYSTEM_HOSTNAME", - }, + ), }, &cli.StringFlag{ Name: "system.url", Aliases: []string{"system.link"}, Usage: "system url", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_SYSTEM_URL", "CI_SYSTEM_LINK", - }, + ), }, &cli.StringFlag{ Name: "system.arch", Usage: "system arch", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_SYSTEM_PLATFORM", "DRONE_STAGE_ARCH", - }, + ), }, &cli.StringFlag{ Name: "system.version", Usage: "system version", - EnvVars: []string{ + Sources: cli.EnvVars( "CI_SYSTEM_VERSION", "DRONE_SYSTEM_VERSION", - }, + ), }, } } -func systemFromContext(ctx *cli.Context) System { - url := ctx.String("system.url") - host := ctx.String("system.host") +func systemFromContext(c *cli.Command) System { + url := c.String("system.url") + host := c.String("system.host") if url == "" && host != "" { // Alternative url format used by Drone. proto := os.Getenv("DRONE_SYSTEM_PROTO") @@ -89,11 +89,11 @@ func systemFromContext(ctx *cli.Context) System { } } return System{ - Name: ctx.String("system.name"), + Name: c.String("system.name"), Host: host, URL: url, Link: url, - Platform: ctx.String("system.arch"), - Version: ctx.String("system.version"), + Platform: c.String("system.arch"), + Version: c.String("system.version"), } }