由于我们项目jenkinsfile和deployment.yaml都是单独分开放在git仓库上管理的,脚本实现的是通过批量创建对应的文件和job任务自动提交git仓库,并把job加入到视图里!
话不多说贴脚本:
import os
import re
import shutil
import jenkins
from colorama import init, Fore, Style
init(autoreset=True)
'''
脚本基于python3,windows环境,linux环境使用将路径变量改成linux的格式
1.批量创建流水线job需要目录和文件:jenkinsfile和deployment.yaml,在对模板文件进行替换修改
2.创建job并将其加入到视图
注意:
repo_name.txt内容格式:'job名,k8s服务名,job的description信息'
'''
#将创建修改好的文件提交到git仓库
def updata_git(dir):
print('进入到目录:%s' % dir)
os.chdir(dir)
print('执行git pull拉取代码')
os.system('git pull origin master')
print('将代码添加到本地缓冲区')
os.system('git add .')
print('执行git status')
cmd = os.popen('git status').readlines()
if any("Changes to be committed:" in s for s in cmd):
description = input('please input your Commit description: ')
print('执行commit提交到远程仓库')
os.system('git commit -m "%s"' % commit_msg)
print('执行push上传到远程仓库')
os.system('git push origin master')
else:
print('Local code not change')
#批量创建jenkinsfile和k8s发布的deployment.yaml文件
def create_many(jenkins_dir, docker_dir, src_jenkinsfile, src_deployfile):
if not os.path.exists(jenkins_dir):
os.makedirs(jenkins_dir)
shutil.copy(src_jenkinsfile, jenkins_dir)
else:
print(Style.BRIGHT + Fore.RED + '%s 目录已存在!!!' % jenkins_dir)
if not os.path.exists(docker_dir):
os.makedirs(docker_dir)
shutil.copy(src_deployfile, docker_dir)
else:
print(Style.BRIGHT + Fore.RED + '%s 目录已存在!!!' % docker_dir)
#将创建好的文件进行替换修改
def replace_file(file_path, old_str, new_str):
if os.path.exists(file_path):
with open(file_path, 'r', encoding='UTF-8') as f:
lines = f.readlines()
if any(old_str in s for s in lines):
with open(file_path, 'w+', encoding='UTF-8') as f:
for line in lines:
content = re.sub(old_str, new_str, line)
f.writelines(content)
print(Style.BRIGHT + Fore.GREEN + '**********已成功将%s替换为:%s**********' % (old_str, new_str))
else:
print(Style.BRIGHT + Fore.RED + 'old_str not found,Can't replace!!!')
else:
print(Style.BRIGHT + Fore.RED + '%s目录文件不存在!!!' % file_path)
#创建job并把job任务添加到视图
def create_jobs(job_name, job_branch, description, view_name):
server = jenkins.Jenkins(jenkins_url, jenkins_user, jenkins_password)
with open(template_xml, encoding='utf-8') as f:
xml_path = f.read()
job_conf = xml_path.replace("${description_name}", description).replace("${project_name}", job_name).replace(
'${branch}', job_branch)
if not server.job_exists(job_name):
server.create_job(job_name, job_conf)
print(Fore.GREEN + 'Job create successful.')
if not server.view_exists(view_name):
print(Style.BRIGHT + Fore.GREEN + '创建视图并添加job到视图.')
server.create_view(view_name, jenkins.EMPTY_VIEW_CONFIG_XML)
view_config = server.get_view_config(view_name).strip()
new_view_config = re.sub('',
'%s n' % job_name,
view_config)
server.reconfig_view(view_name, new_view_config)
else:
print(Style.BRIGHT + Fore.GREEN + '视图已存在,添加job到视图.')
view_config = server.get_view_config(view_name).strip()
new_view_config = re.sub('',
'%s n' % job_name,
view_config)
server.reconfig_view(view_name, new_view_config)
# print(server.get_view_config(view_name))
else:
print(Style.BRIGHT + Fore.RED + 'Job already exists.')
if __name__ == "__main__":
##git仓库本地路径
jenkins_local_path = 'D:git_codeJenkinsfile-manage\'
docker_local_path = 'D:git_codedocker-deploy-manage\'
##jenkinfile和deployment.yaml要拷贝的模板文件路径
src_jenkinsfile = r'E:scm_templatetemplate_cloudJenkinsfile-manageJenkinsfile'
src_deployfile = r'E:scm_templatetemplate_clouddocker-deploy-managedeployment.yaml'
##jenkins登录相关信息
jenkins_url = 'jenkins_url.com'
jenkins_user = 'admin'
jenkins_password = '123456'
job_branch = 'dev'
view_name = '视图名称'
##jenkins的job配置文件模板config.xml
template_xml = "config_test.xml"
##项目名存放list清单文件
list_repo = r'E:py_projectrepo_name.txt'
with open(list_repo, encoding='utf-8') as f:
#遍历需创建的项目名
for i in f.readlines():
#将list_repo文件内容分割取出
line, new_str_repo, description = i.strip().split(',')
# jenkinsfile和deployment.yaml的目录存放路径--dest
jenkins_dir = jenkins_local_path + line + '\dev'
docker_dir = docker_local_path + line
jenkins_file = r'%sJenkinsfile' % jenkins_dir
deploy_file = r'%sdeployment.yaml' % docker_dir
# 创建jenkinsfile目录和yaml目录文件
print('开始创建%s的jenkinsfile和yaml相关目录文件......' % line)
create_many(jenkins_dir, docker_dir, src_jenkinsfile, src_deployfile)
# 替换jenkinsfile和deployment.yaml文件内容
replace_file(jenkins_file, 'REPO_template', new_str_repo)
replace_file(jenkins_file, 'DEPLOYMENT_template', line)
replace_file(deploy_file, 'template_deployment', new_str_repo)
# replace_file(deploy_file, '8080', '8080')
# create_jobs(job_name, job_branch, description, view_name)job_name代表的job名,job_branch代表的job的分支,description代表名称显示,view_name代表视图名
print('开始创建%s的job...' % line)
create_jobs(line, job_branch, description, view_name)
print()
print('开始提交到git仓库......')
updata_git(jenkins_local_path)
updata_git(docker_local_path)
print()
print(Fore.GREEN + 'Execution Completed.....')



