Jenkins是一个开源的用于持续集成的工具,由Java开发。
Jenkins是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作,包括代码提交、构建、测试、发布以及部署等操作。
Jenkins的部署比较简单,系统要求1c1g即可,软件要求jdk8版本。
三种安装方式
本次选用rpm包安装
部署JDK
1 | yum list | grep openjdk # 找出java1.11.0版本的openjdk包 |
安装Jenkins
1 | wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo |
Jenkins目录结构
1 | [root@dengpangpang yum.repos.d]$ rpm -ql jenkins |
启动并测试
1 | systemctl start jenkins # 开启之后,浏览器访问 http://IP:8080 |
暂时不安装插件
汉化
web页面侧边栏—>Manage Jenkins—>Plugins—>Available plugins,搜索chinese可以看到简体中文的插件,按提示操作即可。
安装插件
有三种安装方式
/var/lib/jenkins/plugins
目录中,重启服务即可。本节将以一个实践操作,完成一次Jenkins自动部署流程:开发人员提交代码到远程仓库,然后Jenkins自动拉取最新代码,将代码部署到web服务器上。
前期准备:
GitLab服务器,作为远程仓库,新建一个项目。
初始化一个Git本地仓库,能够正常推送到GitLab远程仓库
配置好一台代理服务器和两台web服务器做负载均衡,能够正常访问
Jenkins服务器,提前做好GitLab服务器和两台web服务器的域名解析和SSH验证。
在Jenkins的web页面提前安装好相关插件
1 | credentials: 允许在Jenkins中存储认证凭据 |
这部分目的很简单,就是让Jenkins连接GitLab,测试CICD的第一个阶段:代码的拉取。
将Jenkins服务器上的SSH公钥添加到GitLab的web页面的SSH密钥中,私钥稍后在Jenkins的web页面添加
创建一个Jenkins项目,在源码管理中,添加GitLab仓库(Repositories)和SSH私钥(Credentials),然后配置分支。
注意,配置Credentials时(添加Jenkins私钥),Domain选择默认Global credentials (unrestricted)
,Credentials选择SSH Username with private key
,范围选择Global
,Username可以随便写,Private Key 中直接填写私钥内容即可。
保存项目,构建一下,根据控制台输出查看是否成功拉取代码
在Jenkins中查看,可以看到Jenkins的工作目录/var/lib/jenkins/workspace/
已经有了项目的代码目录
本节的目的就是完成Jenkins的自动操作,开发人员将代码提交到远程仓库会触发一个钩子事件,触发Jenkins自动拉取代码,然后执行相应动作。
一般希望测试环境通过钩子事件自动触发,生产环境最好手动build。
Jenkins配置触发器
在Jenkins项目的配置中,在构建触发器的相关选项中,选择Build when a change is pushed to GitLab
,即GitLab项目有更新时触发。后面的 GitLab webhook URL: http://study.jenkins:8080/project/freestyle-page
是GitLab发送提醒的地址(钩子地址)。
在具体的触发事件中,一般选择Push Event
和 Opened Merge Request Events
两项,即推送代码和合并代码时触发。然后在下面的高级选项中,生成一个Secret token
,即token令牌。
GitLab添加钩子事件(web hooks)
在GitLab的web页面中,点击对应项目,找到设置—>集成,在URL栏中填写钩子地址,在Secret token栏中填写token令牌,保存之后测试。
若报错:Urlis blocked: Requests to the local network are not allowed,意思是不允许局域网内请求,需要进入GitLab的管理中心,侧边栏设置—>网络,展开外发请求,选择Allow requests to the local network from hooks and services
,保存。
这部分的重点是一个脚本文件,放在Jenkins服务器上,让Jenkins触发执行。涉及到脚本需要与Jenkins中的参数配合才能完成自动部署的逻辑。
编写脚本
1 |
|
配置Jenkins参数
Jenkins有一些内置变量,在shell脚本中可以直接使用,比如WORKSPACE
是指存放当前项目代码的目录,GIT_COMMIT
是指本次拉取的代码提交id的哈希值,GIT_PREVIOUS_SUCCESSFUL_COMMIT
是指上一次成功构建的代码,提交id的哈希值。
另外脚本中还用到了一些变量,需要手动添加,方法是在项目的配置中,General部分勾选This project is parameterized
,意思是参数化构建该项目,添加参数,根据需求可选不同类别的参数。
下面是上述脚本中用到的参数:
SERVERS_ARRAY
这个变量的作用是作为一个数组,数组的元素是web服务器的主机名,可以自定义添加或者删除,并提供默认值。所以这个参数选择字符串参数。
git_version
这个变量的作用是获取代码提交到远程仓库时的标签值(tag),用来给服务器中的代码文件命名,方便看出迭代的过程。所以这个参数选择的是Git Parameter
,需要安装Git Parameter
这个插件才能选择,参数类型选择标签,即可获取tag。
需要特别注意的是,这里获取的tag只是获取了一堆tag值,和代码的提交顺序没有强对应关系,所以在高级选项中需要执行tag的排序方式和已选值,这里选择的是智能倒序,已选值选择排在顶部的tag。
注意:选用这个参数要谨慎,代码提交的tag要注意规范,才能智能排序将新版本排在顶部。另外在实践过程中,我发现推送代码之后推送tag会导致获取到的tag落后一个版本,所以建议推送代码时先推送tag,再推送代码。
deploy_env
这个参数的作用是说明此次部署的目的,构建或者回滚,二者在脚本中有不同的逻辑。所以这个参数的类型是Choice Parameter
(选项参数),在选项栏中,不同的选项用回车分隔即可。
添加任务
继续Jenkins项目的配置,在构建任务(Build Steps)中,选择执行shell,然后输入执行脚本的命令,保存即可。
注意:
如果脚本中的部分命令执行过程中显示权限拒绝,可能是由于Jenkins服务的用户默认是Jenkins,无法执行一些命令。解决方法有两种:
方法1:修改Jenkins配置文件,将Jenkins服务的用户修改为root
方法2:配置用户Jenkins为高权限用户(visudo),然后以sudo的方式执行脚本
项目配置完成之后,一定要多测试几次,确保万无一失。
可以手动推送代码触发CICD,查看构建是否成功,也可以在项目的Build with Parameter
中手动选择参数去构建。
查看构建历史的控制台输出和日志来观察流程是否存在问题。