一、持续集成

1. 什么是CI/CD

缩略词 CI / CD 具有几个不同的含义。CI/CD 中的“CI”始终指持续集成,它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。

CI/CD 中的“CD”指的是持续交付和/或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度。

持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题。因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。

持续部署(另一种“CD”)指的是自动将开发人员的更改从存储库发布到生产环境,以供客户使用。它主要为了解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。

CI/CD 既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这三项构成的关联环节。更为复杂的是,有时“持续交付”也包含了持续部署流程。

归根结底,我们没必要纠结于这些语义,您只需记得 CI/CD 其实就是一个流程(通常形象地表述为管道),用于实现应用开发中的高度持续自动化和持续监控。因案例而异,该术语的具体含义取决于 CI/CD 管道的自动化程度。许多企业最开始先添加 CI,然后逐步实现交付和部署的自动化。

2. jenkins

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

二、jenkins入门

1. 安装

1.1 java运行环境安装

1.1.1 jdk安装

jenkins是一个java项目,所以需要先安装java环境,需要java 8.0 以上版本。

官方安装教程

jdk1.8下载地址

如果官网下载搞不定可以下载百度云盘分享的安装文件(windows版本)

链接:https://pan.baidu.com/s/1emFwU46DB-jJaZxtRt4-YA 提取码:h6b8

1.1.2 java环境变量设置

创建环境变量JAVA_HOME设置期值为jdk的根目录

在环境变量PATH中添加jdk中的bin目录

在命令行中输入 java - version输出当前版本号表示环境搭建成功:

1.2 jenkins安装

1.2.1 windows系统下安装
1.2.2 mac下安装

使用安装程序安装:

使用brew的方式安装

  • brew install jenkins

上面的两种方式都是以服务的方式安装,还可以以脚本的方式安装,以命令的方式启动

1.2.3 脚本方式安装
  1. 下载 Jenkins war包.
  2. 打开终端进入到下载目录.
  3. 运行命令 java -jar jenkins.war --httpPort=8080.
  4. 打开浏览器进入链接 http://localhost:8080.
  5. 按照说明完成安装.

建议:

win10 家庭版不要安装成系统服务,可能会出现各种问题

关闭各种杀毒,防火墙之类的软件,可能会导致不能正常安装

1.2.4 傻瓜脚本式

如果实在是安装不成功,可以下载我提供的免安装版,注意 jenkins 依赖 Java 环境,所以要提前安装 JDK

链接:https://pan.baidu.com/s/1tg9mRXezx7MwviC9jNERsw 提取码:vbjh

下载后解压在非中文路径下,然后双击 jenkins.exe 程序即可,后面要使用的插件都下载好了,当然这只是供大家学习。生产环境下会部署到 Linux 服务器上。

2. jenkins使用

后续内容见博客 http://testingpai.com/article/1609225132204

2.1 解锁 Jenkins

安装好 jenkins 首次进入时,你会看到如下页面

按照页面上的路径找到初始化管理员密码,这个文件没有后缀,所以 windows 系统的童靴不要双击,右键使用记事本或者任意的文本编辑工具打开即可。复制密码填入输入框点击继续。

jenkins 接下来会连接网络(会连接外网),如果你的电脑不能连接网络,将会打开如下页面:

尽量不要出现安装时断网的情况,如果其他软件都可以访问互联网,还是出现这个页面,请尝试科学上网后再重复这个步骤。

2.2 安装插件

正常情况下,填完管理员密码后会打开如下页面:

点击安装推荐的插件,会跳转到下面的页面:

jenkins 会自动安装页面中显示的插件,根据你的网络情况,这个过程会持续数分钟。

2.3 创建第一个管理员用户

插件安装完后会自动跳入管理员创建页面:


填写管理员信息后点击保存并完成。

2.4 配置 Jenkins URL

Jenkins URL 用于给各种 Jenkins 资源提供绝对路径链接的根地址。 这意味着对于很多 Jenkins 特色是需要正确设置的,例如:邮件通知、PR 状态更新以及提供给构建步骤的 BUILD_URL 环境变量。

学习时,我们使用默认值即可,点击保存并完成,会出现 Jenkins 已就绪的页面。

点击开始使用 Jenkins 会进入 Jenkins 管理的首页面,至此初始化工作完成。

3. 配置插件升级站点国内镜像

后面我们会用到很多插件,而 jenkins 默认的插件升级站点是外网,经常会连不上或者速度非常慢,我们可以配置成国内的镜像。

进入 Manage Jenkins > Manage Plugins > Advance(高级)

滚动到页面底部

