Jenkins学习笔记
一、CICD环境介绍与安装
1、简介
Jenkins,原名 Hudson,2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。
官方网站:https://www.jenkins.io/
2、Docker安装
Docker官网安装文档:https://docs.docker.com/engine/install/
Centos7安装
1 | # 更新yum源 |
Ubuntu安装
1 | # 文本处理的流编辑器 -i直接修改读取的文件内容,而不是输出到终端 |
3、GitLab安装使用
3.1 介绍
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,相当于github和Gitee代码托管平台,只是GitLab是私有的代码托管平台
官方网站:https://about.gitlab.com/
安装所需最小配置,内存至少4G,安装文档:https://gitlab.cn/install/
3.2 手动安装
Centos系统下的安装
1 | # 安装依赖 |
Ubuntu系统下的安装
1 | # 安装必要软件包 |
3.3 Docker安装
1 | docker run --detach \ |
3.4 注意事项
1 | # gitlab常用命令 |
如果不在安装过程中指定了自定义密码,否则将随机生成一个密码并存储在 /etc/gitlab/initial_root_password
文件中(出于安全原因,24 小时后,此文件会被第一次 gitlab-ctl reconfigure
自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码)。使用此密码和用户名 root
登录。
安装成功后访问http://你指定的ip或域名
即可访问,如果需要修改,可以进入/etc/gitlab/gitlab.rb
进行修改,改完重启
4、JDK与Maven安装
将JDK和maven安装在Jenkins服务器
1 | #=============================在线安装================================== |
5、Jenkins安装
官网地址:https://www.jenkins.io/,建议机器内存0.5G以上
1 | 机器要求: |
下载地址:https://www.jenkins.io/zh/download/
1 | wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war |
启动后访问http://ip:8080,密码默认在/home/shawn/.jenkins/secrets/initialAdminPassword
,也可以在控制看到,进入后选择推荐安装
二、Jenkins + Git + Maven 自动化部署配置
1、Jenkins拉取构建jar包
1.1 maven换源
进入maven的配置文件vim /usr/local/maven/conf/settings.xml
,找到镜像源并替换
1 | <localRepository>${user.home}/.m2/repository</localRepository> |
1.2 全局配置
系统管理→全局工具配置→配置系统全局maven,注意填写自己的maven路径,然后下载好git
1.3 自动拉取构建初体验
选择新建任务→构建一个maven项目,其他暂时默认,仓库去gitlab获取链接,这里使用了http,使用不需要凭证,同时选择好自己想拉取的分支,如果报错,需要安装git
pom.xml
位置,如果项目里面有多个子项目,那需要添加前缀
1.4 构建注意事项
如果控制台报错No compiler is provided in this environment.Perhaps you are running on a "JRE rather than a JDK?
1 | # 默认yum安装java的时候会显示安装的是openjdk1.8 实则实际上只安装了jre |
2、自动发布并运行
2.1 插件安装与配置
系统管理→插件管理→安装插件→publish over ssh
安装好插件好,进入系统管理→系统管理,配置好对目标服务器的ssh,设置好登录地点目录
2.2 自动发布
在原来的任务选择配置进行修改,选择构建后的操作,选择我们刚刚配置好的服务器,配置构建后出发的选项,Source files
代表要传送的文件,Remove prefix
表示去除的前缀,Remote directory
表示要创建的目录,最后是要运行的命令,构建结束后,远程服务器存在文件/home/shawn/jenkins/jenkin.jar
超时机制
输出命令时一定要注意不要让窗口卡主,不然Jenkins会认为认为一直没完成
1 | # 工作目录为服务器配置的,我这里就是/home/shawn |
数据流重定向
数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方
-
标准输入(stdin):代码为0,使用<或<<;
-
标准输出(stdout):代码为1,使用>或>>;
-
标准错误输出(stderr):代码为2,使用2>或2>>
-
> 覆盖写
-
>> 追加写
2.3 自动发布前清理
在构建前进行服务器清理,在Pre Steps
的命令行下填写在构建前要运行的命令./clean.sh jenkins
,同时在目标服务器上编写脚本
1 |
|
三、自动构建触几种方式
1、触发远程构建/gitlab上改动自动构建
代码改动(提交,合并等)自动可以使用gitlab的webhook回调钩子调起Jenkins的启动任务接口,进行自动打包构建与运行
首先在构建触发器中配置接口和token
因为需要权限认证,所以需要安装一个插件Build Authorization Token Root
,安装完插件后,要访问http://192.168.249.129:8080/buildByToken/build?job=first&token=123456
即可无需认证触发构建
然后进入GitlLab或者远程代码仓库,找到Webhook选项,将调起Jenkins的启动任务接口填入,如果GitLab发现不让本地访问,调用菜单→管理员→设置→网络→出战请求→允许来自 web hooks 和服务对本地网络的请求
就可
2、定时构建
参考网站:https://crontab.guru
Jenkins cron不是标准的cron表达式
1 | 第一个 * 表示每个小时的第几分钟,取值0~59 |
H * * * *
表示一小时内的任意时间
*/10 * * * *
每10分钟
H/10 * * * *
每10分钟,可能是7,17,27,起始时间hash,步长不变
45 3 * * 1-6
每个周一至周六,凌晨3点45 执行1次
45 3-5 * * 1-6
每个周一至周六,凌晨3点45 ,凌晨4点45,凌晨5点45 各执行1次
H(40-48) 3-5 * * 1-6
在40~48之间取值 其他同上
45 3-5/2 * * 1-6
每个周一至周六,凌晨3点45 ,凌晨5点45 各执行1次
45 0-6/2 * * 1-6 * * 1-6
0点开始,每间隔2小时执行一次 0:45、2:45、4:45
3、源码变更构建
使用Poll SCM 方式与Build periodically一样,会主动定期检查代码托管服务器上是否有变化,一旦发生变化执行job构建
4、所有构建方式介绍
-
快照依赖构建/Build whenever a SNAPSHOT dependency is built
- 当依赖的快照被构建时执行本job
-
触发远程构建 (例如,使用脚本)
- 远程调用本job的restapi时执行本job
-
job依赖构建/Build after other projects are built
- 当依赖的job被构建时执行本job
-
定时构建/Build periodically
- 使用cron表达式定时构建本job
-
向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling
- Github-WebHook出发时构建本job
-
定期检查代码变更/Poll SCM
- 使用cron表达式定时检查代码变更,变更后构建本job
5、测试报告邮件通知
首先开启163邮箱的SMTP服务,记录下自己的授权码,比如我的SUUJPSARCHWKHWAP
,然后进入首页→系统管理→系统配置
-
首先找到Jenkins Location,填写系统管理员邮件地址(授权smtp的163邮箱)账号
-
找到Extended E-mail Notification,推荐插件安装自动安装,填写好SMTP server(smtp.163.com),端口25,创建好账户和密码(授权码),设置好默认发送邮箱,在Default Triggers里选择相应的触发条件
-
邮件通知是内置的,选择好SMTP服务器,使用SAMTP认证,这里用户名要去掉邮箱尾缀,密码还是授权码,端口25,可以测试发送,最后保存
最后在任务中进行配置设置要发送的邮箱
6、自动化部署到docker容器中
原理和前面一样,构建前清除docker,然后把构建的包发送,最后发送启动docker
1 | FROM openjdk:11 |
四、Jenkins集群/并发构建
集群化构建可以有效提升构建效率,尤其是团队项目比较多或是子项目比较多的时候,可以并发在多台机器上执行构建
这里我们一模一样克隆一台jenkins机器,从机无需启动jenkins,只需要java和maven构建环境,进入系统管理→节点管理,可以看到本机就是一个主节点,然后我们新建节点,取名jenkin-01,注意标签的填写,后面流水线需要依赖这个;填好并发依赖数量,主机名
然后进入我们的任务配置,在general中勾选在必要的时候并发构建,这样就可以进行集群化构建了
五、流水线pipline
1、介绍
流水线既能作为任务的本身,也能作为Jenkinsfile
使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。
2、流水线语法
1 | pipeline:整条流水线 |
3、简单流水线测试
首页→新建任务→选择流水线,选择最简单的脚本进行测试
post:流水线完成后可执行的任务
-
always 无论流水线或者阶段的完成状态。
-
changed 只有当流水线或者阶段完成状态与之前不同时。
-
failure 只有当流水线或者阶段状态为"failure"运行。
-
success 只有当流水线或者阶段状态为"success"运行。
-
unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。
-
aborted 只有当流水线或者阶段状态为"aborted "运行。例如:手动取消。
**agent:**可以指定执行节点
-
label 指定运行job的节点标签
-
any 不指定,由Jenkins分配
1 | pipeline { |
另外全新的流水线控制ui,可重复执行某阶段代码,插件中心搜索Blue Ocean安装即可,同时流水线编码可在流水线语法页面进行在线生成
4、pipeline自动化构建示例
1 | pipeline { |
5、多分支job
简单来说就是一个仓库分支对应一个job,例如测试CICD和生产环境CICD
首页进入首页或者blue Ocean首页,创建多分支流水线,填写对应的git仓库,选择立刻扫描,此时如果是多模块项目,需要在配置里修改Jenkinsfile
文件位置,默认该文件需要在根目录,点击立刻扫描,jenkins就会默认去代码仓库找Jenkinsfile文件并自动替我们执行,同时也可以单独对某一个分支进行扫描构建
6、两种流水线总结
6.1 声明式流水线
好处
-
更像是在Jenkins web ui中的操作
-
可读性比较高
-
可以使用blue ocean自动生成
-
支持语法检查
坏处
- 代码逻辑能力比脚本式弱,不能完成特别复杂的任务
6.2 脚本式流水线
好处
-
更少的代码和弱规范要求
-
更灵活的自定义代码操作
-
不受约束,可以构建特别复杂的工作流和流水线
坏处
-
读写对编程要求比较高
-
比声明式流水线代码更复杂