1
1
package main
2
2
3
3
import (
4
+ "context"
4
5
"fmt"
6
+ "io"
5
7
"log/slog"
6
8
"maps"
7
9
"os"
8
10
"slices"
9
11
"strings"
10
12
11
13
"github.com/lmittmann/tint"
12
- cli "github.com/urfave/cli/v2 "
14
+ cli "github.com/urfave/cli/v3 "
13
15
"github.com/willabides/actionslog"
14
16
"github.com/willabides/actionslog/human"
15
17
"golang.org/x/term"
@@ -23,6 +25,7 @@ const (
23
25
flagNamespace = "namespace"
24
26
flagParameter = "parameter"
25
27
flagRetries = "retries"
28
+ flagPrintConfig = "print-config"
26
29
flagWorkflowTemplate = "workflow-template"
27
30
)
28
31
@@ -42,13 +45,17 @@ func parseLogLevel(level string) (slog.Level, error) {
42
45
}
43
46
44
47
func main () {
48
+ runMain (os .Args , os .Stdout , os .Stderr )
49
+ }
50
+
51
+ func runMain (args []string , writer io.Writer , errWriter io.Writer ) {
45
52
// If we're on a terminal, we use tint, otherwise if we're on GitHub actions
46
53
// we use `willabites/actionslog` to log proper Actions messages, otherwise
47
54
// we use logfmt.
48
55
var lv slog.LevelVar
49
56
50
57
logger := slog .New (
51
- slog .NewTextHandler (os . Stderr , & slog.HandlerOptions {
58
+ slog .NewTextHandler (errWriter , & slog.HandlerOptions {
52
59
Level : & lv ,
53
60
}),
54
61
)
@@ -69,35 +76,64 @@ func main() {
69
76
)
70
77
}
71
78
72
- app := cli .NewApp ()
79
+ app := cli.Command {}
80
+ app .Writer = writer
81
+ app .ErrWriter = errWriter
73
82
app .Name = "Runs the Argo CLI"
74
83
75
- app .Action = func (c * cli.Context ) error { return run (c , & lv , logger ) }
84
+ app .Action = func (ctx context.Context , c * cli.Command ) error {
85
+ return fmt .Errorf ("please specify a command" )
86
+ }
87
+
88
+ app .Commands = []* cli.Command {
89
+ {
90
+ Name : "submit" ,
91
+ SkipFlagParsing : true ,
92
+ Writer : writer ,
93
+ ErrWriter : errWriter ,
94
+ Action : func (ctx context.Context , c * cli.Command ) error {
95
+ return run (ctx , c , & lv , logger , "submit" )
96
+ },
97
+ },
98
+ }
76
99
77
100
app .Flags = []cli.Flag {
78
101
& cli.BoolFlag {
79
- Name : flagAddCILabels ,
80
- EnvVars : []string {"ADD_CI_LABELS" },
81
- Value : false ,
82
- Usage : "If true, the `--labels` argument will be added with values from the environment. This is forced for the `submit` command" ,
102
+ Name : flagPrintConfig ,
103
+ Required : false ,
104
+ Usage : "If set thie command will only print the gathered configuration and exist" ,
105
+ },
106
+ & cli.BoolFlag {
107
+ Name : flagAddCILabels ,
108
+ Sources : cli .NewValueSourceChain (
109
+ cli .EnvVar ("ADD_CI_LABELS" ),
110
+ ),
111
+ Value : false ,
112
+ Usage : "If true, the `--labels` argument will be added with values from the environment. This is forced for the `submit` command" ,
83
113
},
84
114
& cli.StringFlag {
85
- Name : flagNamespace ,
86
- EnvVars : []string {"ARGO_NAMESPACE" },
115
+ Name : flagNamespace ,
116
+ Sources : cli .NewValueSourceChain (
117
+ cli .EnvVar ("ARGO_NAMESPACE" ),
118
+ ),
87
119
Required : true ,
88
120
},
89
121
& cli.StringFlag {
90
- Name : flagArgoToken ,
91
- EnvVars : []string {"ARGO_TOKEN" },
122
+ Name : flagArgoToken ,
123
+ Sources : cli .NewValueSourceChain (
124
+ cli .EnvVar ("ARGO_TOKEN" ),
125
+ ),
92
126
Usage : "The Argo token to use for authentication" ,
93
127
Required : true ,
94
128
},
95
129
& cli.StringFlag {
96
- Name : flagLogLevel ,
97
- EnvVars : []string {"LOG_LEVEL" },
98
- Usage : "Which log level to use" ,
99
- Value : "info" ,
100
- Action : func (c * cli.Context , level string ) error {
130
+ Name : flagLogLevel ,
131
+ Sources : cli .NewValueSourceChain (
132
+ cli .EnvVar ("LOG_LEVEL" ),
133
+ ),
134
+ Usage : "Which log level to use" ,
135
+ Value : "info" ,
136
+ Action : func (ctx context.Context , c * cli.Command , level string ) error {
101
137
level = strings .ToLower (level )
102
138
103
139
lvl , err := parseLogLevel (level )
@@ -111,10 +147,12 @@ func main() {
111
147
},
112
148
},
113
149
& cli.StringFlag {
114
- Name : flagInstance ,
115
- EnvVars : []string {"INSTANCE" },
116
- Value : "ops" ,
117
- Action : func (c * cli.Context , instance string ) error {
150
+ Name : flagInstance ,
151
+ Sources : cli .NewValueSourceChain (
152
+ cli .EnvVar ("INSTANCE" ),
153
+ ),
154
+ Value : "ops" ,
155
+ Action : func (ctx context.Context , c * cli.Command , instance string ) error {
118
156
// Validate it is a known instance
119
157
instances := slices .Collect (maps .Keys (instanceToHost ))
120
158
if ! slices .Contains (instances , instance ) {
@@ -129,16 +167,20 @@ func main() {
129
167
Usage : "Parameters to pass to the workflow template. Given as `key=value`. Specify multiple times for multiple parameters" ,
130
168
},
131
169
& cli.UintFlag {
132
- Name : flagRetries ,
133
- EnvVars : []string {"RETRIES" },
134
- Value : 3 ,
135
- Usage : "Number of retries to make if the command fails" ,
170
+ Name : flagRetries ,
171
+ Sources : cli .NewValueSourceChain (
172
+ cli .EnvVar ("RETRIES" ),
173
+ ),
174
+ Value : 3 ,
175
+ Usage : "Number of retries to make if the command fails" ,
136
176
},
137
177
& cli.StringFlag {
138
- Name : flagWorkflowTemplate ,
139
- EnvVars : []string {"WORKFLOW_TEMPLATE" },
140
- Usage : "The workflow template to use" ,
141
- Action : func (c * cli.Context , tpl string ) error {
178
+ Name : flagWorkflowTemplate ,
179
+ Sources : cli .NewValueSourceChain (
180
+ cli .EnvVar ("WORKFLOW_TEMPLATE" ),
181
+ ),
182
+ Usage : "The workflow template to use" ,
183
+ Action : func (ctx context.Context , c * cli.Command , tpl string ) error {
142
184
// Required if command is `submit`
143
185
if c .Args ().First () == "submit" && tpl == "" {
144
186
return fmt .Errorf ("required flag: %s" , flagWorkflowTemplate )
@@ -148,16 +190,15 @@ func main() {
148
190
},
149
191
}
150
192
151
- if err := app .Run (os . Args ); err != nil {
193
+ if err := app .Run (context . Background (), args ); err != nil {
152
194
logger .With ("error" , err ).Error ("failed to run" )
153
195
os .Exit (1 )
154
196
}
155
197
}
156
198
157
- func run (c * cli.Context , level * slog.LevelVar , logger * slog.Logger ) error {
199
+ func run (ctx context. Context , c * cli.Command , level * slog.LevelVar , logger * slog.Logger , command string ) error {
158
200
addCILabels := c .Bool (flagAddCILabels )
159
201
argoToken := c .String (flagArgoToken )
160
- command := c .Args ().First ()
161
202
instance := c .String (flagInstance )
162
203
namespace := c .String (flagNamespace )
163
204
parameters := c .StringSlice (flagParameter )
@@ -173,7 +214,7 @@ func run(c *cli.Context, level *slog.LevelVar, logger *slog.Logger) error {
173
214
extraArgs = append (extraArgs , "--parameter" , param )
174
215
}
175
216
176
- extraArgs = append (extraArgs , c .Args ().Tail ()... )
217
+ extraArgs = append (extraArgs , c .Args ().Slice ()... )
177
218
178
219
md , err := NewGitHubActionsMetadata ()
179
220
if err != nil {
@@ -192,8 +233,6 @@ func run(c *cli.Context, level *slog.LevelVar, logger *slog.Logger) error {
192
233
"namespace" , namespace ,
193
234
)
194
235
195
- logger .With ("extraArgs" , extraArgs ).Info ("running command" )
196
-
197
236
argo := App {
198
237
levelVar : level ,
199
238
logger : logger ,
@@ -212,5 +251,13 @@ func run(c *cli.Context, level *slog.LevelVar, logger *slog.Logger) error {
212
251
retries : retries ,
213
252
}
214
253
215
- return argo .Run (c .Context , md )
254
+ if c .Bool (flagPrintConfig ) {
255
+ if err := argo .PrintConfig (c .Writer , md ); err != nil {
256
+ return err
257
+ }
258
+ return nil
259
+ }
260
+
261
+ logger .With ("extraArgs" , extraArgs ).Info ("running command" )
262
+ return argo .Run (ctx , md )
216
263
}
0 commit comments