mirror of
				https://github.com/appleboy/drone-ssh.git
				synced 2025-10-29 00:51:15 +08:00 
			
		
		
		
	Support stream output logs.
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
This commit is contained in:
		
							parent
							
								
									f26bd7f7f7
								
							
						
					
					
						commit
						5b0ba436e2
					
				
							
								
								
									
										24
									
								
								plugin.go
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								plugin.go
									
									
									
									
									
								
							| @ -85,20 +85,34 @@ func (p Plugin) Exec() error { | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			p.log(host, "commands: ", strings.Join(p.Config.Script, "\n")) | 			p.log(host, "commands: ", strings.Join(p.Config.Script, "\n")) | ||||||
| 			outStr, errStr, isTimeout, err := ssh.Run(strings.Join(p.Config.Script, "\n"), p.Config.CommandTimeout) | 			stdoutChan, stderrChan, doneChan, errChan, err := ssh.Stream(strings.Join(p.Config.Script, "\n"), p.Config.CommandTimeout) | ||||||
| 			p.log(host, "outputs:", outStr) | 			if err != nil { | ||||||
| 			if len(errStr) != 0 { | 				errChannel <- err | ||||||
| 				p.log(host, "errors:", errStr) | 			} | ||||||
|  | 			// read from the output channel until the done signal is passed
 | ||||||
|  | 			stillGoing := true | ||||||
|  | 			isTimeout := true | ||||||
|  | 			for stillGoing { | ||||||
|  | 				select { | ||||||
|  | 				case isTimeout = <-doneChan: | ||||||
|  | 					stillGoing = false | ||||||
|  | 				case outline := <-stdoutChan: | ||||||
|  | 					p.log(host, "outputs:", outline) | ||||||
|  | 				case errline := <-stderrChan: | ||||||
|  | 					p.log(host, "errors:", errline) | ||||||
|  | 				case err = <-errChan: | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			// get exit code or command error.
 | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				errChannel <- err | 				errChannel <- err | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			// command time out
 | ||||||
| 			if !isTimeout { | 			if !isTimeout { | ||||||
| 				errChannel <- fmt.Errorf(commandTimeOut) | 				errChannel <- fmt.Errorf(commandTimeOut) | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			wg.Done() | 			wg.Done() | ||||||
| 		}(host) | 		}(host) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -121,6 +121,22 @@ func TestSSHScriptFromKeyFile(t *testing.T) { | |||||||
| 	assert.Nil(t, err) | 	assert.Nil(t, err) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestStreamFromSSHCommand(t *testing.T) { | ||||||
|  | 	plugin := Plugin{ | ||||||
|  | 		Config: Config{ | ||||||
|  | 			Host:           []string{"localhost", "127.0.0.1"}, | ||||||
|  | 			UserName:       "drone-scp", | ||||||
|  | 			Port:           22, | ||||||
|  | 			KeyPath:        "./tests/.ssh/id_rsa", | ||||||
|  | 			Script:         []string{"whoami", "for i in {1..5}; do echo ${i}; sleep 1; done", "echo 'done'"}, | ||||||
|  | 			CommandTimeout: 60, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err := plugin.Exec() | ||||||
|  | 	assert.Nil(t, err) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestSSHScriptWithError(t *testing.T) { | func TestSSHScriptWithError(t *testing.T) { | ||||||
| 	plugin := Plugin{ | 	plugin := Plugin{ | ||||||
| 		Config: Config{ | 		Config: Config{ | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Bo-Yi Wu
						Bo-Yi Wu