Jenkins--创建Slave节点并连接--Python脚本

发布于 2024年03月15日

用于Jenkins连接Slave节点的脚本,可以自动创建节点。
使用方式:python Connect_Node.py https://Jenkins_Url 节点名称

from jenkinsapi.jenkins import Jenkins
import requests, re, subprocess, sys, os
​
def download_agent_jar(Jenkins_Url):
    agent_jar_url = Jenkins_Url + "/jnlpJars/agent.jar"
    response = requests.get(agent_jar_url, stream=True, verify=False)
​
    if response.status_code == 200:
        target_path = os.path.join('agent.jar')
        with open(target_path, 'wb') as file:
            for chunk in response.iter_content(chunk_size=128):
                file.write(chunk)
        print("Downloaded agent.jar to" + target_path)
        return target_path
    else:
        raise ValueError("Failed to download agent.jar. Status code:" + response.status_code)
​
def get_node_secret(Jenkins_Url, Username, Token, Node_Name):
    jnlp_url = Jenkins_Url + "/computer/" + Node_Name + "/jenkins-agent.jnlp"
    response = requests.get(jnlp_url, auth=(Username, Token), verify=False)
    match = re.search(r'<application-desc main-class="hudson.remoting.jnlp.Main"><argument>([a-z0-9]*)</argument>', response.text)
    if match:
        node_secret = match.group(1)
        return node_secret
    else:
        raise ValueError("Failed to retrieve node secret.")
​
def creatSlave():
    nodes = Jenkins.get_nodes()
    if Node_Name in nodes:
        print(Node_Name + "Node already exists")
    else:
        node_dict = {
            'num_executors': 1,
            'node_description': "",
            'remote_fs': Workspace,
            'labels': "",
            'exclusive': True
        }
        new_slave = Jenkins.nodes.create_node(Node_Name, node_dict)
        print("Node created successfully")
        return new_slave
​
def start_jenkins_agent():
    command = [
        'java', '-jar', 'agent.jar',
        '-jnlpUrl', Jenkins_Url + '/computer/' + Node_Name + '/jenkins-agent.jnlp',
        '-secret', Node_Secret,
        '-workDir', Workspace,
        '-noCertificateCheck'
    ]
    subprocess.run(command)
​
if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python3 lunchSlave.py Jenkins_Url Node_Name")
        sys.exit(1)
    Jenkins_Url = sys.argv[1]
    Node_Name = sys.argv[2]
    Username = "用户名"
    Token = 'token'
    Workspace = "/root/build"
    Agent_Jar_Path = download_agent_jar(Jenkins_Url)
    Jenkins = Jenkins(Jenkins_Url, Username, Token, ssl_verify=False)
    creatSlave()
    Node_Secret = get_node_secret(Jenkins_Url, Username, Token, Node_Name)
    start_jenkins_agent()