cicd 06--jenkins 常见问题和注意事项

1 介绍

近期由于工作需要开始尝试做各种各样的jenkins流程,也遇到了各类奇怪的问题,当然包含一些新书会踩到的坑。因此准备写一篇文章专门记录jenkins 中常见的用法和异常,以便于后续查阅和学习,后续也会持续在这里更新相关问题。

2 常见用法

  1. 获取指定格式时间
    获取事件可以使用内置的Data 函数,但是其输出格式有限(方法1);也可以通过sh 执行 date 命令的方式输出多样的日期类型,但是其需要指定agent节点执行(方法2)。
    方法1:
def createVersion() {
return new Date().format('yyyyMMdd-HHmmss')
}
image_version = createVersion()
  1. 方法2:
def createVersion() {
node("SRE-Build01-Server") {
ts = sh(returnStdout: true, script: "date +%y.%U.%y%m%d%k%M").trim()
return ts
}
}
image_version = createVersion()

3 注意事项

  1. 多个delete_dir需要放置到具体位置
    本案例在一个job 中使用了两个目录,如果 deleteDir() 放在 dir() 的外层,那么会导致clone前端后,在clone后端的时候也把前端文件删除,因此需要将 deleteDir() 放在 dir() 的内部,确保其只删除自己的那部分文件。
stage("Clone frontend"){
agent {
node {
label 'slave'
}
}
steps {
sh """
echo "Clone frontend repo: ${repo_url_frontend} ${branch}"
pwd
"""
dir("${work_dir_frontend}"){
deleteDir()
git(
url: "${repo_url_frontend}",
credentialsId: '73****74',
branch: "${branch}"
)
}
}
}

stage("Clone backend"){
agent {
node {
label 'slave'
}
}
steps {
sh """
echo "Clone backend repo: ${repo_url_frontend} ${branch}"
pwd
"""
dir("${work_dir_backend}"){
deleteDir()
git(
url: "${repo_url_backend}",
credentialsId: '73****74',
branch: "${branch}"
)
}
}
}
  1. 普通变量中不能直接使用 shell 命令
    下面案例中直接将ts赋值为shell 的date命令,应该使用专门的Date函数
错误案例:
ts=`date +%s`
git tag -m 'Build docker image dev/3.8.148-dev' dev/3.8.148-dev-${ts}
git describe
git push origin dev/3.8.148-dev-${ts}

解决方法:
def createDate() {
return new Date().format('yyyyMMdd-HHmmss')
}
date_str = createDate()
git tag -m 'Build docker image dev/3.8.148-dev' dev/3.8.148-dev-${date_str}
  1. agent any导致 post 阶段错误
    若在pipeline 中设置了 agent any, 那么在post 阶段使用sh 命令就会报错,准确的方式是将agent any 指定为一个基础的agent节点, 那么post命令会在指定的节点上执行。
错误案例:
pipeline {
agent any

post {
always {
echo 'I have finished'
}
success {
echo "scale , succeed!"
sh """
curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"sre_test_dev notify, succeed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/46***05
"""
}
failure {
echo "scale , failed!"
sh """
curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"sre_test_dev notify, failed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/46***05
"""
}
}
}

正确案例:
pipeline {
agent {
node {
label 'SRE_BUILD_NODE'
}
}

post {
always {
echo 'I have finished'
}
success {
echo "scale , succeed!"
sh """
curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"sre_test_dev notify, succeed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/46***05
"""
}
failure {
echo "scale , failed!"
sh """
curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"sre_test_dev notify, failed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/46***05
"""
}
}
}

4 说明

  1. ​www.jenkins.io/doc​