Jenkinsfile 中的下行
latestTagSHA1 = sh(returnStdout: true, script: "git rev-parse ${latestTag}^{commit}")
导致script.sh: ^{commit}: not found
错误。
有没有办法逃脱^{commit}
部分?
我试图使用^{commit}
无济于事。
重要的是要注意,我想实际运行命令
git rev-parse ${latestTag}^{commit}
,例如git rev-parse 2.0.0^{commit}
latestTag
等于2.0.0
。
此命令返回 git 标记的 SHA1。例如,对于带有标签1.0
的现有标记提交850d25580a894befbce6d922bee954c7669cf70c
,以下命令将返回标记的SHA1
:
git rev-parse 1.0^{commit}
850d25580a894befbce6d922bee954c7669cf70c
使用故障行添加了完整的Jenkinsfile
:
pipeline {
agent {
node {
label 'some_label'
customWorkspace "workspace/${JOB_NAME}/${params.PROJECT}/${params.REPO_NAME}/${BUILD_NUMBER}/"
}
}
parameters {
string defaultValue: "${REPO_NAME}", name: 'REPO_NAME', trim: true
string defaultValue: "${PROJECT}", name: 'PROJECT', trim: true
string defaultValue: "${SRC_BRANCH_NAME}", name: 'SRC_BRANCH_NAME', trim: true
string defaultValue: "${PR_MERGER_EMAIL}", name: 'PR_MERGER_EMAIL', trim: true
string defaultValue: "${SHA1}", name: 'SHA1', trim: true
}
options {
lock resource: "${params.REPO_NAME}" // lock on repo to avoid concurrent releases on the same repo
}
stages {
stage("package") {
steps {
dir("/tmp/${params.PROJECT}/${params.REPO_NAME}") {
checkout(
[
$class: 'GitSCM',
branches: [[name: 'refs/heads/master']],
extensions: [
[$class: 'LocalBranch', localBranch: "master"]
],
userRemoteConfigs: [[
url: env.GIT_URL, credentialsId: "smth"
]]
]
)
script {
sh "cd /tmp/${params.PROJECT}/${params.REPO_NAME}"
latestTag = sh(returnStdout: true, script: "git describe --tags `git rev-list --tags --max-count=1`")
latestTagSHA1 = sh(returnStdout: true, script: "git rev-parse ${latestTag}^{commit}")
latestSHA1Timestamp = sh(returnStdout: true, script: "git show -s --format='%ct' ${latestTagSHA1}")
currentCommitSHA1Timestamp = sh(returnStdout: true, script: "git show -s --format='%ct' ${params.SHA1}")
if (latestSHA1Timestamp > currentCommitSHA1Timestamp) {
currentBuild.result = 'ABORTED'
error('some')
}
}
}
}
}
}
}
您不必转义任何引发错误的行。问题是sh
步骤返回带有尾随换行符的输出。
返回标准输出(可选)
如果选中,任务的标准输出将作为步骤值作为String
返回,而不是打印到构建日志中。(标准错误(如果有)仍将打印到日志中。您经常希望对结果调用.trim()
以去除尾随换行符。
来源:https://www.jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
这就是为什么 Jenkins 试图在你的案例中执行的是:
git rev-parse 1.0.0
^{commit}
而不是
git rev-parse 1.0.0^{commit}
此问题的解决方案很简单:当您返回sh
步骤的输出时,最后调用trim()
以删除尾随换行符。
latestTag = sh(returnStdout: true, script: "git describe --tags `git rev-list --tags --max-count=1`").trim()
请记住,您必须修剪稍后用作下一个命令一部分的所有变量的输出。
你可以试试: "git rev-parse ${latestTag}"^${commit}">
您需要为要调用的所有变量添加 $