将升级站点改成:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

然后点击提交, 然后点击立即获取,如果正常页面会刷新,立即获取按钮前会出现多少秒之前获取更新信息的字样。

也有一些文章提示还要去配置 JSON 文件中替换 www.google.com 等,如果你只配置了升级站点不成功可以尝试。

在 Jenkins2.270 版本上,只配置升级站点即可。

4. 创建 python 自动化项目

4.1 新建 item

点击 jenkins 首页面的新建 Item

在打开的页面中输入项目名称,选择 Freestyle project(自由风格项目),再点击确认,进入项目配置页面。

4.2 General 配置

General 配置中有很多选项,每个选项的后面有问号,点击会介绍当前选项的作用,都是见名思议,后面的配置也是如此。

为了学习简单,我们演示的项目配置为本地项目。点击高级,选中使用自定义的工作空间,在目录中填入项目的根目录绝对路径。

这个目录就是工作空间目录,后面很多配置都是以这个路径为标准使用相对路径来配置。

4.3 源码管理

我们这里配置了自定义工作空间,这里就勾选无,如果是想配置 Git 管理的远程仓库就勾选 Git。

勾选了远程仓库 jenkins 会从仓库下载代码到本地工作空间,默认在 .jenkins\workspace 下以项目名作为名字的文件夹中。

4.4 构建触发器

所谓触发器就是设置自动运行项目的条件。有多种方式,这里我们选择使用定时构建。

勾选 Build periodically,点击问号有设置详细说明

我们设置日程表为 H 23 * * *,表示每天晚上 23 点到 24 点间随机一个时间进行构建。插件推荐使用 H 来模糊指定,而不是精确指定具体时间,造成构建任务过于集中。

4.5 构建环境

我们当前的项目不需要额外的构建环境,为了在控制台中显示时间戳,可以勾选 Add timestamps to the Console Output,其他的按需设置。

4.6 构建

构建就是启动项目,其实本质上就是启动项目执行的命令。点开增加构建步骤按钮后,会出现多个选项


对于 python 项目来说,一般只会用到两个:

  1. Execute Windows batch command 执行 windows 批处理命令
  2. Execute shell 执行 shell 命令(mac,linux)

这里我们选择执行 windows 批处理命令,然后在输入框中输入启动项目的命令,可以执行多条命令。注意,这里的命令当前路径为工作空间。

这样,一个 python 项目的基本配置就完成了,点击保存。然后点击项目管理首页左侧的 BuildNow 进行第一次构建,检查配置是否正确。

构建完成后,结果是否正确,会在构建序号前通过不同颜色的小球来表示,蓝色表示成功,红色表示失败,黄色表示警告,这个跟构建命令的方式有关。


点击构建序号,进入具体构建的管理页面,可以查看控制台输出,查看日志来调试。

5. 配置 HTML 报告

如果你的项目单独生成了 HTML 格式的报告,想要在 jenkins 上发布报告需要安装 HTML 发布插件。

5.1 安装 HTML Publisher 插件

点击 Manage Jenkins > Manage Plugins > 可选插件,搜索 HTML,选择 HTML Publisher,点击 install without restart


开始安装

如果前面升级镜像配置 ok,然后人品够好的话,很快就安装好了

5.2 配置 HTML Publisher 插件

进入对应项目管理页面,点击配置 > 构建后操作 > 增加构建后操作步骤,在打开的弹框中选择 Publish HTML reports

点击新增

然后在 HTML directory to archive 中填写 HTML 报告的相对路径(相对工作空间)

再在**Index page[s]**中填写报告文件名,可以填写具体报告文件名,也可以使用 Ant patterns

这里我们填写***.html**表示所有的 HTML 为后缀的文件。

最后保存配置。

5.3 查看 HTML 报告

再次构建项目,然后刷新项目管理页面,会在工作区上多了一个 HTML Peport 的选项,点击即可查看 HTML 报告

5.4 配置 csp

我们会发现 HTML 报告中的样式丢失了,原因是 Jenkins 中的 CSP(Content Security Policy,内容安全策略)的默认配置为一个非常严格的权限集,以防止 Jenkins 用户受到恶意的 HTML/JS 文件的攻击。

默认,该权限集会设置为:

 sandbox; **default**-src 'none'; img-src 'self'; style-src 'self';

在这个配置下,只允许加载:

  1. Jenkins 服务器上托管的 css/js 文件
  2. Jenkins 服务器上托管的图片文件

