一、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

Alt Image Text

基于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文件获取。还可以通过在启动日志中获取。

Alt Image Text

1.3.2 自定义Jenkins插件

解锁Jenkins之后再自定义Jenkins页面,您可以安装任何数量的插件作为初始化的一部分。

分别是安装建议的插件和选择要安装的插件(如果不确定要安装那些的时候可以选择此选项,灵活的自定义安装)。

插件安装多了也没关系,可以后面再jenkins插件管理页面删除哦

Alt Image Text

1.3.3 配置更新站点

由于使用官方的站点速度相对很慢,这里采用清华大学的jenkins更新站点。

站点地址: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

Alt Image Text

1.3.4 管理页面

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

Alt Image Text

Jenkins 项目管理页面

Alt Image Text

Jenkins 构建页面

Alt Image Text

1.4 Jenkins 添加 Agent

Jenkins 是一个单 MasterSlave 的集群架构(以前大多叫 Slave,现在大多叫 Agent)。

Jenkins 的 Agent 大概分两种,一是基于 SSH 的,需要把 MasterSSH 公钥配置到所有的 Agent 宿主机上去。二是基于 JNLP 的,走 HTTP协议,每个 Agent 需要配置一个独特的密码。基于 SSH 的,可以由 Master 来启动;基于 JNLP 的,需要自己启动。

  • 使用JNLP协议添加SLAVE
  • Jenkins配置固定SLAVE通信端口

1.4.1 安装Slave 节点

系统管理 -> 节点管理

Alt Image Text

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

Alt Image Text

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

Alt Image Text

1.5 Jenkins 用户与权限管理

操作添加删除更新用户。使用插件为用户分配项目授权。

用户认证方式

  • 默认Jenkins自带数据库
  • LDAP认证
  • ActiveDirctory认证
  • Gitlab/GitHub认证

用户管理

  • 新增用户
  • 删除用户

1.5.1 用户管理

配置用户接入入口: 系统管理->全局安全配置

默认使用的是Jenkins数据库存储。

可以选择集成LDAP服务或者是Gitlab服务(需要安装插件后才会有)

Alt Image Text

1.5.2 用户管理权限管理

安装授权插件Role-Basecd Strategy用户项目授权

Alt Image Text

1.5.3 管理权限

系统设置->Manage and Assign Roles->Manage Roles

Global roles:添加用户和用户组,分配某个用户属于哪个用户组。

Project roles:添加某个工程或某一组工程的用户或用户组

Slave roles:添加某个节点或某一组节点的用户或用户组

Alt Image Text

凭据参数、字符参数、密码参数、布尔值参数、文件参数、文本参数、运行时参数、选项参数

  • 系统设置->Manage and Assign Roles->Assign Roles

Alt Image Text

1.5.4 全局权限

Alt Image Text

1.5.5 项目权限

Alt Image Text

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, 只有命名规范才方便管理项目。

新建项目

Alt Image Text

设置构建历史

Alt Image Text

选择参数化构建

Alt Image Text

设置Jenkinsfile

Alt Image Text

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

Alt Image Text

Alt Image Text

1.7.3 项目管理 —— 项目文件夹

以业务简称为名,创建工程文件夹。将同一个业务的工程全部放到同一个文件夹中。

移动项目

Alt Image Text

1.7.4 项目管理 —— 视图

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

Alt Image Text

Alt Image Text

二、分布式构建与并行构建

2.1 分布式构建与并行构建

Jenkins采用的是"master+agent"架构(有时也称为master+slave架构),Jenkins master负责提供界面、处理HTTP请求及管理构建环境构建的执行则由Jenkins agent负责(早期agent也被称为slave。目前还有一些插件沿用slave的概念)。

基于这样的架构只需要增加agent就可以轻松支待更多的项目同时执行。这种方式称为Jenkins agent的横向扩容

对于Jenkins matter存在单节点问题是显而易见的,但是目前还没有很好的解决方案

Alt Image Text

  • node:节点,指包含Jenkins环境及有能力执行项目的机器。masteragent都被认为是节 点。
  • executor:执行器,是真正执行项目的单元。一个执行器可以被理解为一个单独的进程(事 实上是线程)。在一个节点上可以运行多个执行器。
  • agent:代理,在概念上指的是相对于Jenkins master的一种角色,实际上是指运行在机器或 容器中的一个程序,它会连接上Jenkins master,并执行Jenkins master分配给它的任务。
  • slave:与agent表达的是一个东西,只是叫法不同。 理解nodeexecutoragentslave之间的关系,对于做好分布式构建很重要。

