脚本:"git rev-parse ${latestTag}^{commit}" 在 Jenkinsfile 中失败



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}">

您需要为要调用的所有变量添加 $

相关内容

  • 没有找到相关文章

最新更新