通过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")