持续集成-交付-发布
**作者:行癫(盗版必究)**
------
## 一:CI/CD
#### 1.为什么要 CI / CD 方法简介
软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少基于有缺陷或失败的先前版本开发新代码的机会。这种方法有三种主要方法,每种方法都根据最适合您的策略进行应用
持续集成(Continuous Integration, CI): 代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈
持续交付(Continuous Deployment, CD): 部署到测试环境、预生产环境
持续部署(Continuous Delivery, CD): 将最终产品发布到生成环境、给用户使用
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/0WaK2RCAIQn6ytKwCxHoeQ.png)
#### 2.理解持续集成、持续交付、持续部署
###### 持续集成:
持续集成(英语:Continuous integration,缩写为 CI),一种软件工程流程,将所有工程师对于软件的工作复本,每天集成数次到共用主线(mainline)上
持续集成主要是强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。简单来讲就是:频繁地(一天多次)将代码集成到主干
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/YBxLswP38Pz6opB-CfVT-A.png)
持续集成目的在产生以下效益:
及早发现集成错误且由于修订的内容较小所以易于追踪,这可以节省项目的时间与成本
避免发布日期的前一分钟发生混乱,当每个人都会尝试为他们所造成的那一点点不兼容的版本做检查
当单元测试失或发生错误,若开发人员需要在不除错的情况下还原代码库到一个没有问题的状态,只需要放弃一小部分的更改
让 "最新" 的程序可保持可用的状态供测试、展示或发布用
频繁的提交代码会促使开发人员创建模块化,低复杂性的代码
###### 持续交付:
持续交付(英语:Continuous delivery,缩写为 CD),是一种软件工程手法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况
它的目标在于让软件的建置、测试与释出变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/llhsWI4PyQP79NHPB6qpgA.png)
###### 持续部署:
持续部署(英语:Continuous Deployment,缩写为 CD),是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境
有时候,持续部署也与持续交付混淆。持续部署意味着所有的变更都会被自动部署到生产环境中。持续交付意味着所有的变更都可以被部署到测试环境中,但是出于业务考虑,可以选择不部署。如果要实施持续部署,必须先实施持续交付
持续部署即在持续交付的基础上,把部署到生产环境的过程自动化
## 二:Jenkins CI/CD
#### 1.Jenkins CI/CD 流程图
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/eBMhIj4AgzudBm3Fs4383Q.png)
注意:
上线之前先把代码git到版本仓库,然后通过Jenkins 如Java项目通过maven去构建,这是在非容器之前,典型的自动化的一个版本上线流程
它的测试环境,预生产环境,测试环境。会存在一定的兼容性问题
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/1vyHfJuYufXHSqOJjxghtw.png)
注意:
这里有一个docker harbor 的镜像仓库,通常会把你的环境打包为一个镜像,通过镜像的方式来部署
#### 2.Jenkins 介绍
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/7qiG4RjufBF6q708fXRwWg.png)
Jenkins 是一个用Java编写的开源的持续集成工具。在与Oracle发生争执后,项目从Hudson项目独立
Jenkins 提供了软件开发的持续集成服务。Jenkins是在MIT许可证下发布的自由软件
###### Jenkins 功能:
持续的软件版本发布/测试项目
监控外部调用执行的工作
###### Jenkins 概念:
Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台。这是一个免费的开源项目,可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允许持续集成
###### Jenkins 目的:
持续、自动地构建/测试软件项目
监控软件开放流程,快速问题定位及处理,提提高开发效率
###### Jenkins 特性:
开源的java语言开发持续集成工具,支持CI,CD
易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理
消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告
分布式构建:支持Jenkins能够让多台计算机一起构建/测试
文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等
丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等
#### 3.产品发布流程
产品设计成型 -> 开发人员开发代码 -> 测试人员测试功能 -> 运维人员发布上线
#### 4.Jenkins实验环境
| 主机名 | ip地址 | 服务 |
| :----------: | :-------: | :-----: |
| cicd-jenkins | 10.0.1.87 | jenkins |
| cicd-gitlab | 10.0.1.86 | gitlab |
| cicd-web | 10.0.1.88 | web |
#### 5.Jenkins安装使用
注意:新版的jenkins需要的jdk版本为11.如果出现以下报错解决方案
```shell
报错:
AWT is not properly configured on this server. Perhaps you need to run your container with “-Djava.awt.headless=true”? See also: https://jenkins.io/redirect/troubleshooting/java.awt.headless
解决方案:
yum install dejavu-sans-fonts
yum install fontconfig
yum install xorg-x11-server-Xvfb
```
下载 java(直接从内部服务器下载):
```shell
[root@jenkins ~]# wget https://download.oracle.com/otn/java/jdk/8u251-b08/3d5a2bb8f8d4428bbe94aed7ec7ae784/jdk-8u251-linux-x64.tar.gz
```
安装java:
```shell
[root@jenkins ~]# tar xf jdk-8u251-linux-x64.tar.gz -C /usr/local/
[root@jenkins ~]# cd /usr/local/
[root@jenkins ~]# ln -s jdk1.8.0_251/ java
```
下载 maven(从内部服务器下载):
```shell
[root@jenkins ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
```
解压安装:
```shell
[root@jenkins ~]# tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
[root@jenkins ~]# cd /usr/local/
[root@jenkins ~]# ln -s apache-maven-3.6.3/ maven
```
添加环境变量:
```shell
[root@jenkins ~]# vim /etc/profile
JAVA_HOME=/usr/local/java
MAVEN_HOME=/usr/local/java/maven
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL JAVA_HOME MAVEN_HOME
[root@jenkins-server ~]# source /etc/profile
```
验证 java 和 maven 安装:
```shell
[root@jenkins ~]# java -version
java version "13.0.2" 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
[root@jenkins ~]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 13.0.2, vendor: Oracle Corporation, runtime: /usr/local/jdk-13.0.2
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
```
安装tomcat:
```shell
[root@jenkins ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz
[root@jenkins ~]# tar xzf apache-tomcat-8.5.42.tar.gz -C /usr/local/
[root@jenkins ~]# cd /usr/local/
[root@jenkins local]# mv apache-tomcat-8.5.42/ tomcat
```
下载jenkins的安装包:
```shell
[root@jenkins-server ~]# wget http://updates.jenkins-ci.org/download/war/2.187/jenkins.war
```
部署jenkins:
```shell
[root@jenkins-server ~]# cd /usr/local/tomcat/webapps/
[root@jenkins-server webapps]# rm -rf *
[root@jenkins-server webapps]# cp /root/jenkins.war .
[root@jenkins-server webapps]# ./bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
```
登录jenkins web管理界面:
```shell
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
5d3f57bea6e546139fc48ea28f9d5ae5
```
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/LqMyfFJ8yikl8MXGGT34GA.png)
以下是可选操作:
修改 /var/lib/jenkins/updates/default.json:
jenkins 在下载插件之前会先检查网络连接,其会读取这个文件中的网址。默认是:www.google.com
访问谷歌,这就很坑了,服务器网络又不能 FQ,所以将图下的google改为[www.baidu.com](http://www.baidu.com/)即可,更改完重启服务
```shell
{"connectionCheckUrl":"http://www.baidu.com/","core":{"buildDate":"Dec 02, 2020","name":"core","sha1":"fMwDSSmyX9SkyDzqpqhd2EjOUy4=","sha256":"Du3rKxGjJyastX2ybiYrGSPPQI6EcIuvRx47U0Yu1vE=","url":"https://updates
.......
```
修改/var/lib/jenkins/hudson.model.UpdateCenter.xml:
该文件为jenkins下载插件的源地址,改地址默认jenkins默认为:https://updates.jenkins.io/update-center.json,就是因为https的问题,此处我们将其改为http即可,之后重启jenkins服务即可
其他国内备用地址(也可以选择使用):
```shell
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.esuni.jp/jenkins/updates/update-center.json
```
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/VJnJuX0UtAAq4MI5ErJxVA.png)
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/UE7pdxoWLdHQT7kSZVJnrg.png)
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/T5oHqFkQJyXk1uCy4Wqlsg.png)
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/ExigZjVs8eZyJhPLjrNAWw.png)
## 三:Jenkins使用
#### 1.Jenkins 用户权限管理
用户管理背景:
针对开发、运维、测试针对不同角色进行不同权限划分
基于插件:
Role-based Authorization Strategy
Authorize Project
#### 2.安装用户管理插件
系统管理->管理插件-可选插件->搜索该插件选中直接安装即可
#### 3.开启该插件功能
系统管理->全局安全设置-授权策略->选中该插件功能即可->保存
#### 4. 验证用户管理
注册一个新用户:
新用户登录验证:
注意:
如果开启匿名用户所有权限可以看到具体的内容
如果看到访问被拒绝,是因为使用的是Role-Based-Strategy的授权策略
#### 5.用户权限划分
安装 Role-Based Strategy 插件后,系统管理 中多了如图下所示的一个功能,用户权限的划分就是靠他来做的
Manage Roles(管理角色):
Manage Roles:管理角色,相当于针对角色赋予不同权限,然后在将该角色分配给用户
角色就相当于一个组。其里面又有Global roles(全局)、item roles(项目)、node roles(节点),来进行不同划分
Global roles (全局角色):管理员等高级用户可以创建基于全局的角色
Item roles(项目角色):针对某个或者某些项目的角色
node roles(节点角色):节点相关的权限
Global roles:
默认是有一个admin用户的,是所有权限都有的,所有权限都是勾选了的
接下来我们来添加一个角色:baseRole
baseRole :该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins访问权限
注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
Project roles:
roles to add:表示项目角色
Pattern:是用来做正则匹配的(匹配的内容是Job(项目名)),比如说根据正则匹配到的项目项目角色就都有权限
接下来新建项目角色,改项目角色一般给其构建、取消、读取、读取空间权限,一般配置这4个即可
demo :该角色为项目角色。使用正则表达式绑定 “demo.",意思是只能操作 demo 开头的项目
web :该角色也为项目角色。绑定 "web.”,意思是只能操作 web 开头的项目
node roles:
node roles(节点角色):节点相关的权限
roles to add:表示项目角色
Pattern:是用来做正则匹配的(匹配的内容是节点(slave节点)),比如说根据正则匹配到的项目项目角色就都有权限
将diandian用户绑定全局和项目权限:
diandian用户查看:
#### 6.Jenkins 参数化构建
参数化构建背景:
如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建过程中有更多功能,比如说:选择性构建、传参、项目指定变量等等其他功能,基础的参数化构建可以实现一些简单功能,但是要想使用更多功能这时候我们就需要借助参数化构建来实现交互的功能
借助以下插件来进行实现:
Extended Choice Parameter(更丰富的参数化构建插件)
Git Parameter
安装插件:
Extended Choice Parameter
Git Paramete
![image-20220626142500087](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/image-20220626142500087.png)
项目配置:
参数配置:
这里这个branch 就相当于给其当做一个变量,然后来为其进行传参:
![](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/image-20220626144229208.png)
构建选择执行shell进行测试:
参数化配置已经生效:
构建 test2:
可以发现控制台的输出也是成功了的
#### 7.数据来源选择文件
在jenkins所在服务器进行如下操作:
```shell
[root@qfedu.com ~]# vim /opt/jenkins.property # 建立一个文件
abc=t1,t2,t3,t4
```
web 端配置:
![img](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/0USIqGXVd0iujSq_YmjGHg.png)
进行测试:
构建后查看结果:(也是成功的)
![image-20220626145443936](%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90-%E4%BA%A4%E4%BB%98-%E5%8F%91%E5%B8%83.assets/image-20220626145443936.png)