1)首先,开发人员每天进行代码提交,提交到Git仓库
2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。
服务器列表
虚拟机统一采用CentOS7。
Gitlab简介
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab和GitHub一样属于第三方基于Git开发的作品,免费且开源(基于MIT协议),与Github类似,可以注册用户,任意提交你的代码,添加SSHKey等等。不同的是,
GitLab是可以部署到自己的服务器上,数据库等一切信息都掌握在自己手上,适合团队内部协作开发,
你总不可能把团队内部的智慧总放在别人的服务器上吧?
简单来说可把GitLab看作个人版的GitHub。
Gitlab安装
yum -y install policycoreutils openssh-server openssh-clients postfix
2. 启动ssh服务&设置为开机启动
systemctl enable sshd && sudo systemctl start sshd
systemctl enable postfix
firewall-cmd --add-service=ssh --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
链接:https://pan.baidu.com/s/1OaP_x1DaovJLuc518zurqQ
提取码:yyds
将下载的安装包上传到服务器上进行安装(需要大概1-2分钟):
rpm -ivh gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
6. 修改gitlab配置
从控制台可以发现,/etc/gitlab/gitlab.rb文件我们需要修改gitlab外部访问的url
vi /etc/gitlab/gitlab.rb
修改gitlab访问地址(当前安装gitlab服务器的ip)和端口默认为80,我们改为82
external_url 'http://192.168.10.11:82'
nginx['listen_port'] = 82
7. 重载配置及启动gitlab(大概需要3-4分钟)
gitlab-ctl reconfigure
gitlab-ctl restart
8.把端口添加到防火墙(如果防火墙关闭了,默认不需要执行以下命令)
firewall-cmd --zone=public --add-port=82/tcp --permanent
firewall-cmd --reload
启动成功后,访问:192.168.10.11:82
出现以上界面,我们稍微等等
看到以下修改管理员root密码的页面,修改密码后(密码自己决定),然后登录即可,我这里修改为root123456
登录进入
我们使用超管的账号 添加组、创建用户、创建项目
1)创建组
使用管理员 root 创建组,一个组里面可以有多个项目分支,可以将开发添加到组里面进行设置权限,不同的组就是公司不同的开发项目或者服务模块,不同的组添加不同的开发即可实现对开发设置权限的管理
我们可以在zhgd_group创建一个项目
这样的话,我们就在zhgd_group组下创建一个web_demo项目
接下来我们可以创建一个用户zhngsan,将这个用户分配到这个zhgd_group组下
2)创建用户
创建用户的时候,可以选择Regular或Admin类型。
创建完用户后,立即修改密码
3)将用户添加到组中
选择某个用户组,进行Members管理组的成员
Gitlab用户在组里面有5种不同权限:
Guest:可以创建issue、发表评论,不能读写版本库
Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限
Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权限
Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组组长可以赋予这个权限
4)在用户组中创建项目
以刚才创建的新用户身份登录到Gitlab,然后在用户组中创建新的项目
注意,创建用户然后用户第一次登录之后,Gitlab还是会弹出让此用户修改密码的界面,我们可以不进行修改,输入原始已经设置好的密码
源码上传到Gitlab仓库
下面来到IDEA开发工具,我们已经准备好一个简单的Web应用准备到集成部署。我们要把源码上传到Gitlab的项目仓库中。
1)项目结构说明
我们建立了一个非常简单的web应用,只有一个index.jsp页面,如果部署好,可以访问该页面就成功啦!
2)开启版本控制
2)提交代码到本地仓库
先Add到缓存区
再Commit到本地仓库
3)推送到Gitlab项目仓库中
输入gitlab的用户名和密码,然后就可以把代码推送到远程仓库啦
刷新gitlab项目
以上的操作我们就将gitLab安装在192.168.10.11的虚拟机上,并且成功的将本地的项目提交到gitLab上
接下来我们在 192.168.10.129的虚拟机上安装持续集成环境jenkins
1)安装JDK
Jenkins需要依赖JDK,所以先安装JDK1.8
安装过程可以参考文章:
https://www.cdsy.xyz/computer/system/linux/231210/cd46767.html
2)获取jenkins安装包
下载页面:https://jenkins.io/zh/download/
安装文件:jenkins-2.190.3-1.1.noarch.rpm
由于jenkins官网访问较慢,提供百度网盘资源
链接:https://pan.baidu.com/s/1Ab-tst8oDoXFU_XkHQkbxQ
提取码:yyds
3)把安装包上传到192.168.10.129服务器的soft目录,进行安装
rpm -ivh jenkins-2.190.3-1.1.noarch.rpm
4)修改Jenkins配置
vi /etc/syscofig/jenkins
修改内容 账号和默认端口:
JENKINS_USER="root"
JENKINS_PORT="8888"
5)启动Jenkins
systemctl start jenkins
启动时若提示下述内容,则表示启动失败
Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.
可查看文章:
https://www.cdsy.xyz/computer/servers/ns/231211/cd46829.html
解决方法:
我们按照提示输入命令,进行失败原因查看:
systemctl status jenkins.service
我们可以看出jenkins没有找到java文件,需要自己把java文件地址复制过去
vi /etc/init.d/jenkins
手动输入对应服务器中的java路径(这个路径是安装jdk的路径,同时 后缀附上/bin/java):
/usr/local/java/jdk1.8.0_171/bin/java
systemctl daemon-reload
然后重启jenkis
systemctl start jenkins
接下来我们再启动jenkins,就可以成功了。
6)打开浏览器访问
http://192.168.10.129:8888
注意:本服务器把防火墙关闭了,如果开启防火墙,需要在防火墙添加端口
提示我们需要在指定目录下查找 安装jenkins之后的admin的账号密码
密码就是:
e0701266541149ce88b64d79b5750e25
7)获取并输入admin账户密码
cat /var/lib/jenkins/secrets/initialAdminPassword
8)跳过插件安装
因为Jenkins插件需要连接默认官网下载,速度非常慢,而且经过会失败,所以我们暂时先跳过插件安装
9)添加一个管理员账户,并进入Jenkins后台
用户名密码: wusong/123456
开始使用Jenkins
持续集成环境(2)-Jenkins插件管理
Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用。例如从Gitlab拉取代码,使用Maven构建项目等功能需要依靠插件完成。接下来演示如何下载插件。
修改Jenkins插件下载地址
Jenkins国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址:
Jenkins->Manage Jenkins->Manage Plugins,点击Available
这样做是为了把Jenkins官方的插件列表下载到本地,接着修改地址文件,替换为国内插件地址
cd /var/lib/jenkins/updates
default.json文件记录着从官网下载的所有插件地址,但是这些地址都是国外的,下载速度非常慢,我们将这些国外的地址修改为国内的下载地址
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
最后,Manage Plugins点击Advanced,把Update Site改为国内插件下载地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
Sumbit后,在浏览器输入: http://192.168.10.129:8888/restart ,重启Jenkins。
下载中文汉化插件
Jenkins->Manage Jenkins->Manage Plugins,点击Available,搜索"Chinese"
完成后如下图:
勾选之后,刷新页面
重启Jenkins后,就看到Jenkins汉化了!(PS:但可能部分菜单汉化会失败)
持续集成环境(3)-Jenkins用户权限管理
我们可以利用Role-based Authorization Strategy 插件来管理Jenkins用户权限
安装Role-based Authorization Strategy插件,在安装此插件之前,建议将Jenkins更新到最新版本,否则安装Role-based Authorization Strategy插件可能会失败
开启权限全局安全配置
授权策略切换为"Role-Based Strategy",保存
创建角色
在系统管理页面进入 Manage and Assign Roles
点击"Manage Roles"
Global roles(全局角色):管理员等高级用户可以创建基于全局的角色
Item roles(项目角色):针对某个或者某些项目的角色
Node roles(奴隶角色):节点相关的权限
我们添加以下三个角色:
baseRole:该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins访问权限。
注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
role1:该角色为项目角色。使用正则表达式绑定"itcast.*",意思是角色role1可以访问操作itcast开头的项目。
role2:该角色也为项目角色。绑定"itheima.*",意思是角色role2可以访问操作itheima开头的项目。
创建baseRole全局角色
创建role1和role2两个项目角色
保存。
创建用户
在系统管理页面进入 Manage Users
分别创建两个用户:jack和eric,他们的密码都是123456
给用户分配角色
以上创建的两个用户是没有任何角色的,也就是说没有任何权限,我们使用账号登录jenkins之后,页面是没有任何的资源可以访问的。
系统管理页面进入Manage and Assign Roles,点击Assign Roles
绑定规则如下:
eric用户分别绑定baseRole和role1角色
jack用户分别绑定baseRole和role2角色
保存。
创建项目测试权限
以wusong管理员账户创建两个项目,分别为itcast01和itheima01
结果为:
eric用户登录,只能看到itcast01项目
jack用户登录,只能看到itheima01项目
持续集成环境(4)-Jenkins凭证管理
凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
安装Credentials Binding插件
要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件
安装插件后,多了"凭证"菜单,在这里管理所有凭证
可以添加的凭证有5种:
Username with password:用户名和密码
SSH Username with private key: 使用SSH用户和密钥
Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
Certificate:通过上传证书文件的方式
常用的凭证类型有:Username with password(用户密码)和SSH Username with private key(SSH密钥)
接下来以使用Git工具到Gitlab拉取项目源码为例,演示Jenkins的如何管理Gitlab的凭证。
安装Git插件和Git工具
为了让Jenkins支持从Gitlab拉取源码,需要安装Git插件以及在CentOS7上安装Git工具。
Git插件安装,安装完成之后建议重启Jenkins:
CentOS7上安装Git工具:
安装
yum install git -y
安装后查看版本
git --version
用户密码类型
1)创建凭证
Jenkins->凭证->系统->全局凭证->添加凭证
选择"Username with password",输入Gitlab的用户名和密码,点击"确定"。
2)测试凭证是否可用
选择之前创建的itcast01项目
找到"源码管理"->“Git”,在Repository URL复制Gitlab中的项目URL
这时会报错说无法连接仓库!在Credentials选择刚刚添加的凭证就不报错啦
保存配置后,点击构建”Build Now“ 开始构建项目
查看/var/lib/jenkins/workspace/目录,发现已经从Gitlab成功拉取了代码到Jenkins中。
SSH密钥类型
SSH免密登录示意图
1)使用root用户生成公钥和私钥
ssh-keygen -t rsa
在/root/.ssh/目录保存了公钥和使用
id_rsa:私钥文件
id_rsa.pub:公钥文件
2)把生成的公钥放在Gitlab中
以root账户登录->点击头像->Settings->SSH Keys
复制刚才id_rsa.pub文件的内容到这里,点击"Add Key"
3)在Jenkins中添加凭证,配置私钥
在Jenkins添加一个新的凭证,类型为"SSH Username with private key",把刚才生成私有文件内容复制过来
4)测试凭证是否可用
新建"test02"项目->源码管理->Git,这次要使用Gitlab的SSH连接,并且选择SSH凭证
同样尝试构建项目,如果代码可以正常拉取,代表凭证配置成功!
持续集成环境(5)-Maven安装和配置
在Jenkins集成服务器上,我们需要安装Maven来编译和打包项目。
安装Maven
先上传Maven软件到192.168.10.129服务器上的root/soft目录下
链接:https://pan.baidu.com/s/1zW2BISo1_PAb4NUmlxkIqg
提取码:yyds
解压到/usr/local/
tar -xzf apache-maven-3.6.2-bin.tar.gz -C /usr/local/
配置环境变量
vi /etc/profile
//jdk环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
//$PATH 指的是以前配置的命令
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/lib:$MAVEN_HOME/bin
//maven环境变量
export MAVEN_HOME=/usr/local/apache-maven-3.6.2
配置生效
source /etc/profile
查找Maven版本
mvn -v
全局工具配置关联JDK和Maven
Jenkins->Global Tool Configuration->JDK->新增JDK,配置如下:
Jenkins->Global Tool Configuration->Maven->新增Maven,配置如下:
添加Jenkins全局变量
Manage Jenkins->Configure System->Global Properties ,添加三个全局变量JAVA_HOME、M2_HOME、PATH+EXTRA
为了让Jenkins感知到jdk和maven的命令
修改Maven的settings.xml
创建本地仓库目录
mkdir /root/repo
修改Maven的settings.xml
vi /usr/local/apache-maven-3.6.2/conf/settings.xml
本地仓库改为:/root/repo/
添加阿里云私服地址:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
测试Maven是否配置成功
之前我们只是在jenkins上完成从gitLab上拉取代码,并且从控制台日志上看到代码成功拉取到服务器上,接下来我们配置maven对拉取的代码进行编译打包
使用之前的test02测试项目,修改配置
构建->增加构建步骤->Execute Shell
输入
mvn clean package
再次构建,如果可以把项目打成war包,代表maven环境配置成功啦!
可以看到本地仓库内保存了从中央仓库下载的依赖
安装Tomcat8.5
把Tomcat压缩包上传到192.168.10.102服务器
解压到//usr/local目录下
tar -xzvf apache-tomcat-8.5.47.tar.gz -C /usr/local
启动tomcat(必须依赖jdk环境)
/usr/local/apache-tomcat-8.5.47/bin/startup.sh
注意:服务器已经关闭了防火墙,所以可以直接访问Tomcat啦
地址为:
http://192.168.10.102:8080
由于Jenkins和Tomcat所在不同的服务器上,所以要Jenkins有权限去连接
Tomcat服务器,进行远程传输,所以要求Jenkins使用Tomcat的账号才能实现远程传输及部署
配置Tomcat用户角色权限
默认情况下Tomcat是没有配置用户角色权限的
但是,后续Jenkins部署项目到Tomcat服务器,需要用到Tomcat的用户,所以修改tomcat以下配置,添加用户及权限
vim /usr/local/apache-tomcat-8.5.47/conf/tomcat-users.xml
内容如下:
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
用户和密码都是:tomcat
注意:为了能够刚才配置的用户登录到Tomcat,还需要修改以下配置
vim /usr/local/apache-tomcat-8.5.47/webapps/manager/META-INF/context.xml
重启Tomcat,访问测试
停止
/usr/local/apache-tomcat-8.5.47/bin/shutdown.sh
启动
/usr/local/apache-tomcat-8.5.47/bin/startup.sh
访问: http://192.168.10.102:8080/manager/html ,
输入tomcat和tomcat,看到以下页面代表成功啦
从上面可以看到,整个tomcat的webapps目录下的项目,后续的jenkins可以利用tomcat账号来管理webapps目录下的项目,来实现项目的远程发布功能
Jenkins项目构建类型(1)-Jenkins构建的项目类型介绍
Jenkins中自动构建项目的类型有很多,常用的有以下三种:
自由风格软件项目(FreeStyle Project)
Maven项目(Maven Project)
流水线项目(Pipeline Project)
每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在实际开发中可以根据自己的需求和习惯来选择。(PS:个人推荐使用流水线类型,因为灵活度非常高)
Jenkins项目构建类型(2)-自由风格项目构建
下面演示创建一个自由风格项目来完成项目的集成过程:
拉取代码->编译->打包->部署
拉取代码
1)创建项目
2)配置源码管理,从gitlab拉取代码
编译打包
配置->构建->添加构建步骤->Executor Shell
echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"
应用->保存
构建
部署(将129服务器上的war包远程部署到120服务器上)
把项目部署到远程的Tomcat里面
1)安装 Deploy to container插件
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现
2)添加构建后操作
3)添加Tomcat用户凭证
点击"Build Now",开始构建部署过程
4)部署成功后,访问项目
点击项目
演示改动代码后的持续集成
1)IDEA中源码修改并提交到gitlab
推送到远程gitLab服务器
2)在Jenkins中项目重新构建
3)访问Tomcat
Jenkins项目构建类型(3)-Maven项目构建
1)安装Maven Integration插件(如果下载失败,查询下载即可)
2)创建Maven项目
3)配置项目
拉取代码和远程部署的过程和自由风格项目一样,只是"构建"部分不同
之后就是重新构建项目了
Jenkins项目构建类型(4)-Pipeline流水线项目构建(*)
Pipeline简介
1)概念
Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
2)使用Pipeline有以下好处(来自翻译自官方文档):
代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。
持久:无论是计划内的还是计划外的服务器重启,Pipeline都是可恢复的。 可停止:Pipeline可接收交互式输入,以确定是否继续执行Pipeline。
多功能:Pipeline支持现实世界中复杂的持续交付要求。它支持fork/join、循环执行,并行执行任务的功能。
可扩展:Pipeline插件支持其DSL的自定义扩展 ,以及与其他插件集成的多个选项。
3)如何创建 Jenkins Pipeline呢?
Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 Groovy
Pipeline 支持两种语法:Declarative(声明式)和 Scripted Pipeline(脚本式)语法
Pipeline 也有两种创建方法:可以直接在 Jenkins 的 Web UI 界面中输入脚本;也可以通过创建一个 Jenkinsfile 脚本文件放入项目源码库中(一般我们都推荐在 Jenkins 中直接从源代码控制(SCM)中直接载入 Jenkinsfile Pipeline 这种方法)。
安装Pipeline插件
Manage Jenkins->Manage Plugins->可选插件 Pipeline(安装失败就重新安装即可)
安装插件后,创建项目的时候多了“流水线”类型
Pipeline语法快速入门
1)Declarative声明式-Pipeline
创建项目
流水线->选择HelloWorld模板
生成内容如下:
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。
编写一个简单声明式Pipeline:
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
echo '拉取代码'
}
}
stage('编译构建') {
steps {
echo '编译构建'
}
}
stage('项目部署') {
steps {
echo '项目部署'
}
}
}
}
点击构建,可以看到整个构建过程
2)Scripted Pipeline脚本式-Pipeline
创建项目
这次选择"Scripted Pipeline"
Node:节点,一个 Node 就是一个 Jenkins 节点,Master 或者 Agent,是执行 Step 的具体运行环境,后续讲到Jenkins的Master-Slave架构的时候用到。
Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如:Build、Test、Deploy,Stage 是一个逻辑分组的概念。
Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像,由各类 Jenkins 插件提供,比如命令:sh ‘make’,就相当于我们平时 shell 终端中执行 make 命令一样。
编写一个简单的脚本式Pipeline
node {
def mvnHome
stage('拉取代码') {
echo '拉取代码'
}
stage('编译构建') {
echo '编译构建'
}
stage('项目部署') {
echo '项目部署'
}
}
构建结果和声明式一样!
拉取代码(借助流水线语法)
编译打包
mvn clean package
重新构建
部署
重新构建访问项目
Pipeline Script from SCM
刚才我们都是直接在Jenkins的UI界面编写Pipeline代码,这样不方便脚本维护,同时也没有进行版本控制,建议把Pipeline脚本放在项目中(一起进行版本控制)
1)在项目根目录建立Jenkinsfile文件,把内容复制到该文件中
并将脚本文件提交推送到gitlab上
2)在项目中引用该文件
重新构建项目测试成功