本系列文章将介绍如何在码云搭建 CI 构建和 CLA 签署服务,共分为三篇:
搭建码云 CI 和 CLA 签署服务(一)- 开源项目自动化构建与协议签署
搭建码云 CI 和 CLA 签署服务(二)- Jenkins 安装配置与部署
搭建码云 CI 和 CLA 签署服务(三)- CLA 签署检查服务搭建
本文为第二篇,详细记录 Jenkins 安装配置的步骤及注意事项。
一、Jenkins 服务搭建
建议使用 Docker 搭建,干净优雅,平台通杀,免去自己折腾一堆 java 环境(系统需提前安装 Docker 环境)。
常规安装部署
如果仅仅是想跑起来,按照官方文档,一步步走完问题不大。
dood 安装部署(推荐)
为了能够对每次构建隔离,保持系统环境一致,更好的方式是在新的容器中执行构建,这涉及到「在 docker 中使用 docker」的两种方式 —— dind 和 dood。
dind vs dood
dind(docker in docker):在容器中安装一个全新的完整的隔离的 Docker 版本,该容器和外部的 Docker 系统完全隔离。
dood(Docker outside of Docker):通过加载宿主 Docker socket 程序的方式达成重用宿主镜像的目的。
官方镜像使用 dind 套娃的方式(基于 docker:dind
镜像),说到底还只是在同一个容器里面跑,不便于安装编译环境,也不利于针对不同项目制作独立镜像。而 dood 能够共享宿主机 Docker 资源,便于使用和管理,因此下文会详细介绍 dood 方式搭建 Jenkins 构建环境。
其中实现 dood 的一种方法,就是先挂载 docker.sock
文件运行 jenkins:lts
镜像,把容器 Docker 和宿主机 Docker 程序关联(映射为同一个程序),然后在容器安装 Docker,这时两个 Docker 便能互相访问。
下面这篇文章很有参考价值:
Jenkins dood 搭建教程:The simple way to run Docker-in-Docker for CI - Releaseworks Academy
在上面链接教程的基础上,加上数据持久化(创建、挂载数据卷)、root 权限等命令参数,运行 Docker 容器,完整步骤如下:
1. 创建数据卷:
docker volume create jenkins-data
2. 后台启动容器,基于 hub 官方 jenkins 镜像:
docker run -d --restart always \
-p 8085:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
--hostname jenkins \
--volume jenkins-data:/var/jenkins_home \
jenkins/jenkins:lts
说明:若宿主机 8080
端口被占用,可映射到其他空闲端口号,如上述的 8085
。/var/jenkins_home
目录保存 Jenkins 的所有配置信息,需要使用 Docker volume 做持久化。
3. 进入容器:
docker exec -u root -it jenkins bash
4. 更换软件源:
sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
5. 容器内安装 Docker:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
6. 验证 dood 环境安装结果
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
36ee6f8b0b78 jenkins 0.21% 176.5MiB / 991.8MiB 17.80% 268MB / 6.6MB 0B / 0B 41
通过 docker stats
能看到容器自身信息,说明 dood 环境准备就绪,服务器访问 http://jenkins.rt-thread.org/
,正常显示 Jenkins 登录页面,服务部署成功。
说明:文中的 jenkins.rt-thread.org
是已经定向到主机 ip 8085 端口的域名,调试请访问对应的主机 ip 和端口号(如 xxx.xxx.xxx.xxx:8085
)。
二、Jenkins 基本配置
搭建好 Jenkins 服务之后,需要进行网页端配置并添加码云项目。
访问 Jenkins 前端页面 https://jenkins.rt-thread.org/,等待程序加载完成。
Jenkins 初始配置
复制初始密码解锁 Jenkins
# docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
5t3d6e3007b456456gjf95d29f182c1d
插件换源
进入容器内执行:
sed -i 's/https:\/\/updates.jenkins.io\/update-center.json/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins\/updates\/update-center.json/g' \
/var/jenkins_home/hudson.model.UpdateCenter.xml
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' \
/var/jenkins_home/updates/default.json
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' \
/var/jenkins_home/updates/default.json
浏览器访问 https://jenkins.rt-thread.org/restart 重启生效。
安装推荐插件
创建管理员账号
Username: rtthread
Password: yourpassword
实例配置,保持默认
进入主界面
Gitee 插件安装
- 方式一:在线安装
- 前往 Manage Jenkins -> Manage Plugins -> Available
- 右侧 Filter 输入: Gitee
- 下方可选列表中勾选 Gitee(如列表中不存在 Gitee,则点击 Check now 更新插件列表)
- 点击 Download now and install after restart
- 方式二:手动安装(在线安装失败时备选)
- 从 release 列表中进入最新发行版,下载对应的 XXX.hpi 文件
- 前往 Manage Jenkins -> Manage Plugins -> Advanced
- Upload Plugin File 中选择刚才下载的 XXX.hpi 点击 Upload
- 后续页面中勾选 Restart Jenkins when installation is complete and no jobs are running
- 勾选安装完成后重启 Jenkins
- 使用管理员账号重新登录,完成安装
Gitee 插件配置
添加码云链接配置
- 前往
Jenkins -> Manage Jenkins -> Configure System -> Gitee Configuration -> Gitee connections
- 在
Connection name
中输入 Gitee 或者你想要的名字 Gitee host URL
中输入码云完整 URL地址: https://gitee.com (码云私有化客户输入部署的域名)Credentials
中如还未配置码云 APIV5 私人令牌,点击Add - > Jenkins
Domain
选择Global credentials
Kind
选择Gitee API Token
Scope
选择你需要的范围Gitee API Token
输入你的码云私人令牌,获取地址:https://gitee.com/profile/personal_access_tokensID
,Descripiton
中输入你想要的 ID 和描述即可。Credentials
选择配置好的 Gitee APIV5 Token- 点击
Advanced
,可配置是否忽略 SSL 错误(适您的 Jenkins 环境是否支持),并可设置链接测超时时间(适您的网络环境而定) - 点击
Test Connection
测试链接是否成功,如失败请检查以上 3,5,6 步骤。
注:如果 Token 添加失败,可在 系统管理 -> 凭据配置 -> Manage Credentials -> Stores scoped to Jenkins -> 全局凭据 (unrestricted) -> 添加凭据
菜单处添加全局凭据。
三、Jenkins 使用
前期配置安装工作完成,就可以新建任务使用 Jenkins 创建 Gitee CI 任务。
新建流水线任务
任务配置
- General 配置
Gitee 链接选择前面添加的名称
-
构建触发器配置
- 勾选
Gitee webhook 触发构建
,并复制旁边提示的 URLhttps://jenkins.rt-thread.org/gitee-project/rt-thread
,用于配置码云 Webhook - 构建策略选择
新建 Pull Requests
、更新 Pull Requests(Source Branch updated)
- 评论内容的正则表达式填写
/retry-build
,用与评论触发构建 - 取消勾选
PR 不要求必须测试时过滤构建
- 生成 Gitee WebHook 密码,并复制(a1be0c9ca9ce6041b9ee267a03768cc9)
- 勾选
-
流水线配置
定义
处下拉选择Pipeline script from SCM
,SCM
处下拉选择Git
- 输入你的仓库地址,例如 git@your.gitee.server:gitee_group/gitee_project.git
- 点击 Advanced 按钮, Name 字段中输入 origin, Refspec 字段输入
+refs/heads/*:refs/remotes/origin/* +refs/pull/*/MERGE:refs/pull/*/MERGE
- Branch Specifier 选项输入
pull/${giteePullRequestIid}/MERGE
-
保存设置
码云仓库 WebHook 配置
码云端通过 WebHook 通知 Jenkins,触发流水线构建事件。因此需要在 Gitee 项目中增加一个 WebHook。
打开待配置的码云项目页面,进入 管理 -> WebHooks
- 添加 WebHook, URL 填写 触发器配置处所复制 URL
- 密码填写:触发器配置中点击生成的 WebHook 密码并填入
- 勾选 Push、Pull Request、评论事件
流水线测试
WebHook 请求测试
在仓库主页 -> 管理 -> WebHooks
中,点击测试按钮,此时 Gitee 会发起一次 WebHook 请求,码云端收到 200 返回表示测试成功。
Jenkinsfile 编译脚本测试
在仓库根目录新建 Jenkinsfile
文件,写入以下测试脚本:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Hello World"'
sh '''
echo "Multiline shell steps works too"
ls -lah
'''
}
}
}
}
使用 git add、commit 并 push 到码云仓库(或者在网页端直接操作),发起 PR 触发编译。完成后查看 console log
,可看到 Jenkinsfile
中的脚本命令被执行,测试成功。
进阶设置
使用 Docker 运行流水线
使用 ubuntu_ci:latest
指定 Docker 镜像(前提是镜像存在,并配置好 dood 环境),创建临时容器执行构建任务,完成后自动删除容器。
pipeline {
agent {
docker {
image 'ubuntu_ci:latest'
}
}
stages {
stage('Build') {
steps {
sh 'echo "Hello World"'
sh '''
echo "Multiline shell steps works too"
ls -lah
'''
}
}
}
}
构建结果返回
在 post
阶段调用 Gitee 评论接口反馈构建结果,成功或者失败,并给出 job 详情页面链接。
Jenkinsfile 增加以下代码:
pipeline {
agent {
docker {
image 'ubuntu_ci:latest'
}
}
stages {
stage('Build') {
steps {
sh 'echo "Hello World"'
sh '''
echo "Multiline shell steps works too"
ls -lah
'''
}
}
}
post {
failure {
addGiteeMRComment(comment: """:x: Jenkins CI 构建失败。\n\n \
查看更多日志详细信息: \
<a href="${env.RUN_DISPLAY_URL}">Jenkins[${env.JOB_NAME} # ${env.BUILD_NUMBER}]</a> \
<hr /> \
:x: The Jenkins CI build failed.\n\n \
Results available at: \
<a href="${env.RUN_DISPLAY_URL}">Jenkins[${env.JOB_NAME} # ${env.BUILD_NUMBER}]</a>""")
}
success {
addGiteeMRComment(comment: """:white_check_mark: Jenkins CI 构建通过。\n\n \
查看更多日志详细信息: \
<a href="${env.RUN_DISPLAY_URL}">Jenkins[${env.JOB_NAME} # ${env.BUILD_NUMBER}]</a> \
<hr /> \
:white_check_mark: The Jenkins CI build passed.\n\n \
Results available at: \
<a href="${env.RUN_DISPLAY_URL}">Jenkins[${env.JOB_NAME} # ${env.BUILD_NUMBER}]</a>""")
}
}
}
说明:使用 env.RUN_DISPLAY_URL
或 env.BUILD_URL
变量,均可获取构建详细日志页面, env.RUN_DISPLAY_URL
为 Blue Ocean 方式显示(需要安装 blue ocean 插件),env.BUILD_URL
为原始 log 页面。
由于要对外展示构建详细日志页面,需设置系统管理 -> 全局安全配置 -> 授权策略 -> 匿名用户具有可读权限 -> 中允许匿名用户访问
。
至此,一个支持码云的 Jenkins CI 构建环境搭建配置完毕。
下一篇搭 CLA。
参考资料