持续集成 Jenkins
1 Jenkins概述
Jenkins是Java语言开发的一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
jenkins支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins分布式构建支持能够让多台计算机一起构建/测试。
Jenkins文件识别能够跟踪哪次构建生成哪些 jar,哪次构建使用哪个版本的 jar 等。
Jenkins丰富的插件支持,支持扩展插件,你可以开发适合自己团队使用的工具,如 git、svn、maven、docker 等。
Jenkins官网地址:https://www.jenkins.io/
持续集成流程说明:
首先,开发人员每天进行代码提交,提交到 Git 仓库。
然后,Jenkins 作为持续集成工具,使用 Git 工具到 Git 仓库拉取代码到集成服务器,再配合 JDK,Maven 等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
最后,Jenkins 把生成的 jar 或 war 包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。
实验环境:
2 安装Jenkins
Jenkins版本介绍:jenkins LTS(长期支持)每12周更新一次,jenkins普通版,每周更新一次
方案一:安装目前最新版Jenkins
yum install fontconfig java-11-openjdk
wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.346-1.1.noarch.rpm
yum -y install jenkins-2.346-1.1.noarch.rpm
提示:如果新版本在启动服务时,服务无法启动,请使用方案二安装较低版本,因为有可能出现Jenkins和Java的版本不兼容的情况。
方案二:清华大学下载Jenkins RPM包安装方式
https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
#Jenkins需要依赖JDK,安装jdk环境(fontconfig是安装Jenkins web界面字体)
[root@jenkins ~]# yum -y install fontconfig java-1.8.0-openjdk*
#安装Jenkins(别安装最新版本,最新版本与jdk不兼容,服务起不来)
[root@jenkins ~]# yum -y install jenkins-2.319.2-1.1.noarch.rpm
3 Jenkins服务相关参数
程序名:jenkins
默认端口:8080(可修改)
/etc/sysconfig/jenkins #主配置文件,主要配置Jenkins的工作目录、启动用户、启动端口。
/var/lib/jenkins #默认的Jenkins家目录(存放项目及插件)
/var/log/jenkins #日志文件目录
启动Jenkins(该版本默认已经随机自启)
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# netstat -ntlp
tcp6 0 0 :::8080 :::* LISTEN 7703/java
#查看版本信息
[root@jenkins ~]# jenkins --version
4 登录Jenkins
浏览器访问jenkins:http://192.168.0.112:8080/
Jenkins是一个引擎,他本身的功能很简单,是通过各种不同的插件实现编译部署项目, 例如从 Gitlab 拉取代码,使用 Maven 构建项目等功能需要依靠插件完成 。
如果选择安装推荐的插件,这样大部分常用的插件将会被安装,如果是通过右侧的选择插件来安装自定义安装插件不适合新手。
如果不知道自己会用到哪些插件,可以选择建议:
提示:插件是从国外的Jenkins官方仓库下载,速度比较慢。
插件安装目录:/var/lib/jenkins/plugins/
提示:以后Jenkins的管理员账户就是我们自己创建的admin,并不是系统默认的admin了
用户信息存放在:/var/lib/jenkins/users/路径默认以用户名开头的目录下config.xml文件中
5 Jenkins插件管理
我们前面讲了,Jenkins是一个引擎,他本身的功能很简单,是通过各种不同的插件实现编译部署项目,如果前边安装了推荐的插件,其中也包括中文汉化插件,那么Jenkins大部分将以中文显示。
5.1 在线下载插件
点击左侧配置栏的 系统管理(Manage Jenkins)→ 管理插件(Manage Plugins)
点击 可选插件 可以选择你需要安装的插件(如果前边已经安装了推荐的插件,这里暂时不需要安装可选插件)
点击以 安装 可以看到我们当前Jenkins可以使用的插件,也支持搜索功能,例如中文汉化的插件Chinese。
点击 高级 后下拉可以看到支持 上传插件 或者通过 升级站点 更改插件的下载地址。
5.2 手工安装插件
除了在线插件安装方法,Jenkins还为我们提供了手工安装插件的方式,特别是在国内,由于网络的原因,有时候我们使用上述方法安装插件会经常不成功,所以我们可以采用下载插件,然后再上传的方式来安装插件。
将插件上传到路径:/var/lib/jenkins/plugins/ 重启Jenkins即可
官方的插件下载地址:http://updates.jenkins-ci.org/
国内的插件下载地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/
需要注意的是选择下载对应版本的版本,否则有时候会出现兼容性错误。
Jenkins的版本可以通过系统管理→关于Jenkins看到
6 创建任务
Jenkins的任务可以让我们实现很多工作流程的自动化,例如 打包、持续集成、部署、定时运行等工作。
点击左侧栏 新建Item(新建任务)
提示:输入名称之后我们还要点击下面的模板选择其一,否则也无法创建项目,紧接着下面是一些复选框。
在General(常规)复选框中我们勾选 Discard old builds(丢弃旧版本)
由于每次构建都会生成很多构建产物,如果频繁构建会占用很多的空间,我们可以通过这几个选项控制构建产物的保留。一般建议选择保留最近5-10的构建为适宜。
源码管理:可以选svn、git等版本控制系统,如果没有安装对应插件则不显示(暂时先不用选择)
构建触发器: 可以指定达到什么条件,就会去执行,此处定时构建,也就是定时任务(暂时先不用选择)
构建环境:可以指定在构建之前执行的一些操作、构建执行执行的一些操作(暂时先不用选择)
构建:接下来就是最常用构建复选框,我们通过构建框中找到Execute shell并选择它。这样我们可以利用Jenkins帮我们去执行shell命令实现项目的自动发布。
但是我们先通过简单的命令测试能够构建成功。
点击保存
我们点击左侧的 Build Now(立即构建)就是手动触发一次构建。
构建完成之后下方会出现一条构建记录,绿色表示构建成功,红色表示构建失败。点击构建的记录名称内的控制台输出会进入这个构建记录的详细信息,如下界面:
此路径表示我们刚刚创建的choujiang任务目录,在此目录中执行了具体命令。
通过这个小例子我们可以使用Jenkins在页面执行任何需要在linux命令行的操作。
7 配置使用GitLab
接下来我们就可以使用Jenkins的choujiang任务从Gitlab拉取代码到jenkins并实现代码的自动发布。
具体流程:
配置Jenkins与GitLab协同
拉取项目代码到Jenkins本地
通过脚本自动发布项目到生产环境的Nginx服务器
7.1 GitLab创建仓库
首先我们在GitLab创建一个项目仓库用于存放项目代码,菜单(Menu)→管理(Admin)→新建项目
7.2 推送代码
a:将代码推送到choujiang项目中
[root@git ~]# mkdir /choujiang
[root@git ~]# cd /choujiang
[root@git choujiang]# git init
[root@git choujiang]# unzip dzp.zip
[root@git choujiang]# rm -rf dzp.zip
[root@git choujiang]# mv luckdraw-master/* .
[root@git choujiang]# git add .
[root@git choujiang]# git commit -m 'add choujiang'
[root@git choujiang]# git remote add origin git@192.168.0.110:test/choujiang.git
[root@git choujiang]# git push -u origin master
b:GitLab验证仓库
7.3 Jenkins与GItLab协同
a:Jenkins安装Git工具
[root@jenkins ~]# yum -y install git
b:Jenkins设置SSH Key
[root@jenkins ~]# ssh-keygen
c:把公钥添加到GitLab上
下方点击添加密钥
d:Jenkins添加凭据,配置私钥
在Jenkins中添加一个新的SSH凭证用于免密链接GitLab,点击右上角的Admin后在左侧栏可以看到凭据选项,点击凭据后如下图:
点击Jenkins用户添加凭据。
具体内容如下:
e:测试凭据是否可用
在Jenkins的choujiang任务找到源码管理
具体配置如下图:
点击保存回到任务列表点击左侧栏Build Now(立即构建)后查看具体构建详情,如下图:
通过控制台输出查看构建详情:
本次构建的大致含义是Jenkins将GitLab上的choujiang项目拉取到了Jenkins主机本地:/var/lib/jenkins/workspace/choujiang
[root@jenkins ~]# ls /var/lib/jenkins/workspace/choujiang
awardrotate.js images index.html jquery-1.10.2.js jquery-2.2.4.js README.md
小结:上述操作已经让Jenkins与GitLab协同,接下来通过脚本让Jenkins将代码发布到Nginx服务器(代码放在jenkins服务器没有任何意义)。
8 部署Nginx Web服务
Nginx的web服务配置如下:
源码部署Nginx:
[root@nginx-server-113 ~]# yum -y install gcc pcre-devel openssl-devel
[root@nginx-server-113 ~]# tar -xf nginx-1.20.1.tar.gz
[root@nginx-server-113 ~]# cd nginx-1.20.1
[root@nginx-server-113 nginx-1.20.1]# ./configure
[root@nginx-server-113 nginx-1.20.1]# make && make install
[root@nginx-server-113 nginx-1.20.1]# /usr/local/nginx/sbin/nginx
9 Jenkins代码发布
接下上面的示例,我们实现将通过Jenkins将代码发布到我们的Nginx服务器上,具体流程如下:
1)我们首先要保证Jenkins本机可以免密登录到Nginx主机
2)编写发布代码脚本
3)通过Jenkins构建方式执行脚本实现发布代码到Nginx
编写发布脚本(将脚本上传到指定目录):
[root@jenkins ~]# mkdir /script
[root@jenkins ~]# cd /script
配置Jenkins用户免密登录Nginx:
1)默认Jenkins无法登录系统,需要将Jenkins用户的解释器该为/bin/bash
2)使用Jenkins用户登录生成密钥对
3)root用户将Jenkins用户密钥传递到Nginx
#切换到Jenkins家目录/var/lib/jenkins
[root@jenkins ~]# cd /var/lib/jenkins
#拷贝公钥
[root@jenkins Jenkins]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.113
上述配置完成后root用户手动执行脚本验证是否推送成功:
[root@jenkins script]# bash jenkins-deploy.sh
Jenkins构建脚本:
回到 Jenkins的choujiang任务点击 设置→构建→增加构建步骤→Execute shell(shell命令)
Jenkins调用shell脚本实现代码发布,如下图:
点击左侧栏的 Build New(立即构建),通过控制台输出查看构建信息如下图:
提示:出现上图中的报错可看到是在执行脚本后出现的报错,原因是Jenkins普通用户无法执行某些系统命令。
解决方法:将Jenkins的配置文件的用户修改为root,并将root的密钥粘贴至Nginx的公钥文件内
[root@jenkins script]# vim /etc/sysconfig/jenkins
...
JENKINS_USER="root"
再次构建后如下图:
小结:通过上述配置后,只要GitLab有新代码需要发布,我们只需要在Jenkins上点击Build New(立即构建)即可实现代码的一键发布。
验证一键发布:
#在git主机提交新代码, 随便修改一些内容即可。
[root@git choujiang]# vim index.html
[root@git choujiang]# git add .
[root@git choujiang]# git status
[root@git choujiang]# git commit -m 'modify'
[root@git choujiang]# git push origin master
回到 Jenkins点击Build New(立即构建)通过控制台输出查看结果后如下图:
构建成功后Nginx服务器验证结果。
评论区