简介
- jenkins
- Jenkins CI,用Jenkins来进行持续集成,需要自己架设服务器
- Travis CI是在线托管的CI服务,用Travis来进行持续集成,不需要自己搭服务器,使用方便,对开源项目是免费的,支持多数主流语言
- https://travis-ci.org/ 非盈利的,为GitHub上Public的repository提供免费服务;对应的也有收费服务
- Travis 要求项目的根目录下面,必须有一个.travis.yml文件。这是配置文件,指定了 Travis 的行为
安装编译及运行
- 本文基于
Jenkins ver. 2.181
、Jenkins ver. 2.164.3
直接安装运行
直接 docker 命令启动
docker volume create jenkins-data
创建 jenkins-data 容器卷,专门存放 jenkins 数据- 启动
1 | # 创建镜像并运行(\后不能有空格) |
基于 docker-compose
1 | # 使用docker-compose |
- 激活:秘钥位置为/var/jenkins_home/secrets/initialAdminPassword,实际存储位置为/data/docker/volumes/jenkins-data/_data/secrets/initialAdminPassword(其中/data/docker 为 docker 默认存储路径,jenkins-data 为容器卷名)
jenkinsci/blueocean 容器中时区为 UTC 无法修改问题(jenkins 程序时区正常),可在
docker-compose.yaml
所在目录创建Dockerfile
文件用于重新构建镜像1
2
3
4
5
6FROM jenkinsci/blueocean:1.18.1
# 使用root用户安装tzdata
USER root
RUN /bin/sh -c apk --no-cache add tzdata
# 切回jenkins用户
USER jenkinsdocker-compose up -d --build
重新编译
k8s-helm 启动
参考http://blog.aezo.cn/2019/06/22/devops/helm/
手动编译运行
基于 stable-2.164 分支。具体参考:https://wiki.jenkins.io/display/JENKINS/Building+Jenkins
- 安装依赖环境:jdk1.8、maven3.5.4+
- maven 版本过低时,maven-enforcer-plugin 校验报错
- 下载源码
git clone https://github.com/jenkinsci/jenkins.git
(可检出 stable-2.164 分支) - maven 编译并打包
- 通过命令行编译
mvn -Plight-test package -DskipTests
- 或者在 IDEA 上操作:勾选 Maven Projects - Profiles - light-test,执行 Jenkins main module - Lifecyle - package
- 编译时会生成
cli/target/generated-sources/Messages.java
If your IDE complains that ‘Messages’ class is not found, they are missing because they are supposed to be generated. Run a Maven build once and you should see them all. If that doesn’t fix the problem, make sure your IDE added target/generated-sources to the compile source roots.
- 打包时会生成 war/node(war/node/yarn)、war/node_modules,并打包静态资源文件
- 通过命令行编译
- Run/Debug 中添加 tomcat 配置,Deployment 选择 jenkins-war:war
- debug 启动 tomcat。也可在远程启动 debug 监听
mvnDebug jenkins-dev:run
默认监听端口 8000,可通过 remote debug 进行远程调试
项目文件说明
- /var/jenkins_home/config.xml 配置文件入口,可对应配置中的表单字段名
Pipeline
- 官网入门
- pipeline 支持的 steps 及支持的相关插件
- 基本的steps命令
- 内置文档
- 对于插件的使用可以参考 Pipeline 脚本编辑处的流水线语法:https://
/job/ /pipeline-syntax/ - 全局变量:https://
/pipeline-syntax/globals
- 对于插件的使用可以参考 Pipeline 脚本编辑处的流水线语法:https://
- 遵循 Groovy 语法规则
- 案例参考下文Pipeline相关
- 一个 Jenkinsfile 就是一个文本文件,Pipeline 支持两种形式,一种是 Declarative 管道,一个是 Scripted 管道
1 | // 1.Declarative风格 比较常用 |
1 | // 系统设置中设置global pipeline libraries,名字为jenkins_library,添加git地址共享库 |
常用插件命令
- 更多可查看下文每个插件的使用或在网站流水线语法中查看
1 | // 1.调用凭证(隐藏密码,暂未发现 Pipeline 如何使用全局密码) |
构建
项目构建界面说明
Workspace
为构建任务源码目录(构建配置中的.
即为此构建源码目录,如/var/jenkins_home/workspace/xx
)Changes
可记录 Git 源码提交记录立即构建
可手动执行此构建任务(一般是通过 Gitlab 触发)Delete 工程
只能删除此构建任务,并不会删除 workspace 目录下的缓存项目源码。可进入容器手动删除/var/jenkins_home/workspace/xx
自由风格构建说明
General
- 限制项目的运行节点
- 可基于节点标签(参考节点管理)或名称进行选择,支持
&&
、||
、!
等运算符
- 可基于节点标签(参考节点管理)或名称进行选择,支持
源码管理(Git)
此处的源码管理指在 jenkins 宿主机上管理任务相应源码,比如打包等操作。如 ofbiz 项目直接在服务器上拉取最新代码时可以不用源码管理,直接在构建中发起远程命令即可
- Repositories:git 仓库配置
- Branches to build:需要构建的分支,如
origin/test
- Additional Behaviours:扩展配置
- Advanced clone behaviours:配置 git clone,对于较多代码拉取可将其中 Timeout 设置成
30
分钟
- Advanced clone behaviours:配置 git clone,对于较多代码拉取可将其中 Timeout 设置成
构建触发器
Build when a change is pushed to GitLab. GitLab webhook URL: http://192.168.1.100/project/test
代码推送等变更时构建,常用(需安装GitLab
插件)- Enabled GitLab triggers
Push Events
直接推送到此分支时构建(去勾选,如直接在 git 客户端将 develop 推送到 test 则无法触发。勾选会产生问题:当在 gitlab 接受 develop 到 test 的请求会产生 2 次构建)Opened Merge Request Events
去勾选Accepted Merge Request Events
接受合并请求时构建(勾选)Closed Merge Request Events
去勾选Approved Merge Requests (EE-only)
(勾选,EE-only 表示只有 gitlab 企业版才支持)Comments
(勾选)Comment (regex) for triggering a build
提交备注正则构建(如:[Jenkins Build]
)
- Allowed branches 允许触发的分支
- Filter branches by name - Include 基于名称进行触发,如:
test
(此时不能写成origin/test
) - Secret token - Generate 生成 token 用于 git webhook 触发
- Filter branches by name - Include 基于名称进行触发,如:
- Gitlab 设置 Webhooks(可设置多个):URL 和 Secret Token 填上文;Trigger 勾选
Push events
、Tag push events
、Merge Request events
(gitlab 提供对配置的 url 进行访问可达测试,需要 jenkins 先保存一遍上述生成的 token)。触发流程如下:- 当开发通过 git 提交代码或进行其他操作触发了 gitlab 此时定义的 Trigger
- 然后 gitlab 会对配置的 URL 进行 post
- 通过 post 的地址会进入到 jenkins 定义的构建任务中
- jenkins 对触发进行过滤,判断是否需要进行构建
- 触发相对比较及时,gitlab 产生后会迅速触发到 jenkins(不用刷新项目页面也自动显示新的构建)。jenkins 产生的构建会备注如
Triggered by GitLab Merge Request #16: my-group-name/develop => test
此时是接受了 develop 到 test 的请求Started by GitLab push by smalle
此时是直接在 git 客户端将 develop 推送到 test
- Enabled GitLab triggers
Gitlab Merge Requests Builder
定时自动生成构建任务(需安装GitLab
插件)
构建环境
- Inject passwords to the build as environment variables
- Global passwords:导入全局密码到环境变量
- Job passwords:定义当前任务需使用的密码
- 如
echo ${MY_PASS}
最终是以***
进行打印
构建(Build)
执行 shell
在 jenkins 运行的机器上执行命令。构建日志中+
表示用户定义的命令Send files or execute commands over SSH
执行 ssh 服务器命令进行构建(需安装插件Publish over SSH
)Exec command
执行远程命令(不会记录在 linux 的 history 中),如1
2
3
4
5
6
7
8
9
10
11
12echo "build ofbiz start..."
# echo $PATH # 此时打印出的是jenkins本地环境的PATH,而不是远程服务器的
# export PATH=/opt/soft/jdk1.7.0_80/bin:/opt/soft/jdk1.7.0_80/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 临时设置PATH为远程服务器PATH,解决java: command not found
# 加载全局配置文件,解决java: command not found
source /etc/profile
cd /home/ofbiz/tools
./stopofbiz.sh
cd ..
git pull
./ant
nohup bash /home/ofbiz/tools/startofbiz.sh > /dev/null 2>&1 &
echo "build ofbiz end..."- 其中
source /etc/profile
为了防止报错java: command not found
(jenkins 不会自动加载环境变量) - 当 windows 启动项目 bat 脚本时,一直有输出的话,Dos 窗口会一直处于等待状态,而 jenkins 的构建时会输出 windows 的脚本运行信息,所以 Jenkins 也会一直处于构建状态。此时可考虑 bat 脚本后台运行,如使用
.vbe
脚本对 bat 文件进行包装
- 其中
调用顶层 Maven 目标
- Maven Version:可选择全局工具配置中配置的 maven,若无此选项可参考下文全局工具配置
- Goals:如
clean package -Dmaven.test.skip=true
- 高级 - POM:可自定义 pom 文件位置,如
my-module-one/pom.xml
构建后操作
E-mail Notification
邮件通知- 勾选
Send e-mail for every unstable build
(每次构建失败都会发送邮件,当从构建失败转为构建成功时也会发邮件,之后构建成功则不发送邮件提醒;测试勾选或不勾选都一样) - 多个邮箱使用空格分开
- 需要先到系统管理中设置邮件发送服务器,其中 SMTP 发件地址需要和系统管理员邮件地址一致
- 勾选
Pipeline 和 Jenkinsfile 构建
本示例 Jenkins 基于 docker 进行安装。参考:https://jenkins.io/zh/doc/tutorials/build-a-java-app-with-maven/#run-jenkins-in-docker
- 创建 Pipeline:新建 Item - 流水线(Pipeline)
- General、构建触发器、高级项目选项此示例可不用填写(实际可按需填写)
- 流水线
- 定义:
Pipeline script
(在 Jenkins 配置中定义 Pipeline 脚本)、Pipeline script from SCM
(从软件配置管理系统,如 Git 仓库获取脚本;可配置脚本所在 Git 仓库的文件路径)
- 定义:
Jenkinsfile
1 | ## Jenkinsfile(保存在Git仓库的jenkins目录) |
构建示例
Jenkins+Docker+Harbor+Gitlab
- 流程图如下 ^2
- 基于 k8s 示例:http://www.mydlq.club/article/8/#wow10
模式一
- Springboot 项目的 pom.xml 加入打包 docker 插件,并手动推送到镜像仓库(如 Harbor)
- jenkins 任务源码从 gitlab 获取,即设置 Gitlab Webhooks
jenkins 构建时分别执行 maven 打包、给服务器发送启动 docker 命令
- 如果是 harbor 构建的镜像,可在 docker 容器中先登录(第一次登录会把认证信息存储起来,下次执行命令无需登录)
1
2
3
4
5
6echo "exec command start..."
source /etc/profile
cd /home/smalle/compose/nginx
sudo docker-compose up -d
echo "exec command end..."
模式二
- 上述流程需要开发先将镜像打包到镜像仓库,此处也可以通过在 jenkins 所在服务器打包(自动处理版本问题)。如下
- 构建触发器参考构建触发器-Gitlab
- 构建环境 - Inject passwords to the build as environment variables - 勾选 Global passwords(全局密码在系统设置中添加)
构建 - Execute Shell(打包镜像并上传到 Harbor)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# Variables
JENKINS_PROJECT_HOME='/var/jenkins_home/workspace/demo'
HARBOR_IP='192.168.1.100:5000' # 也可设置成全局变量
REPOSITORIES='test/demo'
HARBOR_USER='test'
# 尽管jenkins容器中执行的是宿主机docker命令,且宿主机已经认证过,但此处仍需认证. G_PASS_HARBOR_USER为全局密码变量(Global Passwords)
echo ${G_PASS_HARBOR_USER} | docker login -u ${HARBOR_USER} --password-stdin ${HARBOR_IP}
# 删除本地历史构建的镜像(镜像历史会保存在镜像仓库不用担心丢失)
IMAGE_ID=`docker images | grep ${REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ]; then
docker rmi ${IMAGE_ID} || true # 执行失败继续执行后续命令。如k8s环境有可能编译节点和运行节点相同导致镜像占用无法删除(未使用的镜像仍然可以删除)
fi
# Build image.
cd ${JENKINS_PROJECT_HOME} # 默认就是项目的工作空间(源码根目录),此处cd可结合jenkins-agent使用。自定义工作目录可用于k8s-jenkins保存源码目录供下次编译使用,参考下文节点管理
DOCKER_TAG=`date +%y%m%d-%H%M%S` # 190902-165827
docker build --rm -t ${HARBOR_IP}/${REPOSITORIES}:${DOCKER_TAG} --build-arg APP_VERSION=v${DOCKER_TAG} -f ./docker/Dockerfile .
# Push to the harbor registry.
docker push ${HARBOR_IP}/${REPOSITORIES}:${DOCKER_TAG}
# 保存环境变量到工作目录文件中供其他shell使用(配合EnvInject Plugin)
echo "DOCKER_TAG=${DOCKER_TAG}" > ./env_jenkins.sh构建 - Inject environment variables(注入上一个 shell 的环境变量文件),参考本文 Environment Injector 插件>)
构建 - over SSH(执行 helm 部署 Pod)
1
2HELM_NAME='demo'
sudo /usr/local/bin/helm upgrade --set image.tag=${DOCKER_TAG} ${HELM_NAME} /root/helm-chart/test/${HELM_NAME}
(推荐)Pipeline+K8s+Harbor+Gitlab+Springboot+Maven(可改成Declarative风格)
- 创建项目 - 风格选择 Pipeline
- General:(为了安全)勾选不允许并发构建、(为了提升效率)勾选流水线效率、持久保存设置覆盖(Performance-optimized…)
- 构建触发器参考构建触发器-Gitlab
- 流水线 - Pipeline script(另一个选项为 Pipeline script from SCM)
- 勾选
使用 Groovy 沙盒
- Jenkinsfile 脚本
- 勾选
1 | // 声明执行Helm的方法 |
springboot 项目配置
1
2
3
4
5
6
7
8
9
10# git项目文件结构
|-- oa-dev-center-web
|-- oa-dev-center-api
|---- src
|---- devops
|------ runboot.sh
|------ values.yaml # helm charts values.yaml
|------ wait-for-it.sh
|---- Dockerfile
|---- pom.xml常见问题
- 第一次构建可能报错
Scripts not permitted to use method org.apache.maven.model.Model getArtifactId
,是因为在沙箱环境下 getArtifactId 等脚本方法需要管理员通过才可执行- 解决:在系统管理 - In-process Script Approval - approved(method org.apache.maven.model.Model getArtifactId)
- 访问 api server 时,需要对应的 ServiceAccount 账号,此处可直接使用 Tiller 的 sa 账号。获取方式如
kubectl get secret $(kubectl get secret -n kube-system|grep tiller-token|awk '{print $1}') -n kube-system -o jsonpath={.data.token}|base64 -d |xargs echo
,将秘钥保存到 jenkins 凭证中获取凭证 ID 供 Pipeline 脚本使用
- 第一次构建可能报错
Pipeline(Declarative)+Windows+Gilab
- General
- 勾选流水线效率、持久保存设置覆盖
- 去勾选不允许并发构建
- 多个触发会创建多个agent来进行构建
- 一个触发构建执行完成后会自动删除agent/workspace/job中从git仓库获取的文件,像脚本中创建的不会自动删除
- 构建触发器(其他配置参考上文)
- 选择Filter branches by regex
- Target Branch Regex如
test|master|fixbug|test-.*
(只要目标分支为其中一个就会触发构建)
- Target Branch Regex如
- 选择Filter branches by regex
- 流水线
- Pipeline script from SCM - Git
- Repository URL 为
${gitlabTargetRepoHttpUrl}
(基于gitlab hook注入到jenkins的环境变量自动获取需要构建的git仓库地址) - Branches to build 为
origin/${gitlabTargetBranch}
(自动获取分支) - 脚本路径为
devops/Jenkinsfile
- 轻量级检出
- git仓库需要存放
devops/Jenkinsfile
文件- 此案例只需要定义一个jenkins job便可构建多个项目。缺点时获取的构建变更不准确
1 | /** |
系统管理(Manage Jenkins)
系统设置(Configure System)
- 主目录:基于 docker 安装时一般为
/var/jenkins_home
- 全局属性
- 环境变量:自定义全局环境变量,在所有任务中均可使用
- Jenkins Location
- Jenkins URL:jenkins 的路径,如:
http://192.168.1.100:8080/
。如果此处配置成外网,当通过内网访问时会提示反向代理设置有误
,但是不影响使用。发送的邮件中一般会用到此地址 - 系统管理员邮件地址:此地址需要和 SMTP 发件地址一致,如:
aezo-jenkins<test@example.com>
(from 地址可添加昵称:昵称<from>
)
- Jenkins URL:jenkins 的路径,如:
- Global Passwords:全局密码(Pipeline 无法使用,但可配合 withCredentials 使用凭证功能)
- 使用:通过【构建环境-Inject passwords to the build as environment variables】导入密码到环境变量
- 邮件通知:配置 smtp 服务器
- SMTP server 不能带端口
- 其中 SMTP 发件地址需要和系统管理员邮件地址一致
- Publish over SSH
- SSH Servers:配置目标服务器,高级功能中可使用 HTTP/SOCKS5 代理(可能存在测试代理连接失败 BUG,但是可以正常使用)
全局工具配置(Global Tool Configuration)
- Maven ^1
- 安装 Jenkins 默认不含 maven,可通过下列方法解决
- docker 安装 Jenkins 时,pipeline 风格可在
agant
中运行 maven 镜像 - 自由风格可使用宿主机 maven 或通过 jenkins 自动安装
- docker 安装 Jenkins 时,pipeline 风格可在
- 使用宿主机 maven 配置:Name
maven3.6
;去勾选自动安装;MAVEN_HOME 填写宿主机目录(如果是 docker 安装的 jenkins 可将本地 maven 安装目录挂载到容器目录如/var/maven_home,然后此处使用/var/maven_home) - 通过 jenkins 自动安装
- 配置:Name
maven3.6
;勾选自动安装;Version3.6.1
(之后重新进入此配置页面,可能默认不会显示之前的配置) - 需要安装
Maven Integration
插件 - 进行了上述配置和插件安装默认还是不会自动安装 maven,需要
构建一个maven项目
,然后构建此项目才会自动安装(安装成功后,在资源风格项目中也可以使用)
- 配置:Name
- 自动安装的 maven 插件位置:
/data/docker/volumes/jenkins-data/_data/tools/hudson.tasks.Maven_MavenInstallation/maven3.6
(基于 docker 安装 jenkins)- 可修改
conf/settings.xml
相关配置,如配置阿里云镜像地址
- 可修改
- maven 仓库默认保存在宿主机的
/root/.m2
目录
- 安装 Jenkins 默认不含 maven,可通过下列方法解决
插件管理
- 修改插件镜像地址
- 插件管理 - 高级 - 升级站点URL设置成
https://updates.jenkins-zh.cn/update-center.json
- 提交 - 立即获取
- 插件管理 - 高级 - 升级站点URL设置成
默认安装插件
- Git(内置 git 客户端)
其他插件推荐
Publish over SSH(执行远程命令)
- src、wiki
- 利用此插件可以连接远程 Linux 服务器,进行文件的上传或是命令的提交;也可以连接提供 SSH 服务的 windows 服务器,windows 提供 ssh 服务参考windows.md#ssh 服务器#PowerShell Server
- BapSshHostConfiguration#createClient 进行服务器连接
- 此插件 1.20.1 界面
Test Configuration
测试代理连接存在 bug,实际是支持代理连接的 - Pipeline 使用
1 | // configName为系统设置的SSH服务器名 |
GitLab
- wiki
- 允许 GitLab 触发 Jenkins 构建并在 GitLab UI 中显示结果
- gitlab 触发 webhook 时,会设置一些变量到环境中,如:gitlabTargetRepoHttpUrl、gitlabSourceBranch、gitlabTargetBranch、gitlabMergeRequestTitle、gitlabActionType。详见:https://github.com/jenkinsci/gitlab-plugin#defined-variables
Maven Integration
- 使用:新建 Item - 构建一个 maven 项目
- 项目配置:Goals and options
clean install -Dmaven.test.skip=true
Localization: Chinese (Simplified)
- 界面汉化(汉化部分,Local 插件也只能汉化部分)
Docker plugin
- 提供使用 jenkins 进行镜像编译、推送到 Harbor 等镜像仓库(也可通过 maven 插件配置 docker 镜像编译和推送)
Ant
- 构建 - 增加构建步骤 - Invoke Ant
- 安装的插件不能通过 shell 命令执行 ant
Environment Injector(注入环境变量)
- wiki
同一个 Job 不同 shell 参数传递
- 如果涉及到 over SSH 远程命令调用则必须使用文件进行参数传递
1
2
3
4
5
6
7
8
9
10## Build - 执行Shell(将环境变量保存到当前工作目录的文件中)
DOCKER_TAG=`date +%Y%m%d-%H%M%S`
echo "DOCKER_TAG=${DOCKER_TAG}" > ./env_jenkins.sh
## Build - Inject environment variables(从当前工作目录载入文件读取其环境变量并注入到当前环境)
Properties File Path=./env_jenkins.sh
# Properties Content中也可以定义参数,但是通过本地shell修改后,在over SSH中不能生效(还是拿到原始Properties Content中定义的参数值)
## Build - Send files or execute commands over SSH
echo ${DOCKER_TAG}可通过 linux 命令
printenv
打印所有环境变量
Email Extension
- 邮件发送扩展 ^3
- 原本 jenkins 自带邮件发送功能,但是不够强大,参考系统设置(Configure System)>)
- 此扩展可自定义何时(成功、失败等)出发邮件发送
- 相应配置在【系统管理-系统配置-Extended E-mail Notification】中
- 配置 smtp 认证同 jenkins 自带邮件发送
- Allowed Domains 可配置允许发送邮件的域
- Default Content Type:HTML (text/html)
- Default Subject:【jenkins】$PROJECT_NAME: $BUILD_STATUS! (Build #\$BUILD_NUMBER)
- Default Content:Email-Extension-Default-Content
- Default Pre-send Script:可不设置。该脚本将在发送电子邮件之前运行,以允许在发送之前修改电子邮件;也可以通过将布尔变量 cancel 设置为 true 来取消发送电子邮件;在任务设置中可编辑此项或使用\${DEFAULT_PRESEND_SCRIPT}导入此系统配置
- 任务设置:构建后操作-Editable Email Notification
- Advanced Settings…
- Triggers - Add Trigger - [Success(构建成功)/Failure - Any(所有失败)/Always(一直)]
- Send To:默认选中了
Developers
这个组。即给此次合并提交所涉及的开发发送邮件(从 git 信息中提取邮箱) - 高级
- Recipient List:收件人(除了 Send To 中的收件人,此处可额外定义收件人)。如:`a@example.com,cc:b@example.com,bcc:c@example.com`(CC 抄送,BCC 密件抄送)
- Content Type:HTML (text/html)
- Attach Build Log:Attach Build Log
- Send To:默认选中了
- Triggers - Add Trigger - [Success(构建成功)/Failure - Any(所有失败)/Always(一直)]
- Advanced Settings…
Kubernetes(连接k8s创建jenkins-agent)
- 在 Kubernetes 集群中运行动态代理节点(agent)的 Jenkins 插件,参考
- 安装此插件增加的扩展配置:系统管理 - 系统配置 - 云
- 名称:默认
kubernetes
- Kubernetes 地址:
https://kubernetes.default.svc.cluster.local
,或者省略svc.cluster.local
,即https://kubernetes.default - Kubernetes 命名空间:留空或 default
- 凭据:留空(默认使用 jenkins 主 pod 的 ServiceAccount 账号访问 k8 api server)
- Jenkins 地址:
http://jenkins.devops:8080
,此处 jenkins 基于 k8s 部署,中间表示服务名称.命名空间
- Jenkins 通道:agent 通过 jnlp 和 jenkins 通信通道,此处如
jenkins-agent.devops:50000
(jenkins-agent 为 k8s 服务名,如果 jenkins 普通部署此处填 jenkins 的 hostname 即可)。此处的 50000 需要 k8s 暴露到服务层,对应 jenkins-pod 的端口也是 50000(在系统配置-全局安全配置-代理-TCP port for inbound agents-指定端口 50000) - 添加模板,创建 agent 的 Pod 模板(Kubernetes Pod Template),可以创建多个模板
- 名称:jnlp-agent
- 命名空间:agent-pod 运行的命名空间,留空则和 jenkins-pod 运行于同一空间
- 标签列表(label):
jnlp-agent
可用于构建时基于标签选择不同的 Pod Template - 卷(如 agent 需要执行 docker 等命令,可挂载 jenkins pod 宿主机的 docker。下文pod中为在 agent pod 中包含 docker 容器,因此此选项可不操作)
- 增加 Host Path Volume(为了让此 agent 可以调用宿主机的 docker 命令)
- 主机路径、挂载路径:/var/run/docker.sock
- 主机路径、挂载路径:/usr/bin/docker
- 增加 Host Path Volume(为了让此 agent 可以调用宿主机的 docker 命令)
- Pod 的原始 yaml(具体配置见下文。pod 基础配置,策略为 Override 则表示,上述配置如果和原始 yaml 重复则按照上述配置来)
- Yaml merge strategy:Override
- Show raw yaml in console:勾选表示jenkins构建日志中会显示agent的pod-yaml配置,调试的时候可以勾选
- 名称:默认
- Pod 的原始 yaml
1 | # 需要使用空格排版 |
Kubernetes CLI Plugin
- 可执行 k8s 命令
1 | // 提供 kubectl 执行的环境,其中得设置存储了 token 的凭据ID和 kubernetes api 地址(需要此service account token有权限获取nodes) |
Config File Provider
- 配置管理 - Managed files
如配置全局 maven 的 setting.xml
- Add a new Config - Global Maven settings.xml - 修改 maven 镜像为阿里云镜像
会生成一个全局 ID,可在 Pipeline 中使用
1
2
3configFileProvider([configFile(fileId: "15263da5-15d5-4bb5-abb7-5dd604def581", targetLocation: "settings.xml")]) {
sh "mvn clean install -Dmaven.test.skip=true --settings settings.xml"
}
Pipeline Utility Steps
- 功能:提取/创建 Zip 文件、生成(yaml)文件、读取 maven 项目的 pom.xml 文件(参数)、读取 properties 文件参数、从工作区中的文件中读取 JSON、在工作区中查找文件
Pipeline 模式下使用
1
2
3// 读取 pom.xml 文件
pom = readMavenPom file: "./pom.xml"
echo "${pom.artifactId}:${pom.version}"
节点管理(Manage Nodes)
- jenkins 支持分布式部署,此处可设置每个节点的构建队列个数
- 基于 k8s-helm 运行 jenkins 可配置成自动根据任务量创建 slave 节点。参考http://blog.aezo.cn/2019/06/22/devops/helm/
- 新建节点(agent)
- 远程工作目录如
/var/jenkins_home/jenkins-agent/agent-ofbiz
(最终保存于 jenkins-master 家目录;通过此节点构建的项目,其工作空间保存于此目录) - 标签如
agent-ofbiz
(配合General中”限制项目的运行节点”配置使用) - 启动方式 Launch command 如
java -jar /var/jenkins_home/bin/agent.jar
- 点击
Launch command
后面的帮助,可下载agent.jar
- 需将
agent.jar
复制到 jenkins-master 家目录的 bin 目录下
- 点击
- 可用性,如选择”有需要的时候保持代理在线,当空闲时离线”。对应子配置
In demand delay=0; Idle delay=15
(任务构建延迟 0 分钟,节点如果空闲 15 分钟则停止) - 基于 k8s-helm 运行 jenkins 存储问题:任务的工作目录保存在 slave 节点,每次执行完任务后,slave 节点删除,工作空间丢失。此时可自定义一个 agent,用于构建类似 ofbiz 等需要保存工作空间的项目
- 远程工作目录如
其他配置
常见问题
- 出现
Dependency errors
和Downstream dependency errors
可根据提示升级对应插件,如果需要升级 jenkins 可以考虑忽略
jenkins 源码解析
- jenkins 数据全部存储在内存或者文件中,启动 jenkins 前提前设置环境变量
JENKINS_HOME
则会在此目录生成数据文件.- JENKINS_HOME/plugins 为插件目录,安装的插件也都存放于此,如果需要 debugger 插件则将对应插件目录中的 jar 添加到 war 模块的依赖中去
kohsuke
kohsuke 为 jenkins 使用的 servlet 框架,亦是 jenkins 创始人 kohsuke 名字
- 测试如访问 http://localhost:8080/api/ 、 http://localhost:8080/api/json/ 、http://localhost:8080/newJob/
- jenkins 中 war 模块为最终打包的入口模块,此模块会引用 core、cli 模块。此模块
web.xml
配置如下
1 | <servlet> |
- Hudson(core)和 Jenkins(core)
- hudson.model.Hudson extends hudson.model.Jenkins
- hudson.model.Jenkins implements org.kohsuke.stapler.StaplerProxy, org.kohsuke.stapler.StaplerFallback
Stapler
内中主要的处理方法在tryInvoke
中
1 | boolean tryInvoke(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException { |
org.kohsuke.stapler.NameBasedDispatcher extends Dispatcher
。如node.methods.prefix("get")
提出的都是通过NameBasedDispatcher
进行包装的
1 | public final boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException, IllegalAccessException, InvocationTargetException { |
附件
Email-Extension-Default-Content
1 |
|
参考文章