github.com/ssube/gitlab-ci-multi-runner@v1.2.1-0.20160607142738-b8d1285632e6/executors/ssh/executor_ssh.go (about)

     1  package ssh
     2  
     3  import (
     4  	"errors"
     5  
     6  	"gitlab.com/gitlab-org/gitlab-ci-multi-runner/common"
     7  	"gitlab.com/gitlab-org/gitlab-ci-multi-runner/executors"
     8  	"gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers/ssh"
     9  )
    10  
    11  type executor struct {
    12  	executors.AbstractExecutor
    13  	sshCommand ssh.Client
    14  }
    15  
    16  func (s *executor) Prepare(globalConfig *common.Config, config *common.RunnerConfig, build *common.Build) error {
    17  	err := s.AbstractExecutor.Prepare(globalConfig, config, build)
    18  	if err != nil {
    19  		return err
    20  	}
    21  
    22  	s.Println("Using SSH executor...")
    23  	if s.BuildScript.PassFile {
    24  		return errors.New("SSH doesn't support shells that require script file")
    25  	}
    26  
    27  	if s.Config.SSH == nil {
    28  		return errors.New("Missing SSH configuration")
    29  	}
    30  
    31  	s.Debugln("Starting SSH command...")
    32  
    33  	// Create SSH command
    34  	s.sshCommand = ssh.Client{
    35  		Config: *s.Config.SSH,
    36  		Stdout: s.BuildLog,
    37  		Stderr: s.BuildLog,
    38  	}
    39  
    40  	s.Debugln("Connecting to SSH server...")
    41  	err = s.sshCommand.Connect()
    42  	if err != nil {
    43  		return err
    44  	}
    45  	return nil
    46  }
    47  
    48  func (s *executor) Run(cmd common.ExecutorCommand) error {
    49  	return s.sshCommand.Run(ssh.Command{
    50  		Environment: s.BuildScript.Environment,
    51  		Command:     s.BuildScript.GetCommandWithArguments(),
    52  		Stdin:       cmd.Script,
    53  		Abort:       cmd.Abort,
    54  	})
    55  }
    56  
    57  func (s *executor) Cleanup() {
    58  	s.sshCommand.Cleanup()
    59  	s.AbstractExecutor.Cleanup()
    60  }
    61  
    62  func init() {
    63  	options := executors.ExecutorOptions{
    64  		DefaultBuildsDir: "builds",
    65  		SharedBuildsDir:  true,
    66  		Shell: common.ShellScriptInfo{
    67  			Shell: "bash",
    68  			Type:  common.LoginShell,
    69  		},
    70  		ShowHostname: true,
    71  	}
    72  
    73  	creator := func() common.Executor {
    74  		return &executor{
    75  			AbstractExecutor: executors.AbstractExecutor{
    76  				ExecutorOptions: options,
    77  			},
    78  		}
    79  	}
    80  
    81  	featuresUpdater := func(features *common.FeaturesInfo) {
    82  		features.Variables = true
    83  	}
    84  
    85  	common.RegisterExecutor("ssh", executors.DefaultExecutorProvider{
    86  		Creator:         creator,
    87  		FeaturesUpdater: featuresUpdater,
    88  	})
    89  }