python导出jenkins发布目录的清单方法

python导出jenkins发布目录的清单方法

任务名称 发布分支 Git 地址 部署IP
app管理后台 */app5Console/release/master git@your ip address:test/WebSystem.git 未找到

经过测试: 部署IP导不出来,其他的任务名称 发布分支 Git 地址 可以导出来。

需要安装:
pip3 install python-jenkins

import jenkins
import re
import xml.etree.ElementTree as ET
import csv

# 配置 Jenkins
JENKINS_URL = "http://your ip address/jenkins/"
USERNAME = "account name"
PASSWORD = "account pwd"

# 连接 Jenkins
server = jenkins.Jenkins(JENKINS_URL, username=USERNAME, password=PASSWORD)

# 获取所有 Job(可限定 view,如 server.get_jobs(view_name='移动m站'))
jobs = server.get_jobs()

results = []

for job in jobs:
    job_name = job['name']
    git_url = "未配置 Git"
    branch = "未知"
    deploy_ip = "未找到"

    try:
        # 1. 获取 Job 的 config.xml(XML 格式)
        config_xml_str = server.get_job_config(job_name)
        
        # 2. 解析 XML 提取 Git 地址和分支
        root = ET.fromstring(config_xml_str)
        
        # 查找 Git SCM 配置
        scm = root.find(".//scm[@class='hudson.plugins.git.GitSCM']")
        if scm is not None:
            # 提取 Git URL
            url_elem = scm.find(".//userRemoteConfigs/hudson.plugins.git.UserRemoteConfig/url")
            if url_elem is not None:
                git_url = url_elem.text
            
            # 提取分支(优先取参数化分支,否则取固定分支)
            branch_elem = scm.find(".//branches/hudson.plugins.git.BranchSpec/name")
            if branch_elem is not None:
                branch = branch_elem.text.replace("*/", "")  # 去掉通配符
        
        # 3. 从参数化构建中覆盖分支(若有)
        param_defs = root.findall(".//parameterDefinitions")
        for param in param_defs:
            for p in param:
                if p.tag == "hudson.model.StringParameterDefinition":
                    name_elem = p.find("name")
                    def_elem = p.find("defaultValue")
                    if name_elem is not None and def_elem is not None:
                        if "branch" in name_elem.text.lower():
                            branch = def_elem.text
        
        # 4. 获取最后一次构建日志,解析部署 IP
        last_build = server.get_job_info(job_name).get('lastCompletedBuild')
        if last_build:
            build_num = last_build['number']
            console = server.get_build_console_output(job_name, build_num)
            ip_match = re.search(r'(?:部署到|Disconnecting|Deploy to|host=|IP=|172\.16|10\.0)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', console)
            if ip_match:
                deploy_ip = ip_match.group(1)

    except Exception as e:
        print(f"[ERROR] 处理 {job_name} 失败: {str(e)[:100]}...")
    
    # 记录结果
    results.append({
        "任务名称": job_name,
        "发布分支": branch,
        "Git 地址": git_url,
        "部署IP": deploy_ip
    })

# 打印到控制台
print("\n任务名称\t\t发布分支\t\tGit 地址\t\t部署IP")
for r in results:
    print(f"{r['任务名称'][:20]:<20} {r['发布分支'][:15]:<15} {r['Git 地址'][:30]:<30} {r['部署IP']}")

# 导出 CSV
csv_file = "jenkins_jobs_full_export.csv"
with open(csv_file, "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.DictWriter(f, fieldnames=["任务名称", "发布分支", "Git 地址", "部署IP"])
    writer.writeheader()
    writer.writerows(results)

print(f"\n✅ 导出完成:{csv_file}")

 

posted on 2026-04-30 12:01  oktokeep  阅读(3)  评论(0)    收藏  举报