Pipeline 参数化构建认证问题
在 Pipeline 中,仅用于获取 Tag 的参数化仓库未被 Pipeline 使用,将导致拉取 Tag 时权限校验失败。
例如,Pipeline 基于配置仓库生成数据,已经拉取了配置仓库代码。但某参数需要在构建时通过 Git Parameter 选择代码仓库的 Tag传入,此时由于代码仓库未在 Pipeline 中实际使用,将提示无权限访问其 Tag。
解决方法是在 Pipeline 中显式拉取代码仓库并指定其凭据,后续即可正常获取对应的 Tag 参数。
// 获取程序代码
dir(code_repo_directory) {
checkout([$class: 'GitSCM',
branches: [[name: "refs/tags/${code_version}"]],
userRemoteConfigs: [[credentialsId: scm_credentials_id, url: scm_url]]
])
}
另外有一点需要注意,修改 Pipeline 后需要先运行一次才能列出 Tag(因为需要加载新的 Pipeline 及绑定凭据)。
获取 Shell 命令的执行结果
将 sh 命令的输出到文件,而后在 script 区块使用 Groovy 语法,将状态或内容赋值到变量。
steps {
script {
sh """
if [ ! -d "${destDir}" ]
then
echo "not exist" > 'dest_dir_status.txt'
else
echo "exist" > 'dest_dir_status.txt'
fi
"""
def output = readFile 'dest_dir_status.txt'
if (output.contains('not exist')) {
target_exists = 'not_exist'
} else {
target_exists = 'exist'
}
echo "Dir Test Result: ${target_exists}"
}
}
在之后的步骤中就可以使用 when 语法选择跳过部分 stage
when {
equals(actual: target_exists, expected: 'not_exist')
}
使用 Pipeline 提交代码
以下是一段代码提交示例,首先切换到仓库的路径,通过 withCredentials 和 gitUsernamePassword 对仓库进行 HTTP 认证。
steps {
dir(stage_repo_directory) {
withCredentials([gitUsernamePassword(credentialsId: scm_credentials_id)]){
sh """
git add projects/config.yaml
git status
git diff --stat
git config --local user.name "${BUILD_USER_ID}"
git commit -m "ops: ci automated commit, by ${BUILD_USER_ID}" || true
git push origin HEAD:refs/heads/master
"""
}
}
}
提交代码时需要注意使用正确的分支。