Python调用Jenkins接口批量创建服务_发布服务

1、调用Jenkins的py文件

封装有常用调用Jenkins的方法
jenkins_tools.py

import time
import jenkins
import sys
import os
from loguru import logger


if not os.environ.get('PYTHONIOENCODING'):  # 设置编码
    os.environ['PYTHONIOENCODING'] = 'utf-8'


class MyLogger:
    def __init__(self, log_file_path="app.log"):
        self.logger = logger
        self.log_file_path = log_file_path
        # 清空所有设置
        self.logger.remove()

        # 添加控制台输出的格式,sys.stdout为输出到屏幕;关于这些配置还需要自定义请移步官网查看相关参数说明
        self.logger.add(sys.stdout,
                        format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "  # 颜色>时间
                               "{process.name} | "  # 进程名
                               "{thread.name} | "  # 进程名
                               "<cyan>{module}</cyan>.<cyan>{function}</cyan>"  # 模块名.方法名
                               ":<cyan>{line}</cyan> | "  # 行号
                               "<level>{level}</level>: "  # 等级
                               "<level>{message}</level>",  # 日志内容
                        )
        # 输出到文件的格式,注释下面的add',则关闭日志写入
        self.logger.add(log_file_path, level='DEBUG',
                        format='{time:YYYY-MM-DD HH:mm:ss.SSS} - '  # 时间
                               "{process.name} | "  # 进程名
                               "{thread.name} | "  # 进程名
                               '{module}.{function}:{line} - {level} -{message}',  # 模块名.方法名:行号
                        rotation="500 MB", )

    def get_logger(self):
        return self.logger

my_logger = MyLogger(log_file_path="app.log").get_logger()
view_config = """<?xml version="1.1" encoding="UTF-8"?>
<hudson.model.ListView>
  <name>sssssss</name>
  <filterExecutors>false</filterExecutors>
  <filterQueue>false</filterQueue>
  <properties class="hudson.model.View$PropertyList"/>
  <jobNames>
    <comparator class="hudson.util.CaseInsensitiveComparator"/>
  </jobNames>
  <jobFilters/>
  <columns>
    <hudson.views.StatusColumn/>
    <hudson.views.WeatherColumn/>
    <hudson.views.JobColumn/>
    <hudson.views.LastSuccessColumn/>
    <hudson.views.LastFailureColumn/>
    <hudson.views.LastDurationColumn/>
    <hudson.views.BuildButtonColumn/>
  </columns>
  <recurse>false</recurse>
</hudson.model.ListView>"""


class JenkinsTools:
    def __init__(self, url, username, password):
        self.url = url
        # (1) 实例化jenkins对象,连接远程的 jenkins server
        self.server = jenkins.Jenkins(url, username, password)

    def get_last_build_number(self, job_name):
        """
        获取job的最后一次构建编号
        :return:
        """
        try:
            last_build_number = self.server.get_job_info(job_name)['lastBuild']['number']
        except TypeError:
            last_build_number = 0
        return last_build_number

    def start_job(self, job_name, parameters: dict = {}):
        """
        启动job
        :parameters job_name:
        :return:
        """
        old_last_build_number = self.get_last_build_number(job_name)
        self.server.build_job(job_name, parameters=parameters)
        while True:
            time.sleep(1)
            last_build_number = self.get_last_build_number(job_name)
            if last_build_number > old_last_build_number:
                break
        my_logger.info(f'开始构建 任务{job_name}({last_build_number}):{parameters}')
        my_logger.info(f'任务日志路径:{self.url}/job/{job_name}/{last_build_number}/console')

    def delete_job(self, job_name):
        my_logger.info(f'删除任务:{job_name}')
        self.server.delete_job(job_name)

    def create_jenkins_job(self, job_name, job_config_path, view_name, view_config=view_config):
        with open(job_config_path, 'r', encoding='utf-8') as f:
            job_config = f.read()

        # 使用作业配置XML创建作业,如果存在则更新,不存在则创建
        self.server.upsert_job(job_name, job_config)

        # 如果视图不存在,则创建一个视图
        if not self.server.view_exists(view_name):
            self.server.create_view(view_name, view_config)
            my_logger.info(f'创建{view_name}视图')

        # 获取视图的配置信息
        view_config = self.server.get_view_config(view_name)
        # 在视图配置中添加新创建的作业
        if f'<string>{job_name}</string>' not in view_config:
            new_view_config = view_config.replace('</jobNames>', f'<string>{job_name}</string></jobNames>')
            # 更新视图的配置
            self.server.reconfig_view(view_name, new_view_config)

        my_logger.info(f'Successfully created Jenkins job: {view_name}/{job_name}')


if __name__ == '__main__':
    parameters = {}
    url = "http://jenkins.yzt.com"
    username = "admin"
    password = "xxxx"
    jenkins_tools = JenkinsTools(url, username, password)
    # jenkins_tools.start_job('test',{'name':'test'})
    view_name = '数据治理多租户'
    jenkins_tools.create_jenkins_job('aaaaaa', 'config.xml', view_name)
    # jenkins_tools.delete_job('aaaa')

创建job用法

1、获取job,config.xml文件,并修改为jinjia2模板文件
如:config.xml.j2
job任务jinjia2模板文件

