BluePen BluePen
  • Jenkins
  • OS
  • 算法
随笔
分类
标签
归档
关于
留言板
GitHub (opens new window)

Alex

一个好人
  • Jenkins
  • OS
  • 算法
随笔
分类
标签
归档
关于
留言板
GitHub (opens new window)
  • Jenkins 安装
  • Jenkins 权限控制
  • Jenkins 环境变量
  • 流水线语法
  • 流水线任务
  • Jenkins 邮件通知
  • Jenkins 参数化构建
  • Jenkins 使用 FTP插件上传文件
  • Jenkins 使用提交信息
  • Jenkins 执行命令和脚本
  • 多分支流水线插件
  • Jenkins REST api
  • Jenkins 踩坑总结
    • Gitlab 仓库拉取失败
    • 使用 HTTP地址的 Gitlab仓库信息错乱
    • 修改子节点环境变量不生效
    • 无效日志频繁打印
    • 多分支流水线 webhook不生效
    • 如何中断流水线
    • 如何重置构建ID
    • 计算human readable时间差
    • 所有post 步骤
    • 在 post步骤中设置 node参数
    • 流水线任务中触发另一任务
    • 脚本授权
    • 取消排队任务
    • bat多行字符串执行bug
    • 捕获 timeout超时错误
    • 密码加密解密
  • Jenkins
Alex
2019-10-01
目录

Jenkins 踩坑总结

总结使用过程中遇到的一些坑

-> Gitlab 仓库拉取失败

在任务中填写正确的 gitlab仓库地址及凭据后提示仓库不存在或者鉴权失败

-> 参考

  • The project you were looking for could not be found (opens new window)

-> 解决方案

  • 在 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节点建立连接后再去修改子节点环境变量不生效

-> 参考

  • Changes to slave environment variables are ignored by master (opens new window)

-> 解决方案

断开连接,重新建立

-> 无效日志频繁打印

-> 参考

  • hudson.security.csrf.CrumbFilter (opens new window)

-> 解决方案

增加全局日志过滤器,Jenkins->Manage->System Log->Log Levels log_filter

-> 多分支流水线 webhook不生效

多分支流水线存在重启后 webhook不生效,甚至配置丢失的情况

-> 参考

  • JENKINS-60143 (opens new window)

保存配置后点击立即扫描该项目可修复

-> 如何中断流水线

currentBuild.result = 'ABORTED'
error('Aborting the build.')
1
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

-> 计算human readable时间差

  1. 到 /scriptApproval 下增加如下授权: staticMethod groovy.time.TimeCategory minus java.util.Date java.util.Date
  2. 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

-> 所有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

-> 流水线任务中触发另一任务

  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

-> 脚本授权

到 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

-> 取消排队任务

到 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

-> bat多行字符串执行bug

windows上使用 bat执行命令总有编码问题,使用 chcp 65001指定编码时,多行字符串总被截断。
该问题简直无解,建议换成 powershell执行

powershell script: """
    chcp 65001
    ${cmd}""", label: 'launch command', encoding: 'UTF-8'
1
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

-> 密码加密解密

// 加密
hudson.util.Secret.fromString("passwd").getEncryptedValue()
// 解密
hudson.util.Secret.fromString("{XXX=}").getPlainText()
1
2
3
4
编辑此页 (opens new window)
#FAQ
更新于: 2019-10-01
Jenkins REST api

← Jenkins REST api

Copyright © 2019-2022 | yxxy | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式