zoukankan      html  css  js  c++  java
  • 【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")
  • 相关阅读:
    SQL 操作结果集 -并集、差集、交集、结果集排序
    bootstrap的css和js
    pandas DataFrame数据转为list
    nodejs 不同请求获取前端传的参数
    微信小程序switch组件尺寸控制
    vue-cli项目部署到服务器
    element-ui table 底部滚动条问题
    简单配色
    浏览器滚动条自定义化
    element table固定表头,表的高度自适应解决方法
  • 原文地址:https://www.cnblogs.com/6970-9192/p/11281758.html
Copyright © 2011-2022 走看看