<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job@1400.v7fd111b_ec82f">
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties>
    <hudson.model.ParametersDefinitionProperty>
      <parameterDefinitions>
        <com.syhuang.hudson.plugins.listgitbranchesparameter.ListGitBranchesParameterDefinition plugin="list-git-branches-parameter@0.0.13">
          <name>GIT_BRANCH</name>
          <description>分支默认</description>
          <uuid>65a881ec-6fea-45ce-a67b-010d9c794972</uuid>
          <remoteURL>{{ git_url }}</remoteURL>
          <credentialsId>shanjing-gitlab</credentialsId>
          <defaultValue>master</defaultValue>
          <type>PT_BRANCH_TAG</type>
          <tagFilter>*</tagFilter>
          <branchFilter>refs/heads/(.*)</branchFilter>
          <sortMode>NONE</sortMode>
          <selectedValue>NONE</selectedValue>
          <quickFilterEnabled>true</quickFilterEnabled>
          <listSize>5</listSize>
        </com.syhuang.hudson.plugins.listgitbranchesparameter.ListGitBranchesParameterDefinition>
        <hudson.model.ChoiceParameterDefinition>
          <name>dest_harbor_host</name>
          <description>镜像推送的仓库地址</description>
          <choices class="java.util.Arrays$ArrayList">
            <a class="string-array">
              <string>image.senses-ai.com</string>
            </a>
          </choices>
        </hudson.model.ChoiceParameterDefinition>
        <hudson.model.ChoiceParameterDefinition>
          <name>host</name>
          <description>k8s master地址</description>
          <choices class="java.util.Arrays$ArrayList">
            <a class="string-array">
                {% for host in host_list %}
              <string>{{ host }}</string>
                {% endfor %}
            </a>
          </choices>
        </hudson.model.ChoiceParameterDefinition>
        <hudson.model.ChoiceParameterDefinition>
          <name>namespace</name>
          <description>程序要部署的命名空间</description>
          <choices class="java.util.Arrays$ArrayList">
            <a class="string-array">
                {% for namespace in namespace_list %}
              <string>{{ namespace }}</string>
                {% endfor %}
            </a>
          </choices>
        </hudson.model.ChoiceParameterDefinition>
        <hudson.model.BooleanParameterDefinition>
          <name>CI</name>
          <description>是否构建镜像</description>
          <defaultValue>true</defaultValue>
        </hudson.model.BooleanParameterDefinition>
        <hudson.model.BooleanParameterDefinition>
          <name>CD</name>
          <description>是否部署服务
</description>
          <defaultValue>true</defaultValue>
        </hudson.model.BooleanParameterDefinition>
      </parameterDefinitions>
    </hudson.model.ParametersDefinitionProperty>
  </properties>
  <definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@3922.va_f73b_7c4246b_">
    <scm class="hudson.plugins.git.GitSCM" plugin="git@5.3.0">
      <configVersion>2</configVersion>
      <userRemoteConfigs>
        <hudson.plugins.git.UserRemoteConfig>
          <url>http://git.senses-ai.com/devops/pipeline-libs.git</url>
          <credentialsId>shanjing-gitlab</credentialsId>
        </hudson.plugins.git.UserRemoteConfig>
      </userRemoteConfigs>
      <branches>
        <hudson.plugins.git.BranchSpec>
          <name>*/Main</name>
        </hudson.plugins.git.BranchSpec>
      </branches>
      <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
      <submoduleCfg class="empty-list"/>
      <extensions/>
    </scm>
    <scriptPath>jenkinsfiles/{{project_name}}/{{ service_name }}/Jenkinsfile</scriptPath>
    <lightweight>true</lightweight>
  </definition>
  <triggers/>
  <disabled>false</disabled>
</flow-definition>

2、创建job任务,并放入对应的视图下

create_job.py

# %%
import os
import sys
import requests
import yaml
from jinja2 import Environment, FileSystemLoader
from jenkins_tools import JenkinsTools

# 创建模板加载器,并指定模板文件所在的目录路径
template_loader = FileSystemLoader('templates/')

# 创建模板环境,并关联模板加载器
from jinja2_ansible_filters import AnsibleCoreFiltersExtension

jinja2_env = Environment(extensions=[AnsibleCoreFiltersExtension], loader=template_loader)

service_info_yaml = """
descartes:
  project_name: 多维平台
  env: dev
  service_name: descartes
  git_url: http://git.senses-ai.com/dataops/metrics/descartes
metrics-query-server:
  project_name: 多维平台
  env: dev
  service_name: metrics-query-server
  git_url: http://git.senses-ai.com/dataops/metrics/metrics-query-server


"""
service_info = yaml.safe_load(service_info_yaml)
# %%
tempfile_path = f"templates/config.xml.j2"
with open(tempfile_path, encoding='utf-8') as f:
    _templ = f.read()

tmpl = jinja2_env.from_string(_templ)
host_list = input('请输入主机ip,以空格分隔: ')
namespace_list = input('请输入命名空间,以空格分隔: ')
for service_name in service_info:
    service_info.get(service_name)['host_list'] = host_list.split()
    service_info.get(service_name)['namespace_list'] = namespace_list.split()
    result = tmpl.render(**service_info.get(service_name))
    with open(f"config.xml", "w", encoding='utf-8') as f:
        f.write(result)
    parameters = {}
    url = "http://jenkins.yzt.com/"
    username = "admin"
    password = "xxxx"
    jenkins_tools = JenkinsTools(url, username, password)
    # jenkins_tools.start_job('test',{'name':'test'})
    view_name = service_info.get(service_name).get('project_name')
    jenkins_tools.create_jenkins_job(f'01_{service_name}_dev', 'config.xml', view_name)
    # jenkins_tools.delete_job('aaaa')

3、安装依赖

echo '
pyyaml
jinja2
loguru
requests
jinja2-ansible-filters
' > requirements.txt
pip3 install -r requirements.txt

4、创建job

# 创建service_info清单中的job,并设置统一的默认参数:host/namespace
python3 create_job.py
192.168.5.2
qq-dev
posted @ 2025-01-22 10:42  Tenderness、  阅读(28)  评论(0)    收藏  举报