/
computer_launch.go
146 lines (125 loc) · 4.64 KB
/
computer_launch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package cmd
import (
"fmt"
"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
appCfg "github.com/jenkins-zh/jenkins-cli/app/config"
"github.com/jenkins-zh/jenkins-cli/app/i18n"
"github.com/jenkins-zh/jenkins-cli/client"
"github.com/jenkins-zh/jenkins-cli/util"
"github.com/spf13/cobra"
"go.uber.org/zap"
"io/ioutil"
"net/url"
"os"
"strings"
)
// ComputerLaunchOption option for config list command
type ComputerLaunchOption struct {
common.Option
Type string
ShowProgress bool
/** share info between inner functions */
ComputerClient *client.ComputerClient
CurrentJenkins *appCfg.JenkinsServer
Output string
}
const (
// AgentJNLP is the agent type of jnlp
AgentJNLP = "jnlp"
)
var computerLaunchOption ComputerLaunchOption
func init() {
computerCmd.AddCommand(computerLaunchCmd)
computerLaunchCmd.Flags().StringVarP(&computerLaunchOption.Type, "type", "", AgentJNLP,
i18n.T("The type of agent, include jnlp"))
computerLaunchCmd.Flags().BoolVarP(&computerLaunchOption.ShowProgress, "show-progress", "", true,
i18n.T("Show the progress of downloading agent.jar"))
healthCheckRegister.Register(getCmdPath(computerLaunchCmd), &computerLaunchOption)
}
var computerLaunchCmd = &cobra.Command{
Use: "launch",
Aliases: []string{"start"},
Short: i18n.T("Launch the agent of your Jenkins"),
Long: i18n.T("Launch the agent of your Jenkins"),
ValidArgsFunction: ValidAgentNames,
Args: cobra.MinimumNArgs(1),
Example: `jcli agent launch agent-name
jcli agent launch agent-name --type jnlp`,
PreRunE: func(_ *cobra.Command, args []string) (err error) {
computerLaunchOption.ComputerClient, computerLaunchOption.CurrentJenkins =
GetComputerClient(computerLaunchOption.Option)
if computerLaunchOption.Type != AgentJNLP {
return
}
var f *os.File
if f, err = ioutil.TempFile("/tmp", "agent.jar"); err == nil {
computerLaunchOption.Output = f.Name()
agentURL := fmt.Sprintf("%s/jnlpJars/agent.jar", computerLaunchOption.ComputerClient.URL)
logger.Debug("start to download agent.jar", zap.String("url", agentURL))
logger.Debug("proxy setting", zap.String("sever", computerLaunchOption.CurrentJenkins.Proxy),
zap.String("auth", computerLaunchOption.CurrentJenkins.ProxyAuth))
downloader := util.HTTPDownloader{
RoundTripper: computerLaunchOption.RoundTripper,
TargetFilePath: computerLaunchOption.Output,
URL: agentURL,
Proxy: computerLaunchOption.CurrentJenkins.Proxy,
ProxyAuth: computerLaunchOption.CurrentJenkins.ProxyAuth,
ShowProgress: computerLaunchOption.ShowProgress,
}
err = downloader.DownloadFile()
}
return
},
RunE: func(_ *cobra.Command, args []string) (err error) {
name := args[0]
logger.Info("prepare to start agent", zap.String("name", name), zap.String("type", computerLaunchOption.Type))
switch computerLaunchOption.Type {
case "":
err = computerLaunchOption.Launch(name)
case AgentJNLP:
err = computerLaunchOption.LaunchJnlp(name)
default:
err = fmt.Errorf("unsupported agent type %s", computerLaunchOption.Type)
}
return
},
}
// Launch start a normal agent
func (o *ComputerLaunchOption) Launch(name string) (err error) {
err = o.ComputerClient.Launch(name)
return
}
// LaunchJnlp start a JNLP agent
func (o *ComputerLaunchOption) LaunchJnlp(name string) (err error) {
var secret string
if secret, err = o.ComputerClient.GetSecret(name); err == nil {
logger.Info("get agent secret", zap.String("value", secret))
var binary string
binary, err = util.LookPath("java", centerStartOption.LookPathContext)
if err == nil {
env := os.Environ()
agentArgs := []string{"java", "-jar", computerLaunchOption.Output,
"-jnlpUrl", fmt.Sprintf("%s/computer/%s/slave-agent.jnlp", o.ComputerClient.URL, name),
"-secret", secret, "-workDir", "/tmp"}
if o.CurrentJenkins.ProxyAuth != "" {
proxyURL, _ := url.Parse(o.CurrentJenkins.Proxy)
agentArgs = append(agentArgs, "-proxyCredentials", o.CurrentJenkins.ProxyAuth)
proxyAuth := strings.SplitN(o.CurrentJenkins.ProxyAuth, ":", 2)
if len(proxyAuth) == 2 {
env = append(env, fmt.Sprintf("http_proxy=http://%s:%s@%s", url.QueryEscape(proxyAuth[0]), url.QueryEscape(proxyAuth[1]), proxyURL.Host))
}
}
logger.Debug("start a jnlp agent", zap.Any("command", strings.Join(agentArgs, " ")))
err = util.Exec(binary, agentArgs, env, o.SystemCallExec)
}
}
return
}
// Check do the health check of casc cmd
func (o *ComputerLaunchOption) Check() (err error) {
opt := PluginOptions{
Option: common.Option{RoundTripper: o.RoundTripper},
}
_, err = opt.FindPlugin("pipeline-restful-api")
return
}