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

浙公网安备 33010602011771号