企业级CI/CD 持续集成/交付/发布
一,CI/CD方法简介
持续集成(Continuous Integration, CI): 代码合并,构建,部署,测试都在
一起,不断地执行这个过程,并对结果反馈。
持续交付(Continuous Deployment, CD): 部署到测试环境、预生产环境。
持续部署(Continuous Delivery, CD): 将最终产品发布到生成环境、给用户使用。
二,持续集成、持续交付、持续部署介绍
1,持续集成
持续集成(英语:Continuous integration,缩写为 CI),一种软件工程流程,
将所有工程师对于软件的工作复本,每天集成数次到共用主线(mainline)上。
持续集成主要是强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。
根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。简单来
讲就是:频繁地(一天多次)将代码集成到主干。
2,持续交付
持续交付(英语:Continuous delivery,缩写为 CD),是一种软件工程手法,
让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持
在随时可以释出的状况。
它的目标在于让软件的建置、测试与释出变得更快以及更频繁。这种方式可以减
少软件开发的成本与时间,减少风险。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的
「类生产环境」(production-like environments)中。比如,我们完成单元
测试后,可以把代码部署到连接数据库的Staging 环境中更多的测试。如果代
码没有问题,可以继续手动部署到生产环境中。
3,持续部署
持续部署(英语:Continuous Deployment,缩写为 CD),是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
有时候,持续部署也与持续交付混淆。持续部署意味着所有的变更都会被自动部
署到生产环境中。持续交付意味着所有的变更都可以被部署到测试环境中,但是
出于业务考虑,可以选择不部署。如果要实施持续部署,必须先实施持续交付。
持续部署即在持续交付的基础上,把部署到生产环境的过程自动化。
注意:
CI/CD(持续集成/持续交付和持续部署)
等同
CI/CD(持续集成/持续发布)
三,jenkins CI/CD 流程
说明:上线之前先把代码git到版本仓库,然后通过Jenkins 如Java项目通过
maven去构建,这是在非容器之前,典型的自动化的一个版本上线流程.(存在
环境依赖问题)
说明:这里有一个docker harbor 的镜像仓库,通常会把你的环境打包为一个镜像,
通过镜像的方式来部署(解决环境依赖问题)。
1,jenkins介绍
Jenkins 是一个用Java编写的开源的持续集成工具。在与Oracle发生争执后,项目
从Hudson项目独立。
Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是
什么平台。这是一个免费的开源项目,可以处理任何类型的构建或持续集成。集
成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允许持续集成。
Jenkins 提供了软件开发的持续集成服务。它运行在Servlet容器中(例如Apache
Tomcat)。它支持软件配置管理(SCM)工具(包括AccuRev SCM、CVS、
Subversion、Git、Perforce、Clearcase和RTC),可以执行基于Apache Ant和
Apache Maven(软件包管理工具)的项目,以及任意的Shell脚本和Windows批处
理命令。Jenkins的主要开发者是川口耕介。Jenkins是在MIT许可证下发布的自由
软件。
2,jenkins的功能
持续的软件版本发布/测试项目。
监控外部调用执行的工作。
持续、自动地构建/测试软件项目。
监控软件开放流程,快速问题定位及处理,提提高开发效率。
3,jenkins特性
开源的java语言开发持续集成工具,支持CI,CD。
易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现
安装部署,可方便web界面配置管理。
消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通
过e-mail通知,生成JUnit/TestNG测试报告。
分布式构建:支持Jenkins能够让多台计算机一起构建/测试。
文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的
jar等。
4,产品发布流程
产品设计成型 -> 开发人员开发代码 -> 测试人员测试功能 -> 运维人员发布上线
持续集成(Continuous integration,简称CI)
持续交付(Continuous delivery)
持续部署(continuous deployment)
四,jenkins实验环境安装使用
操作系统:CentOS7
主机名 | ip | 服务 |
---|---|---|
cicd-jenkins | 10.0.1.86 | jenkins |
cicd-gitlab/github | 10.0.1.87 | gitlab/github |
cicd-web | 10.0.1.88 | web |
1,下载并解压安装jdk(tomcat,maven运行需要借助jak)
官方文档下载地址:https://www.oracle.com/java/technologies/javase/
jdk17-archive-downloads.html
[root@192 ~]#wget https://download.oracle.com/java/17/archive/jdk-17.0.3.1_linux-aarch64_bin.tar.gz
[root@192 ~]#tar xf jdk-17.0.3.1_linux-aarch64_bin.tar.gz -C /usr/local
[root@192 ~]#mv /usr/local/jdk-17.0.3.1 /usr/local/java
2,下载并解压tomcat
官方文档下载地址:(https://tomcat.apache.org/download-80.cgi)
[root@192 ~]#wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78.tar.gz
[root@192 ~]#tar xzf apache-tomcat-8.5.78.tar.gz -C /usr/local/
[root@192 ~]#mv /usr/local/apache-tomcat-8.5.78 /usr/local/tomcat
3,下载并解压安装maven
下载maven并解压安装
官方文档下载地址https://archive.apache.org/dist/maven/binaries/
[root@192 ~]#wget https://archive.apache.org/dist/maven/binaries/apache-maven-3.0.3-bin.tar.gz
[root@192 ~]#tar xfz apache-maven-3.0.3-bin.tar.gz -C /usr/local
[root@192 ~]#cd /usr/local
[root@192 ~]#mv apache-maven-3.0.3 maven
4,设置环境变量
[root@192 ~]#vim /etc/profile
JAVA_HOME=/usr/local/java
MAVEN_HOME=/usr/local/maven
PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
export JAVA_HOME MAVEN_HOME PATH
[root@192 ~]#source /etc/profile
5,验证java和maven安装
[root@192 ~]# java -version
java version "17.0.3.1"
...
[root@192 ~]#mvn -version
...
version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"
6,下载并解压jenkins安装包(注意是一个war包)
官方文档下载地址:https://www.jenkins.io/zh/download/
[root@192 ~]#wget http://mirrors.jenkins.io/war-stable/2.332.3/jenkins.war
[root@192 ~]#rm -rf /usr/local/tomcat/webapps/*
[root@192 ~]# cp jenkins.war /usr/local/tomcat/webapps/ #网站目录更换jenkins.war
7,打开tomcat8009通信端口
[root@192 ~]#vim /usr/local/tomcat/conf/server.xml
117行 <Connector protocol="AJP/1.3"
118 address="::1"
119 port="8009"
120 redirectPort="8443" />
[root@192 ~]#/usr/local/tomcat/bin/starup.sh 启动tomcat
[root@192 ~]#ss -lntp |grep 80
LISTEN 0 100 :::8080 :::* users:(("java",pid=112454,fd=52))
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=112454,fd=154))
LISTEN 0 100 ::1:8009 :::* users:(("java",pid=112454,fd=57))
注意:三个端口都出现,表示服务已经完成启动
8,登录jenkins web管理界面(192.168.222.129:8080)
[root@192 ~]#cat /var/lib/jenkins/secrets/initialAdminPassword
5d3f57bea6e546139fc48ea28f9d5ae5
接下来就是设置admin账户和密码,以及邮箱账号,然后就直接登录了
五,jenkins用户权限管理
1,用户管理背景
针对开发、运维、测试针对不同角色进行不同权限划分,
基于插件:
Role-based Authorization Strategy
Authorize Project
2, 安装用户管理插件
安装该插件:
系统管理->管理插件-可选插件->搜索该插件选中直接安装即可。
系统管理-配置全局安全性-安全域(选择第二个)
系统管理-配置全局安全性-授权策略(选择第四个)
系统管理-配置全局安全性-管理分配角色
3,配置全局安全性
系统管理-配置全局安全性-安全域(选择第二个)
系统管理-配置全局安全性-授权策略(每一个策略代表的权限都有所差异,根据需求选择)
4,注册一个新用户
系统管理-配置全局安全性-安全域(选择第二个不变)
系统管理-配置全局安全性-授权策略(选择第三个)
系统管理-用户列表-新建用户
重新打开一个网页登录授权的普通用户账号密码
5,开启 Role-Based Strategy
6,重新用 test1 用户登录显示已经没有任何权限
六,用户权限划分
安装 Role-Based Strategy 插件后,系统管理 中多了如图下所示的一个功能,
用户权限的划分就是靠它来做的。
1,Manage Roles(管理角色)
Manage Roles:管理角色,相当于针对角色赋予不同权限,然后在将该角色分配给用户。
角色就相当于一个组。其里面又有Global roles(全局)、item roles(项目)、node roles(),来进行不同划分。
Global roles (全局角色):管理员等高级用户可以创建基于全局的角色
Item roles(项目角色):针对某个或者某些项目的角色
node roles(节点角色):节点相关的权限
2,Global roles
默认是有一个admin用户的,是所有权限都有的,所有权限都是勾选了的。
接下来我们来添加一个角色:baseRole
baseRole :该角色为全局角色。这个角色需要绑定Overall下面的Read权限,
是为了给所有用户绑定最基本的Jenkins访问权限。
注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing
the Overall/Read permission
3,Project roles
roles to add:表示项目角色
Pattern:是用来做正则匹配的(匹配的内容是Job(项目名)),比如说根据正则
匹配到的项目项目角色就都有权限;
接下来新建项目角色,改项目角色一般给其构建、取消、读取、读取空间权限,
一般配置这4个即可
demo :该角色为项目角色。使用正则表达式绑定 “demo.",意思是只能操作
demo 开头的项目。
web :该角色也为项目角色。绑定 "web.”,意思是只能操作 web 开头的项目。
4,node roles
node roles(节点角色):节点相关的权限
roles to add:表示项目角色
Pattern:是用来做正则匹配的(匹配的内容是节点(slave节点)),比如说根据
正则匹配到的项目项目角色就都有权限;
在jenkins创建中创建两个用户:user1 user2
在jenkins创建2个空白项目: menu-1 app-1
user1用户上面只能看到menu-1项目,user2用户上只能看到app-1项目
温馨提示: 针对以上的勾选的全局权限和项目权限都可以多尝试进行操作熟悉,便可观察到它对应的功能模块
5,创建可以登录的用户
在jenkins创建中创建两个用户:user1 user2
在jenkins创建2个空白项目: menu-1 app-1
user1用户上面只能看到menu-1项目,user2用户上只能看到app-1项目
6,给用户分配角色
在jenkins创建中创建两个用户:user1 user2
在jenkins创建2个空白项目: menu-1 app-1
user1用户上面只能看到menu-1项目,user2用户上只能看到app-1项目
7,user1用户登录,只能看到menu-1项目
8,user2用户登录,只能看到app-1项目
七:Jenkins 参数化构建
1,参数化构建背景
如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建
过程中有更多功能,比如说:选择性构建、传参、项目指定变量等等其他功能,
基础的参数化构建可以实现一些简单功能,但是要想使用更多功能这时候我们就
需要借助参数化构建来实现交互的功能。此处我们来借助以下插件来进行实现:
Extended Choice Parameter(更丰富的参数化构建插件)
Git Parameter
2,安装插件
1,首先还是安装该插件,去管理插件里面进行安装
Extended Choice Parameter
2,选择安装过的插件
参数化配置,这里这个branch 就相当于给其当做一个变量,然后来为其进行传参
构建选择执行shell进行测试
参数配置已经生效
构建app-1,发现控制台输出是成功的
八,数据来源选择文件
在jenkins所在服务器进行如下操作:
[root@jenkins ~]# vim /opt/jenkins.property # 建立一个文件
abc=t1,t2,t3,t4
web 端配置:
进行测试:
构建前:(可以发现也是生效的)
构建后查看结果:(也是成功的)