Skip to content

Commit 36b01ae

Browse files
committed
style: improve code readability with consistent multi-line formatting
- Add golines to the list of golangci-lint formatters - Format multi-line env variable declarations for CLI flags for consistency - Split string slice initializations onto multiple lines for improved readability in tests - Use multi-line function calls for better readability in plugin and test code - Improve readability of script command appends in logic and tests Signed-off-by: appleboy <[email protected]>
1 parent 7a94dda commit 36b01ae

File tree

4 files changed

+166
-65
lines changed

4 files changed

+166
-65
lines changed

.golangci.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ formatters:
4646
- gci
4747
- gofmt
4848
- goimports
49+
- golines
4950
exclusions:
5051
generated: lax
5152
paths:

main.go

Lines changed: 83 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,14 @@ func main() {
8484
EnvVars: []string{"PLUGIN_SSH_KEY", "PLUGIN_KEY", "SSH_KEY", "INPUT_KEY"},
8585
},
8686
&cli.StringFlag{
87-
Name: "ssh-passphrase",
88-
Usage: "The purpose of the passphrase is usually to encrypt the private key.",
89-
EnvVars: []string{"PLUGIN_SSH_PASSPHRASE", "PLUGIN_PASSPHRASE", "SSH_PASSPHRASE", "INPUT_PASSPHRASE"},
87+
Name: "ssh-passphrase",
88+
Usage: "The purpose of the passphrase is usually to encrypt the private key.",
89+
EnvVars: []string{
90+
"PLUGIN_SSH_PASSPHRASE",
91+
"PLUGIN_PASSPHRASE",
92+
"SSH_PASSPHRASE",
93+
"INPUT_PASSPHRASE",
94+
},
9095
},
9196
&cli.StringFlag{
9297
Name: "key-path",
@@ -100,9 +105,13 @@ func main() {
100105
EnvVars: []string{"PLUGIN_CIPHERS", "SSH_CIPHERS", "INPUT_CIPHERS"},
101106
},
102107
&cli.BoolFlag{
103-
Name: "useInsecureCipher",
104-
Usage: "include more ciphers with use_insecure_cipher",
105-
EnvVars: []string{"PLUGIN_USE_INSECURE_CIPHER", "SSH_USE_INSECURE_CIPHER", "INPUT_USE_INSECURE_CIPHER"},
108+
Name: "useInsecureCipher",
109+
Usage: "include more ciphers with use_insecure_cipher",
110+
EnvVars: []string{
111+
"PLUGIN_USE_INSECURE_CIPHER",
112+
"SSH_USE_INSECURE_CIPHER",
113+
"INPUT_USE_INSECURE_CIPHER",
114+
},
106115
},
107116
&cli.StringFlag{
108117
Name: "fingerprint",
@@ -118,8 +127,12 @@ func main() {
118127
Name: "command.timeout",
119128
Aliases: []string{"T"},
120129
Usage: "command timeout",
121-
EnvVars: []string{"PLUGIN_COMMAND_TIMEOUT", "SSH_COMMAND_TIMEOUT", "INPUT_COMMAND_TIMEOUT"},
122-
Value: 10 * time.Minute,
130+
EnvVars: []string{
131+
"PLUGIN_COMMAND_TIMEOUT",
132+
"SSH_COMMAND_TIMEOUT",
133+
"INPUT_COMMAND_TIMEOUT",
134+
},
135+
Value: 10 * time.Minute,
123136
},
124137
&cli.StringSliceFlag{
125138
Name: "script",
@@ -154,36 +167,63 @@ func main() {
154167
Value: "22",
155168
},
156169
&cli.StringFlag{
157-
Name: "proxy.protocol",
158-
Usage: "The IP protocol to use for the proxy. Valid values are \"tcp\". \"tcp4\" or \"tcp6\". Default to tcp.",
159-
EnvVars: []string{"PLUGIN_PROXY_PROTOCOL", "SSH_PROXY_PROTOCOL", "INPUT_PROXY_PROTOCOL"},
160-
Value: "tcp",
170+
Name: "proxy.protocol",
171+
Usage: "The IP protocol to use for the proxy. Valid values are \"tcp\". \"tcp4\" or \"tcp6\". Default to tcp.",
172+
EnvVars: []string{
173+
"PLUGIN_PROXY_PROTOCOL",
174+
"SSH_PROXY_PROTOCOL",
175+
"INPUT_PROXY_PROTOCOL",
176+
},
177+
Value: "tcp",
161178
},
162179
&cli.StringFlag{
163-
Name: "proxy.username",
164-
Usage: "connect as user of proxy",
165-
EnvVars: []string{"PLUGIN_PROXY_USERNAME", "PLUGIN_PROXY_USER", "PROXY_SSH_USERNAME", "INPUT_PROXY_USERNAME"},
166-
Value: "root",
180+
Name: "proxy.username",
181+
Usage: "connect as user of proxy",
182+
EnvVars: []string{
183+
"PLUGIN_PROXY_USERNAME",
184+
"PLUGIN_PROXY_USER",
185+
"PROXY_SSH_USERNAME",
186+
"INPUT_PROXY_USERNAME",
187+
},
188+
Value: "root",
167189
},
168190
&cli.StringFlag{
169-
Name: "proxy.password",
170-
Usage: "user password of proxy",
171-
EnvVars: []string{"PLUGIN_PROXY_PASSWORD", "PROXY_SSH_PASSWORD", "INPUT_PROXY_PASSWORD"},
191+
Name: "proxy.password",
192+
Usage: "user password of proxy",
193+
EnvVars: []string{
194+
"PLUGIN_PROXY_PASSWORD",
195+
"PROXY_SSH_PASSWORD",
196+
"INPUT_PROXY_PASSWORD",
197+
},
172198
},
173199
&cli.StringFlag{
174-
Name: "proxy.ssh-key",
175-
Usage: "private ssh key of proxy",
176-
EnvVars: []string{"PLUGIN_PROXY_SSH_KEY", "PLUGIN_PROXY_KEY", "PROXY_SSH_KEY", "INPUT_PROXY_KEY"},
200+
Name: "proxy.ssh-key",
201+
Usage: "private ssh key of proxy",
202+
EnvVars: []string{
203+
"PLUGIN_PROXY_SSH_KEY",
204+
"PLUGIN_PROXY_KEY",
205+
"PROXY_SSH_KEY",
206+
"INPUT_PROXY_KEY",
207+
},
177208
},
178209
&cli.StringFlag{
179-
Name: "proxy.ssh-passphrase",
180-
Usage: "The purpose of the passphrase is usually to encrypt the private key.",
181-
EnvVars: []string{"PLUGIN_PROXY_SSH_PASSPHRASE", "PLUGIN_PROXY_PASSPHRASE", "PROXY_SSH_PASSPHRASE", "INPUT_PROXY_PASSPHRASE"},
210+
Name: "proxy.ssh-passphrase",
211+
Usage: "The purpose of the passphrase is usually to encrypt the private key.",
212+
EnvVars: []string{
213+
"PLUGIN_PROXY_SSH_PASSPHRASE",
214+
"PLUGIN_PROXY_PASSPHRASE",
215+
"PROXY_SSH_PASSPHRASE",
216+
"INPUT_PROXY_PASSPHRASE",
217+
},
182218
},
183219
&cli.StringFlag{
184-
Name: "proxy.key-path",
185-
Usage: "ssh private key path of proxy",
186-
EnvVars: []string{"PLUGIN_PROXY_KEY_PATH", "PROXY_SSH_KEY_PATH", "INPUT_PROXY_KEY_PATH"},
220+
Name: "proxy.key-path",
221+
Usage: "ssh private key path of proxy",
222+
EnvVars: []string{
223+
"PLUGIN_PROXY_KEY_PATH",
224+
"PROXY_SSH_KEY_PATH",
225+
"INPUT_PROXY_KEY_PATH",
226+
},
187227
},
188228
&cli.DurationFlag{
189229
Name: "proxy.timeout",
@@ -196,14 +236,23 @@ func main() {
196236
EnvVars: []string{"PLUGIN_PROXY_CIPHERS", "PROXY_SSH_CIPHERS", "INPUT_PROXY_CIPHERS"},
197237
},
198238
&cli.BoolFlag{
199-
Name: "proxy.useInsecureCipher",
200-
Usage: "include more ciphers with use_insecure_cipher",
201-
EnvVars: []string{"PLUGIN_PROXY_USE_INSECURE_CIPHER", "PROXY_SSH_USE_INSECURE_CIPHER", "INPUT_PROXY_USE_INSECURE_CIPHER"},
239+
Name: "proxy.useInsecureCipher",
240+
Usage: "include more ciphers with use_insecure_cipher",
241+
EnvVars: []string{
242+
"PLUGIN_PROXY_USE_INSECURE_CIPHER",
243+
"PROXY_SSH_USE_INSECURE_CIPHER",
244+
"INPUT_PROXY_USE_INSECURE_CIPHER",
245+
},
202246
},
203247
&cli.StringFlag{
204-
Name: "proxy.fingerprint",
205-
Usage: "fingerprint SHA256 of the host public key, default is to skip verification",
206-
EnvVars: []string{"PLUGIN_PROXY_FINGERPRINT", "PROXY_SSH_FINGERPRINT", "PROXY_FINGERPRINT", "INPUT_PROXY_FINGERPRINT"},
248+
Name: "proxy.fingerprint",
249+
Usage: "fingerprint SHA256 of the host public key, default is to skip verification",
250+
EnvVars: []string{
251+
"PLUGIN_PROXY_FINGERPRINT",
252+
"PROXY_SSH_FINGERPRINT",
253+
"PROXY_FINGERPRINT",
254+
"INPUT_PROXY_FINGERPRINT",
255+
},
207256
},
208257
&cli.StringSliceFlag{
209258
Name: "envs",

plugin.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import (
1515

1616
var (
1717
errMissingHost = errors.New("error: missing server host")
18-
errMissingPasswordOrKey = errors.New("error: can't connect without a private SSH key or password")
19-
errCommandTimeOut = errors.New("error: command timeout")
20-
envsFormat = "export {NAME}={VALUE}"
18+
errMissingPasswordOrKey = errors.New(
19+
"error: can't connect without a private SSH key or password",
20+
)
21+
errCommandTimeOut = errors.New("error: command timeout")
22+
envsFormat = "export {NAME}={VALUE}"
2123
)
2224

2325
type (
@@ -119,7 +121,10 @@ func (p Plugin) exec(host string, wg *sync.WaitGroup, errChannel chan error) {
119121
for _, key := range p.Config.Envs {
120122
key = strings.ToUpper(key)
121123
if val, found := os.LookupEnv(key); found {
122-
env = append(env, p.format(p.Config.EnvsFormat, "{NAME}", key, "{VALUE}", escapeArg(val)))
124+
env = append(
125+
env,
126+
p.format(p.Config.EnvsFormat, "{NAME}", key, "{VALUE}", escapeArg(val)),
127+
)
123128
}
124129
}
125130

@@ -131,7 +136,10 @@ func (p Plugin) exec(host string, wg *sync.WaitGroup, errChannel chan error) {
131136
p.log(host, "======END======")
132137
}
133138

134-
stdoutChan, stderrChan, doneChan, errChan, err := ssh.Stream(strings.Join(p.Config.Script, "\n"), p.Config.CommandTimeout)
139+
stdoutChan, stderrChan, doneChan, errChan, err := ssh.Stream(
140+
strings.Join(p.Config.Script, "\n"),
141+
p.Config.CommandTimeout,
142+
)
135143
if err != nil {
136144
errChannel <- err
137145
return
@@ -257,7 +265,10 @@ func (p Plugin) scriptCommands() []string {
257265
}
258266
commands = append(commands, cmd)
259267
if p.Config.ScriptStop && cmd[(len(cmd)-1):] != "\\" {
260-
commands = append(commands, "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;")
268+
commands = append(
269+
commands,
270+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
271+
)
261272
}
262273
}
263274

plugin_test.go

Lines changed: 65 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,15 @@ func TestSSHIPv6OnlyError(t *testing.T) {
153153
func TestStreamFromSSHCommand(t *testing.T) {
154154
plugin := Plugin{
155155
Config: Config{
156-
Host: []string{"localhost", "127.0.0.1"},
157-
Username: "drone-scp",
158-
Port: 22,
159-
KeyPath: "./tests/.ssh/id_rsa",
160-
Script: []string{"whoami", "for i in {1..5}; do echo ${i}; sleep 1; done", "echo 'done'"},
156+
Host: []string{"localhost", "127.0.0.1"},
157+
Username: "drone-scp",
158+
Port: 22,
159+
KeyPath: "./tests/.ssh/id_rsa",
160+
Script: []string{
161+
"whoami",
162+
"for i in {1..5}; do echo ${i}; sleep 1; done",
163+
"echo 'done'",
164+
},
161165
CommandTimeout: 60 * time.Second,
162166
},
163167
}
@@ -289,13 +293,20 @@ func TestSetExistingENV(t *testing.T) {
289293
os.Setenv("BAR", "")
290294
plugin := Plugin{
291295
Config: Config{
292-
Host: []string{"localhost"},
293-
Username: "drone-scp",
294-
Port: 22,
295-
KeyPath: "./tests/.ssh/id_rsa",
296-
Envs: []string{"foo", "bar", "baz"},
297-
Debug: true,
298-
Script: []string{"export FOO", "export BAR", "export BAZ", "env | grep -q '^FOO=Value for foo$'", "env | grep -q '^BAR=$'", "if env | grep -q BAZ; then false; else true; fi"},
296+
Host: []string{"localhost"},
297+
Username: "drone-scp",
298+
Port: 22,
299+
KeyPath: "./tests/.ssh/id_rsa",
300+
Envs: []string{"foo", "bar", "baz"},
301+
Debug: true,
302+
Script: []string{
303+
"export FOO",
304+
"export BAR",
305+
"export BAZ",
306+
"env | grep -q '^FOO=Value for foo$'",
307+
"env | grep -q '^BAR=$'",
308+
"if env | grep -q BAZ; then false; else true; fi",
309+
},
299310
CommandTimeout: 1 * time.Second,
300311
Proxy: easyssh.DefaultConfig{
301312
Server: "localhost",
@@ -313,11 +324,15 @@ func TestSetExistingENV(t *testing.T) {
313324
func TestSyncMode(t *testing.T) {
314325
plugin := Plugin{
315326
Config: Config{
316-
Host: []string{"localhost", "127.0.0.1"},
317-
Username: "drone-scp",
318-
Port: 22,
319-
KeyPath: "./tests/.ssh/id_rsa",
320-
Script: []string{"whoami", "for i in {1..3}; do echo ${i}; sleep 1; done", "echo 'done'"},
327+
Host: []string{"localhost", "127.0.0.1"},
328+
Username: "drone-scp",
329+
Port: 22,
330+
KeyPath: "./tests/.ssh/id_rsa",
331+
Script: []string{
332+
"whoami",
333+
"for i in {1..3}; do echo ${i}; sleep 1; done",
334+
"echo 'done'",
335+
},
321336
CommandTimeout: 60 * time.Second,
322337
Sync: true,
323338
},
@@ -671,7 +686,12 @@ func TestPlugin_scriptCommands(t *testing.T) {
671686
ScriptStop: true,
672687
},
673688
},
674-
want: []string{"mkdir a", "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;", "mkdir b", "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;"},
689+
want: []string{
690+
"mkdir a",
691+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
692+
"mkdir b",
693+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
694+
},
675695
},
676696
{
677697
name: "normal testing 2",
@@ -681,7 +701,14 @@ func TestPlugin_scriptCommands(t *testing.T) {
681701
ScriptStop: true,
682702
},
683703
},
684-
want: []string{"mkdir a", "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;", "mkdir c", "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;", "mkdir b", "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;"},
704+
want: []string{
705+
"mkdir a",
706+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
707+
"mkdir c",
708+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
709+
"mkdir b",
710+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
711+
},
685712
},
686713
// See: https://github.com/appleboy/ssh-action/issues/75#issuecomment-668314271
687714
{
@@ -692,7 +719,13 @@ func TestPlugin_scriptCommands(t *testing.T) {
692719
ScriptStop: true,
693720
},
694721
},
695-
want: []string{"ls \\", "-lah", "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;", "mkdir a", "DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;"},
722+
want: []string{
723+
"ls \\",
724+
"-lah",
725+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
726+
"mkdir a",
727+
"DRONE_SSH_PREV_COMMAND_EXIT_CODE=$? ; if [ $DRONE_SSH_PREV_COMMAND_EXIT_CODE -ne 0 ]; then exit $DRONE_SSH_PREV_COMMAND_EXIT_CODE; fi;",
728+
},
696729
},
697730
{
698731
name: "trim space",
@@ -938,12 +971,19 @@ func runSSHContainerTest(t *testing.T, cfg SSHTestConfig) {
938971
WaitingFor: wait.ForListeningPort("2222/tcp").WithStartupTimeout(180 * time.Second),
939972
}
940973

941-
sshContainer, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
942-
ContainerRequest: req,
943-
Started: true,
944-
})
974+
sshContainer, err := testcontainers.GenericContainer(
975+
ctx,
976+
testcontainers.GenericContainerRequest{
977+
ContainerRequest: req,
978+
Started: true,
979+
},
980+
)
945981
if err != nil {
946-
t.Skipf("Could not start container with image %s: %v. Check Docker environment and image availability. Skipping test.", req.Image, err)
982+
t.Skipf(
983+
"Could not start container with image %s: %v. Check Docker environment and image availability. Skipping test.",
984+
req.Image,
985+
err,
986+
)
947987
}
948988
defer func() {
949989
if err := sshContainer.Terminate(ctx); err != nil {

0 commit comments

Comments
 (0)