Jenkins,原名 Hudson,2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。
官方网站
GitLab安装使用
官方网站:https://about.gitlab.com/
安装所需最小配置,太小容易502到你吐血
内存至少4G
https://docs.gitlab.cn/jh/install/requirements.html
在ssh下安装
官方安装文档:https://gitlab.cn/install/?version=ce
1 安装依赖
1 | sudo yum install -y curl policycoreutils-python openssh-server perl |
2 配置镜像
1 | curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash |
3 开始安装
1 | sudo EXTERNAL_URL="http://192.168.44.103" yum install -y gitlab-jh |
除非您在安装过程中指定了自定义密码,否则将随机生成一个密码并存储在 /etc/gitlab/initial_root_password
文件中(出于安全原因,24 小时后,此文件会被第一次 gitlab-ctl reconfigure
自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码)。使用此密码和用户名 root
登录。
gitlab常用命令
1 | gitlab-ctl start # 启动所有 gitlab 组件; |
在docker下安装
https://docs.gitlab.cn/jh/install/docker.html
安装所需最小配置
- 内存至少4G
- 系统内核至少在3.10以上
uname -r
命令可查看系统内核版本
安装docker
- 更新yum源
yum update
- 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加镜像
1 | //国外镜像 |
- 查看源中可使用版本
1 | yum list docker-ce --showduplicates | sort -r |
- 安装指定版本
1 | yum install docker |
- 配置开机启动项
1 | systemctl start docker |
使用容器安装gitlab
1.添加容器
1 | docker run --detach \ |
2.启动容器
1 | docker start gitlab |
3.查看已存在的容器
1 | docker ps -a |
4.进入容器
1 | docker exec -it gitlab /bin/bash |
访问
当首次运行出现502错误的时候排查两个原因
- 虚拟机内存至少需要4g
- 稍微再等等刷新一下可能就好了
管理员账号登录
用户名:root
密码存在下面文件中,登录后需要改密码不然24小时之后会失效
1 | cat /etc/gitlab/initial_root_password |
Jenkins安装
官方文档介绍非常详细
安装需求
1 | 机器要求: |
安装JDK
1 检索可用包
1 | yum search java|grep jdk |
2 安装
1 | yum install java-1.8.0-openjdk |
安装Jenkins
直接java -jar jenkins.war
首次启动war包会在/root/.jenkins
生成配置文件
待完全启动成功后 访问服务器8080端口完成配置
初始化后的密码:
1 | Jenkins initial setup is required. An admin user has been created and a password generated. |
密码文件使用后会自动删除
访问:ip:8080输入密码登录
选择安装推荐的插件
19aff54f66b04b88aa621bce8bf7a245
Maven安装
官网
下载后复制到Jenkins所在服务器解压缩即可
Jenkins上安装Maven插件
服务器安装Git
yum install -y git
遇到的问题
yum仓库为空
可以http://mirrors.aliyun.com/repo/Centos-7.repo下载仓库
然后放到/etc/yum.repos.d目录下
执行yum clean all yum makecache 即可
Jenkins + Git + Maven 自动化部署配置
1 Git配置
由于是公开的,所以不需要填写凭证
最好使用yum安装git,不然得另外配置git地址,如果没有就好报错
2 Maven配置
3 Pom.xml配置
javahome配置(可选)
1 | /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64 |
报错找不到jdk?
1 | 默认yum安装java的时候会显示安装的是openjdk1.8 实则实际上只安装了jre |
Maven阿里云镜像
修改/usr/local/maven/conf/settings.xml
1 |
|
publish over ssh 配置
1 安装插件
在Configure System菜单里 往下来
2 添加一台目标服务器
3 修改配置
超时机制
输出命令时一定要注意不要让窗口卡主,不然Jenkins会认为认为一直没完成
shell的日志输出
1 | nohup java -jar /root/xxoo/demo*.jar >mylog.log 2>&1 & |
数据流重定向
数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方
标准输入(stdin):代码为0,使用<或<<;
标准输出(stdout):代码为1,使用>或>>;
标准错误输出(stderr):代码为2,使用2>或2>>
> 覆盖写
>> 追加写
运行前清理
配置杀死之前运行的进程
1 | !/bin/bash |
几种构建方式
快照依赖构建/Build whenever a SNAPSHOT dependency is built
- 当依赖的快照被构建时执行本job
触发远程构建 (例如,使用脚本)
- 远程调用本job的restapi时执行本job
http://192.168.131.102:8080/buildByToken/build?job=first&token=123123
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
触发远程构建/gitlab上改动自动构建
代码改动自动可以使用gitlab的webhook回调钩子调起Jenkins的启动任务接口
在构建触发器中配置接口和token
定时构建
Jenkins cron表达式
标准cron
Jenkins cron不是标准的cron表达式
1 | 第一个 * 表示每个小时的第几分钟,取值0~59 |
“/”
表示每隔多长时间,比如 */10 * * * * 表示 每隔10分钟
“H”
hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间
意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * *
,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *
,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。
H的值也可以设置范围
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
源码变更构建
使用Poll SCM 方式与Build periodically一样
会主动定期检查代码托管服务器上是否有变化,一旦发生变化执行job构建
测试报告邮件通知
使用163免费邮箱发送邮件时注意密码填认证码,也就是发送手机短信后给的那个,不要用登录邮箱的密码
类似下面。。
1 | UFOMAPYZRVAEFUEQ |
自动化部署到docker容器中
两种方式:
第三种:云原生方式
会将镜像推送到k8s集群,再由k8s一次启动多个docker容器
直接docker外挂目录执行jar包
1 | docker run -d -p 8888:8888 --privileged=true --name demo2 -v /root/jarfile/Jenkins-demo-0.0.1-SNAPSHOT.jar:/app.jar docker.io/openjdk:11 java -jar app.jar |
Jenkins配置:
前提(先在服务器上run一遍)
更换测试服务器地址
修改pre-steps
修改post-steps
打包到容器内
- 准备一台测试服务器 docker环境
- 准备支持jdk的镜像
1 | FROM openjdk:11 |
- 把jar包打包到容器内
dockerfile
1 | FROM openjdk:11 |
打包构建镜像
1 | docker build -t jenkinsdemo:1.0 . |
配置国内镜像
修改/etc/docker/daemon.json
文件,没有的话创建一个
写入
1 | { |
重启服务
1 | systemctl daemon-reload |
jenkins操作:
pre-step:
post-step:
Jenkins集群/并发构建
集群化构建可以有效提升构建效率,尤其是团队项目比较多或是子项目比较多的时候,可以并发在多台机器上执行构建。
流水线 pipeline
流水线既能作为任务的本身,也能作为Jenkinsfile
使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。
完整语法
5个必备的组成部分
1 | pipeline:整条流水线 |
测试脚本
基础框架
1 | pipeline { |
阶段视图 Stage View
blue ocean可视化界面
全新的流水线控制ui,可重复执行某阶段代码
插件中心搜索blue ocean安装即可
post
流水线完成后可执行的任务
- always 无论流水线或者阶段的完成状态。
- changed 只有当流水线或者阶段完成状态与之前不同时。
- failure 只有当流水线或者阶段状态为”failure”运行。
- success 只有当流水线或者阶段状态为”success”运行。
- unstable 只有当流水线或者阶段状态为”unstable”运行。例如:测试失败。
- aborted 只有当流水线或者阶段状态为”aborted “运行。例如:手动取消。
agent
可以指定执行节点
label 指定运行job的节点标签
any 不指定,由Jenkins分配
1 | pipeline { |
pipeline中执行自动化构建
1 |
|
声明式流水线
好处
- 更像是在Jenkins web ui中的操作
- 可读性比较高
- 可以使用blue ocean自动生成
- 支持语法检查
坏处
- 代码逻辑能力比脚本式弱,不能完成特别复杂的任务
脚本式流水线
好处
- 更少的代码和弱规范要求
- 更灵活的自定义代码操作
- 不受约束,可以构建特别复杂的工作流和流水线
坏处
- 读写对编程要求比较高
- 比声明式流水线代码更复杂