【Jenkins】通过jenkinsapi连接slave

通过Jenkinsapi连接已创建的jnlp slave,同时为了保持slave的持续在线,还需要实现开机自动启动slave。

此处先将完整方法给出,再进行详细说明。

jenkins_url = "http://xx.xx.xx.x/" # Jenkins地址
username = "XXX_XX" # Jenkins用户名
password = "xxxx" # Jenkins密码
jnlpJars_url = jenkins_url+"jnlpJars/agent.jar" # agent下载链接
workspace = "C:ProgramDatamonkeyTest" # 远程工作目录
startupPath = r"C:ProgramDataMicrosoftWindowsStart MenuProgramsStartup" # 计算机系统启动目录
# 获取计算机名用于命名slave
PC_name = os.popen('hostname').read().strip()
user_name = getpass.getuser().strip()
# 创建Jenkins对象
jenkins = Jenkins(jenkins_url,
                  requester=Requester(username, password,
                                      baseurl=jenkins_url, ssl_verify=False))
# 获取Jenkins用户cookie
jenkins.username = username
jenkins.password = password
jenkins.use_auth_cookie()

#连接slave
def connectSlave (slave):
    # 下载agent.jar
    if not os.path.exists(workspace + r"agent.jar"):
        urllib.request.urlretrieve(jnlpJars_url, workspace + r"agent.jar")
        print("下载agent.jar")
    # 获取secret
    headers = {"Cookie":jenkins.requester.AUTH_COOKIE}
    response = requests.get(url=slave.baseurl+"/slave-agent.jnlp",headers=headers)
    secret = re.findall(r"<argument>(.+?)</argument>",response.text)[0]
    # batch命令
    batchs = ["java -jar "+workspace + r"agent.jar " +
            "-jnlpUrl " + jenkins.get_node_url(user_name +"_"+ PC_name) +"/slave-agent.jnlp " +
            "-secret " + secret + " " +
            "-workDir " + workspace]
    # 创建连接slave bat
    creatfile(workspace + r"connectSlave.bat", batchs)
    # vbs命令
    vbss = ["createobject("wscript.shell").run """"+workspace+"connectSlave.bat""",0"]
    # 创建vbs文件
    creatfile(startupPath + r"startupSlave.vbs", vbss)
    creatfile(workspace + r"startupSlave.vbs", vbss)
    # 执行vbs文件
    os.system("wscript //e:vbscript " +workspace+ "startupSlave.vbs")

# 创建文件
def creatfile (fname,contents):
    f = open(fname, 'w')
    if f:
        for content in contents:
            f.write(content)
            f.write("
")
    f.close()

命令行启动节点

使用命令行启动jnlp slave,命令形式如下图所示:

1、为了执行命令行,需要将agent.jar下载到本地。

# 下载agent.jar
if not os.path.exists(workspace + r"agent.jar"):
    urllib.request.urlretrieve(jnlpJars_url, workspace + r"agent.jar")
    print("下载agent.jar")

 2、获取命令中 -secret 参数值是个难点,每个slave的secret都不同,通过jenkinsapi获取的节点信息中,也不包含secret数据。

  在网上也未搜索到具体的获取方法,但发现在节点下下载的用于手动启动slave的slave-agent.jnlp中有包含secret。

  便通过获取slave对应slave-agent.jnlp中的数据,并通过正则提取数据中的secret。

# 获取secret
headers = {"Cookie":jenkins.requester.AUTH_COOKIE}
response = requests.get(url=slave.baseurl+"/slave-agent.jnlp",headers=headers)
secret = re.findall(r"<argument>(.+?)</argument>",response.text)[0]

  我在获取Jenkins用户cookis时,遇到了获取不到的问题,故在jenkins.py中use_auth_cookie方法中添加给jenkins的request中AUTH_COOKIE进行赋值的操作。

  

创建bat文件

创建bat文件用于执行启动节点的命令行,将创建的bat文件保存在指定的workspace下。

# batch命令
batchs = ["java -jar "+workspace + r"agent.jar " +
        "-jnlpUrl " + jenkins.get_node_url(user_name +"_"+ PC_name) +"/slave-agent.jnlp " +
        "-secret " + secret + " " +
        "-workDir " + workspace]
# 创建连接slave bat
creatfile(workspace + r"connectSlave.bat", batchs)

创建文件方法如下:

# 创建文件
def creatfile (fname,contents):
    f = open(fname, 'w')
    if f:
        for content in contents:
            f.write(content)
            f.write("
")
    f.close()

创建vbs文件

为了实现开机后启动连接节点,并且消除执行bat时的cmd命令黑窗口,减少对用户的影响,在这使用vbs调用bat文件,并将vbs文件放置于系统启动目录下。

# vbs命令
vbss = ["createobject("wscript.shell").run """"+workspace+"connectSlave.bat""",0"]
# 创建vbs文件
creatfile(startupPath + r"startupSlave.vbs", vbss)
creatfile(workspace + r"startupSlave.vbs", vbss)

连接节点

 第1次连接节点后,直接调用创建的vbs连接slave。

# 执行vbs文件
os.system("wscript //e:vbscript " +workspace+ "startupSlave.vbs")
原文地址:https://www.cnblogs.com/6970-9192/p/11281758.html