如下形式的内容都会被禁止:

  1. JavaScript
  2. plugins
  3. HTML 中的内联样式,以及引用外站的 CSS 文件
  4. HTML 中的内联图片
  5. frames
  6. Web fonts
  7. AJAX
  8. ...

非常严格,所以我们的 HTML 报告没法正常展示样式了。

要解决该问题,就是修改 csp 的默认配置。

我们有两种方案来解决这个问题:

5.4.1 临时解决

进入 Mange Jenkins > Script console

输入如下命令,并点击运行

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

如果出现 resut 表示执行成功

再次进行构建,新生成的 HTML 报告就可以正常展示样式了。注意之前构建生成的 HTML 报告依旧无效。且 jenkins 服务重启后,csp 会恢复默认。

5.4.2 永久解决

当前 jenkins 没有提供配置来解决此问题,我们只有在每次启动 Jenkins 时重新修改该安全策略。windows 下 jenkins 安装目录下有一个 jenkins.xml 文件(其他方式请查找对应的配置文件),

里面包含 jenkins 启动命令,我们可以在 <arguments> 标签中添加 csp 的设置参数,注意设置在 -jar 之前,改之前记得备份这个文件,防止修改错误。


在临时方案中我们修改了 csp 为空,表示关闭了内容安全策略,这其实存在很大的安全隐患,正确的做法,我们应该结合项目的实际情况,选择对应的安全策略。例如,我们的 HTML 报告中使用了百度的 cdn 加速,所以需要配置运行加载对应域名的 CSS 样式,所以配置如下:

-Dhudson.model.DirectoryBrowserSupport.CSP="sandbox; style-src 'self' libs.baidu.com;"

除此之外,csp 还有很多精细的配置,详细配置可参考Content Security Policy Reference

配置好后,重启服务,如果出现启动失败,检查是否配置错误,前后空格,表点符号。完整的 arguments 的配置如下:

  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dhudson.model.DirectoryBrowserSupport.CSP="sandbox; style-src 'self' libs.baidu.com;" -jar "D:\Program Files\Jenkins\jenkins.war" --httpPort=9090 --webroot="D:\Program Files\Jenkins\war"</arguments>

注意:不要复制里面的 war 文件,webroot 的路径,要结合你自己的项目。

按照这种方案重启后,所有的 HTML 报告样式都可以正常显示。

如果是下载我提供的免安装版的 jenkins,修改目录下的 config.yaml 文件中的 csp 配置即可


5.4.3 通过 jenkins 插件实现

  1. 安装插件 Startup Trigger: 可实现在 Jenkins 节点(master/slave)启动时触发构建

  2. 安装插件 Groovy plugin: 可实现直接执行 Groovy 代码

  3. 来到任务配置页面在“构建触发器(Build Triggers)”模块,选择“Buildwhen job nodes start”选项

  4. 在“构建(Build)”模块,选择“Execute system Groovy script”,执行如下 Groovy 命令:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")


  5. 保存配置,重新构建生效

6. 配置邮件

构建后,我们往往需要通过发邮件的形式通知相应人员。jenkins 的默认的邮件只有构建失败时才会发送邮件,且不支持自定义邮件内容。所以需要安装插件**Email Extension Plugin**,然后配置邮件

6.1 配置管理员邮箱

进入 Manage Jenkins>Configure System> 系统管理员邮件地址,填写你用来发送邮件的邮箱。

6.2 配置 jenkins 默认邮件通知

继续往下滚动到最后,配置邮件通知,点击高级展开所有选项,详细配置如下:

配置好后,点击最下面的通过发送测试邮件测试配置来检查是否配置成功。


如果能够收到邮件表示邮件通知配置成功。现在先保存一下。

6.3 配置 Email Extension Plugin

进入 Manage Jenkins>Configure System>Extended E-mail Notification,同样点击高级展开高级配置选项,详细配置如下:

往下翻到最后有一个触发配置,默认是失败触发,

点击按钮展开配置,选择 always

保存。

6.4 在项目中配置发送邮件

进入项目配置页面,点击增加构建后操作步骤,选择 Editable Email Notification

配置发件邮箱和收件邮箱,收件邮箱如果有多个可以用逗号隔开

保存后,构建测试测试是否发送邮件。如果不成功,可以在构建日志中查看失败原因,然后重复上面的步骤。

6.5 发送 HTML 格式内容的邮件

Email Extension Plugin 插件支持 HTML 格式的内容。

再次进入项目配置页面,来到邮件服务配置项,设置 Content Type 为 HTML

然后在 Default Content 可以写入 HTML 模板,并且模板中可以使用 jenkins 对应的环境变量。

例如我使用的模板效果如下: