一、Jenkins运维管理¶
1.1 Jenkins 简介¶
Jenkins是一个自动化服务器,目前发展超过15年,比较成熟的CI工具(也可以CD) 能够实现自动化集成发布。建立好流水线后,期间无需专业运维人员介入,开发人员随时发布部署,任性!。
部分应用场景:
- 集成
svn/git客户端实现源代码下载检出 - 集成
maven/ant/gradle/npm等构建工具实现源码编译打包单元测试 - 集成
sonarqube对源代码进行质量检查(坏味道、复杂度、新增bug等) - 集成
SaltStack/Ansibie实现自动化部署发布 - 集成
Jmeter/Soar/Kubernetes/...... - 可以自定义插件或者脚本通过
jenkins传参运行 - 可以说
Jenkins比较灵活插件资源丰富,日常运维工作都可以自动化。
1.2 Jenkins部署¶
1.2.1 虚拟机(Linux) 安装¶
Jenkins 安装准备
Jenkins使用java语言开发, 需要安装JDK,目前已支持jdk11.Jenkins的安装可以跨平台 (Win/Linux/Mac)- 部署/更新源:https://mirrors.tuna.tsinghua.edu.cn/jenkins

基于WAR包部署
Jenkins的web应用程序archive(war)包是可以在任何支持Java的操作系统上运行。 Jenkins最新 war包
- 将下载的war包放到jenkins的目录中(可以自定义)。
- 运行命令 java -jar jenkins.war启动。
- 此时可以看到Jenkins的启动日志,查看是否有异常。
- 通过浏览器访问http://localhost:8080。
注意:可以通过 --httpPort方式指定端口,java -jar jenkins.war -httpPort=9090。
基于MAC系统部署
- 下载软件包手动安装
brew install jenkins#安装jenkins最新版本brew install jenkins-lts#安装jenkinsLTS版本
基于Windows系统安装
下载软件包通过向导安装即可。
基于Linux系统部署(推荐)
- 下载软件包
rpm –ivh jenkins-2.150.3-1.1.noarch.rpm#安装service jenkins start#启动服务chkconfig jenkins on#开机自启
service jenkins start
service jenkins status
ps aux | grep java
1.2.2 基于Docker的安装部署¶
安装的详细步骤可以查看我原来的文章 Quick Start Jenkins on Docker
安装docker环境 (exp: Install Docker Engine on CentOS
准备好plugn.txt 作为Jenkins插件列表 (exp: plugins.txt)
准备Dockerfile
FROM jenkins/jenkins:2.150.2
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt
构建镜像docker build -t jenkins:v20200630 .
修改var/lib/jenkins 权限
$ cd /var/lib/
$ ls -la
drwxr-xr-x 2 root root 4096 Jan 21 03:13 jenkins
$ sudo chown 1000 jenkins/
- 启动
docker container:
docker run -d -p 8080:8080 -p 50000:50000 --env=JAVA_OPTS=-Djenkins.install.runSetupWizard=false -v /var/lib/jenkins:/var/jenkins_home jenkins:v20200630
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1119ddfd13e6 jenkins:v20200531 "/sbin/tini -- /usr/…" 34 hours ago Up 34 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp elegant_varahamihira
1.2.3 基于Jenkins-operator的安装部署¶
https://jenkinsci.github.io/kubernetes-operator/docs/installation/
1.3 Jenkins基本设置¶
配置访问端口: 默认8080
配置JENKINS HOME: 默认/var/lib/jenkins 配置启动用户
默认Jenkins 配置插件更新源: 默认官方源 -> 清华源/Jenkins中文社区源
安装pipeline插件 pipeline/Git/等插件
1.3.1 解锁Jenkins¶
当您第一次访问Jenkins的时候,系统会要求您使用自动生成的密码对其进行解锁。
解锁秘钥可以通过$JENKINS_HOME/secrets/initialAdminPassword文件获取。还可以通过在启动日志中获取。

1.3.2 自定义Jenkins插件¶
解锁Jenkins之后再自定义Jenkins页面,您可以安装任何数量的插件作为初始化的一部分。
分别是安装建议的插件和选择要安装的插件(如果不确定要安装那些的时候可以选择此选项,灵活的自定义安装)。
插件安装多了也没关系,可以后面再jenkins插件管理页面删除哦

1.3.3 配置更新站点¶
由于使用官方的站点速度相对很慢,这里采用清华大学的jenkins更新站点。
站点地址: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

1.3.4 管理页面¶
系统管理页面包含系统管理、全局安全管理、全局工具配置、节点管理、授权管理、插件管理、系统备份管理、日志监控管理等

Jenkins 项目管理页面

Jenkins 构建页面

1.4 Jenkins 添加 Agent¶
Jenkins 是一个单 Master 多 Slave 的集群架构(以前大多叫 Slave,现在大多叫 Agent)。
Jenkins 的 Agent 大概分两种,一是基于 SSH 的,需要把 Master 的 SSH 公钥配置到所有的 Agent 宿主机上去。二是基于 JNLP 的,走 HTTP协议,每个 Agent 需要配置一个独特的密码。基于 SSH 的,可以由 Master 来启动;基于 JNLP 的,需要自己启动。
- 使用
JNLP协议添加SLAVE Jenkins配置固定SLAVE通信端口
1.4.1 安装Slave 节点¶
系统管理 -> 节点管理

创建完成后会出现slave节点启动的命令,下载agent.jar,然后启动服务。

1.4.2 启动命令¶
$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
$ mkdir workspace && cd workspace
$ wget http://192.168.33.11:8080/jnlpJars/agent.jar
$ java -jar agent.jar -jnlpUrl http://192.168.33.11:8080/computer/hostmachine/slave-agent.jnlp -workDir "/home/vagrant/workspace"
## This is will keep running we need this run in the background
Run in back ground
$ cd workspace
$ vim startagent.sh
nohup java -jar agent.jar -jnlpUrl http://192.168.33.11:8080/computer/hostmachine/slave-agent.jnlp -workDir "/home/vagrant/workspace" &
source startagent.sh

1.5 Jenkins 用户与权限管理¶
操作添加删除更新用户。使用插件为用户分配项目授权。
用户认证方式
- 默认
Jenkins自带数据库 LDAP认证ActiveDirctory认证Gitlab/GitHub认证
用户管理
- 新增用户
- 删除用户
1.5.1 用户管理¶
配置用户接入入口: 系统管理->全局安全配置。
默认使用的是Jenkins数据库存储。
可以选择集成LDAP服务或者是Gitlab服务(需要安装插件后才会有)

1.5.2 用户管理权限管理¶
安装授权插件Role-Basecd Strategy用户项目授权

1.5.3 管理权限¶
系统设置->Manage and Assign Roles->Manage Roles
Global roles:添加用户和用户组,分配某个用户属于哪个用户组。
Project roles:添加某个工程或某一组工程的用户或用户组
Slave roles:添加某个节点或某一组节点的用户或用户组

凭据参数、字符参数、密码参数、布尔值参数、文件参数、文本参数、运行时参数、选项参数
- 系统设置->
Manage and Assign Roles->Assign Roles

1.5.4 全局权限¶

1.5.5 项目权限¶

1.6 Jenkins 凭据管理与应用¶
凭证可以是一段字符串如密码,私钥文件等,是Jenkins 进行受限操作时的凭据。比如 SSH 登录远程服务器,用户名,密码或 SSH key就是凭证。这些凭据不要明文写在 Jenkinsfile 中,Jenkins有专门管理凭证的地方和插件。
添加凭证后,需要安装"Credentials Binding Plugin"插件,就可以在 pipeline中使用withCredentials 步骤使用凭证了。
1.6.1 凭据管理¶
凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息。
凭据-> 系统-> 全局凭据
1.7 Jenkins 项目管理¶
简述 Jenkins 的项目类型,创建删除项目。使用视图对项目进行分类。
1.7.1 项目管理 —— 流水线项目管理¶
命名规范
业务名称-应用名称-应用类型_环境类型: jam-workzone-kops_TEST, 只有命名规范才方便管理项目。
新建项目

设置构建历史

选择参数化构建

设置Jenkinsfile

1.7.2 项目管理 —— 项目基本管理¶


1.7.3 项目管理 —— 项目文件夹¶
以业务简称为名,创建工程文件夹。将同一个业务的工程全部放到同一个文件夹中。
移动项目

1.7.4 项目管理 —— 视图¶
默认会创建一个all视图里面存放所有的项目。


二、分布式构建与并行构建¶
2.1 分布式构建与并行构建¶
Jenkins采用的是"master+agent"架构(有时也称为master+slave架构),Jenkins master负责提供界面、处理HTTP请求及管理构建环境构建的执行则由Jenkins agent负责(早期agent也被称为slave。目前还有一些插件沿用slave的概念)。
基于这样的架构只需要增加agent就可以轻松支待更多的项目同时执行。这种方式称为Jenkins agent的横向扩容
对于Jenkins matter存在单节点问题是显而易见的,但是目前还没有很好的解决方案

node:节点,指包含Jenkins环境及有能力执行项目的机器。master和agent都被认为是节 点。executor:执行器,是真正执行项目的单元。一个执行器可以被理解为一个单独的进程(事 实上是线程)。在一个节点上可以运行多个执行器。agent:代理,在概念上指的是相对于Jenkins master的一种角色,实际上是指运行在机器或 容器中的一个程序,它会连接上Jenkins master,并执行Jenkins master分配给它的任务。slave:与agent表达的是一个东西,只是叫法不同。 理解node、executor、agent、slave之间的关系,对于做好分布式构建很重要。
总而言之,executor:的概念是相对于node的,没有node也就谈不上executor了。node通常指的是机器(不论是物理的还是虚拟的)。
agent有时指一个程序,有时指一种角色(相对于master 而言),这取决于上下文。对一于slave,可以等同于agent
总而言之,executor:的概念是相对于node的,没有node也就谈不上executor了。node通常指 的是机器(不论是物理的还是虚拟的)。agent有时指一个程序,有时指一种角色(相对于master 而言),这取决于上下文。对一于slave,可以等同于agent
2.2 增加agent¶
实现分布式构建最常用、最基本的方式就是增加agent. Jenkins agent作为一个负责执行任务的程序,它需要与Jenkins master建立双向连接。连接方式有多种,这也代表有多种增加agent的方式。 在真正介绍如何增加agent前,我们需要了解标签((label)在分布式构建中的作用。
2.2.1 对agent打标签¶
当agent数量变多时,如何知道哪些agent支持JDK8.哪些agent支持Node.js环境呢?我们可以通过给agent打标签(有时也称为tag)来确定。
通过标签将多个agent 分配到同一个逻辑组中,这个过程被称为打标签。同一个agent可以拥有多个标签。在标签名中不能包含空格,也不能包含!、&、{、<、>、(、)这些特殊字符中的任何一个。因为包含特殊字符的标签名与标签表达式(用于过滤agent)冲突。
对于支持JDK8的agent,我们打上jdk8标签;对于支持Node.js的agent,我们打上nodejs 标签;如果一个agen同时支持JDK8和Node.js,那么就两个标签都打上。
在打标签时,可以根据以下几个维度来进行。
- 工具链:
jdk\nodejs\ruby;也可以加上工具的版本,如jdk6、jdk8. - 操作系统:linux、 windows、 osx;或者加上操作系统的版本,如ubuntul 8.04、 centos7.30
- 系统位数:32bit、64bit
可以根据实际项目情况新增维度。 对于不同的增加agent的方式,打标签的方式也不同。
2.2.2 通过JNLP协议增加agent¶
Java网络启动协议(JNLP)是种允许客户端启动托管在远程Web服务器上的应用程序的协议。Jeakins master与agent通过JNLP协议进行通信。而Jana Web Start(JWS)可以被理解为 JNLP协议的一个客户端。现实中人们常常将JNLP和JWS看成是一种东西
接下来我们来看看通过JNLP协议城加agent的具体步骤
进入Manage Jenkins -> Globa Security -> TCP Port for JNLP配置页面, 我们可以选择开放固定端口或者随机开放Jenkins Master的一个端口来提供JNLP服务

随机开放端口不利于自动化所以透择开放周定端口。此端口用于master与agent之间的 TCP通信与访问Jenkins界面时的端口有别 。

Name:agent名称。Remote root directory:agent机器上的工作目录(Jenkins master不关心),使用绝对路径。/home/vagrant/workspace/
$ tree -L 1 workspace/
workspace/
├── Chapter2-5Script
├── Chapter2-5Script@tmp
├── Chapter2_test2
├── Chapter2_test2@tmp
├── HelloWorld
└── HelloWorld@tmp
6 directories, 0 files
Labels:agent的标签。Usage:agent的使用策略。有两种:Use this node as much as possible,尽可能使用此agent。Only build jobs with label expressions matching this node,只有当构建任务符合本agent的标签时,才使用此agent
Launch method:agent的运行方式。JNLP协议的agent选择“Launch agent via Java Web Start"
三、可视化构建试图¶
3.1 Green Balls插件¶
JUnit 有一句 slogan:
Keep the bar green to keep the cork clean
Green Balls 插件的作用就是让构建成功的状态图标变成绿色的。

3.2 Build Monitor View插件¶
Build Monitor View插件(https://plugins.jenkins.io/build-monitor-plugin/)可以将Jenkins项目 以一块"看板”的形式呈现
安装该插件后,我们需要手动添加这块看板。
步骤如下
- (1) 单击
+号添加新视图

- (2) 进人添加表单后,选择“Build Monitor View”选项
- (3)进人
“Build Monitor View”编辑页,可以选择在视图中显示I哪些Job,以及它们的排序规则

当构建失败时,就会出现红块。
如果条件允许,请将这块“看板”显示在人人都可以看到的大屏幕上。这样做的好处是:
- (1)大家提交代码会变得更严谨,因为所有人都可以看到你的构建结果。在没有持续集成经 验的团队中,一开始开发人员并不会很在意构建的成功与失败。即使上一次构建失败了,其他人 也会继续推送代码。这样的操作违反了持续集成的一个原则:不修复失败的构建,不提交代码。
- (2)让项目信息流通更顺畅。人人都可以看到最近执行了什么构建。
四、使用Active Choice Parameter参数化构建¶
4.1 使用Active Choice Parameter参数化构建¶
在使用Pipeline项目时 一般都是参数化构建工作,在Jenkins的构建需要使用参数类型有复选框,单选按钮,多选值等输入的情景

转到→管理Jenkins→选择管理插件→选择可用选项卡,然后搜索主动选择插件。安装并重新启动Jenkins,以正确安装插件。我的已经安装好,因此在“已安装”标签中列出
主动选择参数
使用Groovy脚本或Scriptler目录中的脚本为生成参数动态生成值选项列表。参数可以动态更新,呈现为组合框,复选框,单选按钮或丰富的HTML UI窗口小部件。

按住Ctrl 就可以多选了。

主动选择反应参数
当作业中UI控件的值发生更改时,可以动态更新(主动选择和响应参考参数) 这里可以使用IF进行条件判断,输出相关的值。

项目地址:
https://github.com/jenkinsci/active-choices-plugin
插件地址:
https://plugins.jenkins.io/uno-choice/
五、自动化使用python-jenkins管理Jenkins¶
5.1 自动化使用python-jenkins管理Jenkins¶
本次我们将要学习JenkinsAPI接口,我们先用Python-jenkins这个库完成。
- 仓库Pypi :https://pypi.org/project/python-jenkins/
- 在线文档: http://python-jenkins.readthedocs.org/en/latest/
- 当前环境Python版本 v3.7.0
5.2 功能¶
- Create new jobs 创建新项目
- Copy existing jobs 复制已存在的项目
- Delete jobs 删除项目
- Update jobs 更新项目
- Get a job’s build information 获取一个项目的构建信息
- Get Jenkins master version information 获取Jenkins master的版本信息
- Get Jenkins plugin information 过去jenkins插件信息
- Start a build on a job 构建一个项目
- Create nodes 创建一个节点
- Enable/Disable nodes 启用/禁用节点
- Get information on nodes 获取节点信息
- Create/delete/reconfig views 创建/删除/更新视图
- Put server in shutdown mode (quiet down) 关机
- List running builds 列出构建中的项目
- Delete builds 删除构建
- Wipeout job workspace
- Create/delete/update folders 创建/删除/更新文件夹
- Set the next build number 设置下次构建ID
- Install plugins 安装插件
5.3 使用思路¶
例如我要创建一个项目
1、要先找到创建项目的方法 2、然后根据API文档查阅如何使用 每个接口的使用方法 3、打开一个python解释器调试
5.4 初始化配置¶
安装python-jenkins
pip install python-jenkins==1.6.0
测试
$ python3
Python 3.7.4 (v3.7.4:e09359112e, Jul 8 2019, 14:54:52)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import jenkins
>>> server = jenkins.Jenkins("http://127.0.0.1:8080",username="admin",password="admin")
>>> server.get_whoami()
{'_class': 'hudson.model.User', 'absoluteUrl': 'http://127.0.0.1:8080/user/admin', 'description': '', 'fullName': 'admin', 'id': 'admin', 'property': [{'_class': 'jenkins.security.ApiTokenProperty'}, {'_class': 'jenkins.security.LastGrantedAuthoritiesProperty'}, {'_class': 'hudson.model.MyViewsProperty'}, {'_class': 'hudson.model.PaneStatusProperties'}, {'_class': 'hudson.security.HudsonPrivateSecurityRealm$Details'}, {'_class': 'org.jenkinsci.main.modules.cli.auth.ssh.UserPropertyImpl'}, {'_class': 'jenkins.security.seed.UserSeedProperty'}, {'_class': 'hudson.search.UserSearchProperty', 'insensitiveSearch': True}, {'_class': 'hudson.model.TimeZoneProperty'}]}
查看 所有的方法
>>> dir(server)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_add_missing_builds', '_auth_resolved', '_auths', '_build_url', '_get_encoded_params', '_get_job_folder', '_get_tag_text', '_get_view_jobs', '_maybe_add_auth', '_request', '_response_handler', '_session', '_timeout_warning_issued', 'assert_credential_exists', 'assert_folder', 'assert_job_exists', 'assert_node_exists', 'assert_promotion_exists', 'assert_view_exists', 'auth', 'build_job', 'build_job_url', 'cancel_queue', 'check_jenkinsfile_syntax', 'copy_job', 'create_credential', 'create_folder', 'create_job', 'create_node', 'create_promotion', 'create_view', 'credential_exists', 'crumb', 'debug_job_info', 'delete_build', 'delete_credential', 'delete_job', 'delete_node', 'delete_promotion', 'delete_view', 'disable_job', 'disable_node', 'enable_job', 'enable_node', 'get_all_jobs', 'get_build_console_output', 'get_build_env_vars', 'get_build_info', 'get_build_test_report', 'get_credential_config', 'get_credential_info', 'get_info', 'get_job_config', 'get_job_info', 'get_job_info_regex', 'get_job_name', 'get_jobs', 'get_node_config', 'get_node_info', 'get_nodes', 'get_plugin_info', 'get_plugins', 'get_plugins_info', 'get_promotion_config', 'get_promotion_name', 'get_promotions', 'get_promotions_info', 'get_queue_info', 'get_queue_item', 'get_running_builds', 'get_version', 'get_view_config', 'get_view_name', 'get_views', 'get_whoami', 'install_plugin', 'is_folder', 'jenkins_open', 'jenkins_request', 'job_exists', 'jobs_count', 'list_credentials', 'maybe_add_crumb', 'node_exists', 'promotion_exists', 'quiet_down', 'reconfig_credential', 'reconfig_job', 'reconfig_node', 'reconfig_promotion', 'reconfig_view', 'rename_job', 'run_script', 'server', 'set_next_build_number', 'stop_build', 'timeout', 'upsert_job', 'view_exists', 'wait_for_normal_op', 'wipeout_job_workspace']
do操作方法
do操作方法
- 功能 / python方法
- 项目操作:
create_job,disable_job,delete_job,copy_job,enable_job,job_exists,jobs_count,upsert_job - 构建操作
build_jobdelete_buildbuild_job_urlstop_build - 凭据操作
create_credentialdelete_credentialcredential_exists - 视图操作
create_viewdelete_viewview_exists - 节点操作
create_nodedisable_nodedelete_nodeenable_nodenode_exists - 晋级操作
create_promotiondelete_promotionpromotion_exists - 取消队列
cancel_queue - 检查jenkinsfile语法
check_jenkinsfile_syntax - 检查项目信息
debug_job_info - 文件夹操作
is_foldercreate_folder - 安装插件
install_plugin
get获取方法
- 获取项目信息
get_all_jobsget_job_configget_job_infoget_job_info_regexget_job_name get_jobs - 获取构建信息
get_build_console_outputget_build_env_varsget_build_infoget_build_test_report - 获取凭据信息
get_credential_configget_credential_infolist_credentialsget_info - 获取节点信息
get_node_configget_node_infoget_nodes - 获取插件信息
get_plugin_infoget_pluginsget_plugins_info - 获取晋级信息
get_promotion_configget_promotion_nameget_promotionsget_promotions_info - 获取队列信息
get_queue_infoget_queue_item - 获取运行中构建
get_running_builds - 获取版本
get_version - 获取视图信息
get_view_configget_view_nameget_views - 获取当前用户
get_whoamijenkins_openjenkins_request
更新操作
- 关机
quiet_down - 更新凭据
reconfig_credential - 更新项目
reconfig_job - 更新节点
reconfig_node - 更新晋级
reconfig_promotion - 更新视图
reconfig_view - 重命名项目
rename_job - 运行脚本
run_script - 设置下次构建id
set_next_build_number
5.5 演示实例¶
每个接口的使用方法:https://python-jenkins.readthedocs.io/en/latest/api.html
5.5.1 项目操作¶
我们需要认识一下Jenkins项目的config.xml,大部分API在创建项目的时候会使用xml文件。首先创建一个项目(任何类型的都可以)然后我们进入$JENKINS_HOME/jobs/目录查看我们这个项目生成的config.xml文件。
builds存放项目的构建信息。
$ ls
demo-test
$ ls demo-test/
buildsconfig.xml
config.xml
可以看到jenkins的文件存储都是以xml方式存储的。(后面我们需要利用这个xml创建一个新项目)
<?xml version='1.1' encoding='UTF-8'?>
<project>
<description>test</description>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
<builders/>
<publishers/>
<buildWrappers/>
</project>
使用方法获取项目配置信息
server.get_job_config("demo-test")
'<?xml version=\'1.1\' encoding=\'UTF-8\'?>\n<project>\n <description>test</description>\n <keepDependencies>false</keepDependencies>\n <properties/>\n <scm class="hudson.scm.NullSCM"/>\n <canRoam>true</canRoam>\n <disabled>false</disabled>\n <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>\n <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>\n <triggers/>\n <concurrentBuild>false</concurrentBuild>\n <builders/>\n <publishers/>\n <buildWrappers/>\n</project>'
掌握创建项目的方法使用
create_job(name, config_xml)- name 项目名称 字符串类型
config_xml配置文件 字符串类型
新建项目demo-test-02
config_xml = server.get_job_config("demo-test")
server.create_job("demo-test-02",config_xml)
验证项目是否创建成功
server.job_exists("demo-test-02")
True
复制一个新项目demo-test-03
copy_job(from_name, to_name)
from_name源项目 字符串类型to_name目标项目 字符串类型
当源项目名称与目标项目名称一致的时候会报错。JenkinsException
>>> server.copy_job("demo-test-02","demo-test-03")
>>> server.job_exists("demo-test-03")
True
写一个脚本用于项目创建
新建一个项目,增加一个参数srcType用于分辨项目所使用的的版本控制系统类型。参数可以是(svn,git)。
我们要完成的是基于一个项目模板,创建新的项目并替换相关的参数。模板项目名称demo-devops-service 。

import jenkins
#login
serverUrl = "http://127.0.0.1:8080"
username = "admin"
password = "admin"
server = jenkins.Jenkins(serverUrl,username,password)
defProjectName = "demo-devops-service"
newProjectName = "demo-test-service"
if server.job_exists(newProjectName) != True :
print("项目不存在开始新建项目")
config_xml=server.get_job_config(defProjectName)
newconfig_xml = config_xml.replace("<defaultValue>svn</defaultValue>","<defaultValue>git</defaultValue>")
print(newconfig_xml)
server.create_job(newProjectName,newconfig_xml)
else:
print("项目已存在!")
运行输出
$ python3 josbtest.py
项目不存在开始新建项目
<?xml version='1.1' encoding='UTF-8'?>
<project>
<actions/>
<description></description>
<keepDependencies>false</keepDependencies>
<properties>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>srcType</name>
<description></description>
<defaultValue>git</defaultValue>
<trim>false</trim>
</hudson.model.StringParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
</properties>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
<builders/>
<publishers/>
<buildWrappers/>
</project>
效果
