导航

 

jenkins需要迁移平台时,可以用以下脚本,该脚本内部还带了环境配置更改的代码

#!/usr/bin/env python
#coding=utf8
import os
import sys
import getpass
from subprocess import Popen, PIPE
import requests
import re
import json
# import xml.etree.ElementTree as ET
import time

# def convert_xml_file_to_str(path_to_config_file):
#     tree = ET.parse(path_to_config_file)
#     root = tree.getroot()
#     return ET.tostring(root, encoding='utf8', method='xml').decode()

dest_env="dev"
if dest_env=='test':
    password="xxxx"
    remote_ip="xxx"
elif dest_env=='dev':
    password = "xxxx"
    remote_ip = "xxxxx"
# file_name='product_list.txt'

# with open(file_name, 'r') as f:
#     out = f.readlines()
#
# product_names = []
# for i in out:
#     if not i.startswith('='):
#         product_names.append(i.strip())

product_names = os.environ["job_names"]
product_names=product_names.strip().split(',')
server_ip='{}:8080'.format(remote_ip)
headers={'Content-Type':'application/json;UTF-8'}


def run_cmd(cmd, run_as=None):
    if run_as and os.name != 'nt' and run_as != getpass.getuser():
        cmd = '''su - {} -c '{}' '''.format(run_as, cmd)
    print cmd
    close_fds = os.name != 'nt'
    p = Popen(
        cmd,
        stdout=PIPE,
        stdin=PIPE,
        stderr=PIPE,
        shell=True,
        close_fds=close_fds)
    stdout, stderr = p.communicate()
    if p.returncode and stderr:
        print 'Run cmd: {} \nCode: {}, Stderr: {}'.format(cmd, p.returncode, stderr)
    return p.returncode, stdout.strip()


def move_jobs(job_name):
    '''移动当前环境任务'''
    global password,remote_ip
    name=job_name.strip()
    username = 'tester'
    cmd="cd /home/jenkins/jobs;sshpass -p {} rsync -av {} root@{}:/home/jenkins/jobs/".format(password,name,remote_ip)
    print(cmd)
    code,res=run_cmd(cmd)
    if code!=0:
        print(res)
        sys.exit(1)
    else:
        print('{}迁移成功'.format(name))


def change_env(job_name):
    '''修改目的服务器环境'''
    global server_ip,headers
    username = 'test'
    password = 'xxxxxxx!'
    # job_name='xxxxxx'
    url = 'http://{}/job/{}/config.xml'.format(server_ip, job_name)
    print url
    req = requests.get(url, headers=headers, auth=(username, password))
    res=req.content
    print res
    # res = res.replace('if (setEnv =="test"){','if (setEnv == "test"){\n    test_url="xxxxx"\n    host_ips="xxxxx"')
    if remote_ip=='xxxx':
        res=res.replace('setEnv="dev"','setEnv="test"')
    elif remote_ip=='xxxx':
        res=res.replace('setEnv="test"','setEnv="dev"')
    with open('/tmp/config.xml','w') as f:
        f.writelines(res)

    res=requests.post('http://{}/job/{}/config.xml'.format(server_ip, job_name),
                      data=file('/tmp/config.xml','rb').read(),
                      auth=(username, password),headers=headers)
    if res.status_code==200:
        print('{}修改成功'.format(job_name))
    else:
        print('{}修改失败'.format(job_name))
        # print(res.content)
        # sys.exit(1)

def get_run_jobs():
    '''获取目的服务器的jenkins状态,若空闲返回True'''
    global server_ip,headers,username
    username = 'test'
    password = 'xxxxx!'
    url = 'http://{}/computer/api/json'.format(server_ip)
    print url
    req = requests.get(url, headers=headers, auth=(username, password))
    res = json.loads(req.content)['computer']
    for i in res:
        if i["_class"]== "hudson.model.Hudson$MasterComputer":
            return i['idle']

if __name__=='__main__':
    for job_name in product_names:
        move_jobs(job_name)

    #查看远程jenkins 是否有任务在执行
    while 1:
        if get_run_jobs():
            cmd='sshpass -p {} ssh -o StrictHostKeyChecking=no root@{} "service jenkins status"'.format(password,remote_ip)
            res=run_cmd(cmd)
            print res
            break
        time.sleep(20)

    time.sleep(100)
    for job_name in product_names:
        change_env(job_name)

  

posted on 2020-09-08 10:29  slqt  阅读(265)  评论(0编辑  收藏  举报