总而言之,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)冲突。

对于支持JDK8agent,我们打上jdk8标签;对于支持Node.jsagent,我们打上nodejs 标签;如果一个agen同时支持JDK8Node.js,那么就两个标签都打上。

在打标签时,可以根据以下几个维度来进行。

  • 工具链:jdk\nodejs\ruby;也可以加上工具的版本,如jdk6jdk8.
  • 操作系统:linux、 windows、 osx;或者加上操作系统的版本,如ubuntul 8.04、 centos7.30
  • 系统位数:32bit、64bit

可以根据实际项目情况新增维度。 对于不同的增加agent的方式,打标签的方式也不同。

2.2.2 通过JNLP协议增加agent

Java网络启动协议(JNLP)是种允许客户端启动托管在远程Web服务器上的应用程序的协议。Jeakins masteragent通过JNLP协议进行通信。Jana Web Start(JWS)可以被理解为 JNLP协议的一个客户端。现实中人们常常将JNLPJWS看成是一种东西

接下来我们来看看通过JNLP协议城加agent的具体步骤

进入Manage Jenkins -> Globa Security -> TCP Port for JNLP配置页面, 我们可以选择开放固定端口或者随机开放Jenkins Master的一个端口来提供JNLP服务

Alt Image Text

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

Alt Image Text

  • 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 插件的作用就是让构建成功的状态图标变成绿色的。

Alt Image Text

3.2 Build Monitor View插件

Build Monitor View插件(https://plugins.jenkins.io/build-monitor-plugin/)可以将Jenkins项目 以一块"看板”的形式呈现

安装该插件后,我们需要手动添加这块看板。

步骤如下

  • (1) 单击+号添加新视图

Alt Image Text

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

Alt Image Text

当构建失败时,就会出现红块。

如果条件允许,请将这块“看板”显示在人人都可以看到的大屏幕上。这样做的好处是:

  • (1)大家提交代码会变得更严谨,因为所有人都可以看到你的构建结果。在没有持续集成经 验的团队中,一开始开发人员并不会很在意构建的成功与失败。即使上一次构建失败了,其他人 也会继续推送代码。这样的操作违反了持续集成的一个原则:不修复失败的构建,不提交代码。
  • (2)让项目信息流通更顺畅。人人都可以看到最近执行了什么构建。

四、使用Active Choice Parameter参数化构建

4.1 使用Active Choice Parameter参数化构建

在使用Pipeline项目时 一般都是参数化构建工作,在Jenkins的构建需要使用参数类型有复选框,单选按钮,多选值等输入的情景

Alt Image Text

转到→管理Jenkins→选择管理插件→选择可用选项卡,然后搜索主动选择插件。安装并重新启动Jenkins,以正确安装插件。我的已经安装好,因此在“已安装”标签中列出

主动选择参数

使用Groovy脚本或Scriptler目录中的脚本为生成参数动态生成值选项列表。参数可以动态更新,呈现为组合框,复选框,单选按钮或丰富的HTML UI窗口小部件。

Alt Image Text

按住Ctrl 就可以多选了。

Alt Image Text

主动选择反应参数

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

Alt Image Text

项目地址:

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_job delete_build build_job_url stop_build
  • 凭据操作 create_credential delete_credentialcredential_exists
  • 视图操作 create_view delete_view view_exists
  • 节点操作 create_node disable_node delete_node enable_node node_exists
  • 晋级操作 create_promotion delete_promotion promotion_exists
  • 取消队列 cancel_queue
  • 检查jenkinsfile语法 check_jenkinsfile_syntax
  • 检查项目信息 debug_job_info
  • 文件夹操作 is_folder create_folder
  • 安装插件 install_plugin

get获取方法

  • 获取项目信息 get_all_jobs get_job_config get_job_info get_job_info_regex get_job_name get_jobs
  • 获取构建信息 get_build_console_output get_build_env_vars get_build_info get_build_test_report
  • 获取凭据信息 get_credential_config get_credential_info list_credentials get_info
  • 获取节点信息 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 jenkins_open jenkins_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

Alt Image Text

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>

效果

Alt Image Text