Jenkins 踩坑总结
总结使用过程中遇到的一些坑
-> Gitlab 仓库拉取失败
在任务中填写正确的 gitlab仓库地址及凭据后提示仓库不存在或者鉴权失败
-> 参考
-> 解决方案
- 在 http链接中填写项目所有者信息
#before: https://gitlab.com/my_gitlab_user/myrepo.git #after: https://[email protected]/my_gitlab_user/myrepo.git
1
2
3
4 - 使用 ssh+git地址链接
-> 使用 HTTP地址的 Gitlab仓库信息错乱
gitlab仓库地址使用 HTTP链接时,流水线任务构建时会出现找不到正确的分支及提交信息错乱的bug
-> 参考
- Jenkins will not match repository if pulling from HTTP (opens new window)
- the gitlab plugin can not get the correct branch (opens new window)
-> 解决方案
插件 bug修复前使用 ssh+git地址链接
-> 修改子节点环境变量不生效
子节点和 master节点建立连接后再去修改子节点环境变量不生效
-> 参考
-> 解决方案
断开连接,重新建立
-> 无效日志频繁打印
-> 参考
-> 解决方案
增加全局日志过滤器,Jenkins->Manage->System Log->Log Levels
-> 多分支流水线 webhook不生效
多分支流水线存在重启后 webhook不生效,甚至配置丢失的情况
-> 参考
保存配置后点击立即扫描该项目可修复
-> 如何中断流水线
currentBuild.result = 'ABORTED'
error('Aborting the build.')
1
2
2
-> 如何重置构建ID
到 http:<jenkins-url>/script
下执行
item = Jenkins.instance.getItemByFullName("<FULL-PROJECT-NAME>")
//THIS WILL REMOVE ALL BUILD HISTORY
item.builds.each() { build ->
build.delete()
}
item.updateNextBuildNumber(1)
1
2
3
4
5
6
2
3
4
5
6
-> 计算human readable时间差
- 到 /scriptApproval 下增加如下授权:
staticMethod groovy.time.TimeCategory minus java.util.Date java.util.Date
- groovy语法如下:
import groovy.time.TimeCategory
import groovy.time.TimeDuration
Date start = new Date(currentBuild.startTimeInMillis)
Date now = new Date()
TimeDuration td = TimeCategory.minus( now, start )
println td
1
2
3
4
5
6
7
2
3
4
5
6
7
-> 所有post 步骤
包含如下阶段:
always, changed, fixed, regression, aborted, success, unsuccessful, unstable, failure, notBuilt, cleanup
-> 在 post步骤中设置 node参数
post {
always{
node('master'){
echo "always echo"
echo "WORKSPACE: ${env.WORKSPACE}"
}
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
-> 流水线任务中触发另一任务
build job: '${PROJECT_NAME}/${BRANCH_NAME}', parameters: [
booleanParam(name: 'BOOL', value: true),
string(name: 'STRING', value: "string"),
extendedChoice(name: 'CHOICE', value: "any value you want")
],
propagate: false, wait: false
1
2
3
4
5
6
2
3
4
5
6
-> 脚本授权
到 http:<jenkins-url>/script
下执行
def scriptApproval = org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval.get()
String[] signs = [
//eg:
"method groovy.time.BaseDuration getHours",
"method groovy.time.BaseDuration getMinutes",
"method groovy.time.BaseDuration getSeconds"
]
for( String sign : signs ) {
scriptApproval.approveSignature(sign)
}
scriptApproval.save()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
-> 取消排队任务
到 http:<jenkins-url>/script
下执行
import hudson.model.*
def q = Jenkins.instance.queue
q.items.findAll { it.task.name !='' }.each { q.cancel(it.task) }
// q.items.findAll { it.task.name.toLowerCase().startsWith('JobName') }.each { q.cancel(it.task) }
1
2
3
4
5
6
2
3
4
5
6
-> bat多行字符串执行bug
windows上使用 bat执行命令总有编码问题,使用 chcp 65001指定编码时,多行字符串总被截断。
该问题简直无解,建议换成 powershell
执行
powershell script: """
chcp 65001
${cmd}""", label: 'launch command', encoding: 'UTF-8'
1
2
3
2
3
-> 捕获 timeout超时错误
timeout 错误在 retry
步骤下不生效,还是会直接退出。
需要捕获该错误,然后抛出一种可以被 retry捕获的错误
try{
timeout(time: 1, unit: 'HOURS') {
//statement
}
}catch(org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){
error(e.toString());
}
1
2
3
4
5
6
7
2
3
4
5
6
7
-> 密码加密解密
// 加密
hudson.util.Secret.fromString("passwd").getEncryptedValue()
// 解密
hudson.util.Secret.fromString("{XXX=}").getPlainText()
1
2
3
4
2
3
4
编辑此页 (opens new window)
更新于: 2019-10-01