![如何在 Jenkins Groovy 参数脚本中添加安全密码](https://linux22.com/image/153757/%E5%A6%82%E4%BD%95%E5%9C%A8%20Jenkins%20Groovy%20%E5%8F%82%E6%95%B0%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%B7%BB%E5%8A%A0%E5%AE%89%E5%85%A8%E5%AF%86%E7%A0%81.png)
我的总体目标是在 Jenkins 中创建一个构建参数,它是仅适用于发布分支的下拉菜单。我从事这个工作已经有一段时间了,知道有很多方法可以做到这一点。让我回顾一下我尝试过的一些方法,并解释为什么特定方法不适用于我的场景,以及为什么我尝试做的方法可能最适合我的应用程序。
我目前的尝试
现在我有主动选择参数。 (其他诸如可扩展选择和扩展选择也很好),并且其中有我的常规脚本。它完全按照我想要的方式工作,除了我必须以纯文本形式输入 git 的用户名和密码。
def getBranches = ("git ls-remote https://<username>:<password>@github.com/<org>/<repo>.git").execute()
def branchNameList = getBranches.text.readLines().collect {
it.split()[1]
}
def releaseBranchList = branchNameList.findAll { it =~ /refs\/heads\/release-candidate-20.*/ }
def humanReadableReleaseBranchList = releaseBranchList.collect {
it.replaceAll('refs/heads/', '')
}
return humanReadableReleaseBranchList
我知道这不是最漂亮的,我是新来的。
我尝试过的
我当然尝试过不使用它<username>:<password>
,但失败了。我还尝试了user secret text or files
本节中的选项Build Environment
,以便尝试获取 github 凭证的环境变量。但经过多次斗争并阅读参数插件文档(主动选择、扩展选择等),显然他们无权访问这些环境变量。这些显然只有在到达构建步骤后才能访问。除非我误会了。我确实尝试过确定,但没有成功。这是我如何尝试获取它们的示例。
- 在“构建环境”下,我选择了“用户秘密文本或文件
- 给它命名并选择我的 github 信用
- 然后在 Groovy Active Parameter 脚本中我做了类似以下的事情(仅供参考:我尝试了几种方法,而不仅仅是这个。如果您知道另一种方法,请告诉我)
def envVars = Jenkins.instance.getGlobalNodeProperties()[0].getEnvVars()
def GITHUB_USER = envVars['GITHUB_USER']
def GITHUB_PASS = envVars['GITHUB_PASS']
def getBranches = ("git ls-remote https://GITHUB_USER:[email protected]/<org>/<repo>.git").execute()
我再次尝试了很多方法。也许我的语法是错误的,我对 Groovy 还很陌生。我确实尝试过类似的def getBranches = ("git ls-remote https://" + GITHUB_USER + ":" + GITHUB_PASS + "@github.com/<org>/<repo>.git").execute()
事情def getBranches = ("git ls-remote https://${GITHUB_USER}:${GITHUB_PASS}@github.com/<org>/<repo>.git").execute()
为什么我选择这个方法
我知道还有其他方法,例如 Jenkinsfile 的管道方法。我最初尝试过这样做。我没有取得太大的成功,但如果我能克服一些对我不起作用的事情,我很乐意再次尝试,例如:
- 这
git ls-remote
存储库与包含 Jenkinsfile 的存储库不同。我可以,但我真的不想将 Jenkinsfile 放入我正在尝试执行 git 选项的存储库中,因为它是应用程序代码,因此必须经历大量 QA 步骤。如果我将 Jenkinsfile 放在与应用程序代码分开的 DevOps 存储库中,我可以更快地进行操作。 - 添加动态参数似乎并不总是更新
- 我也尝试使用 github api,由于某种原因,我得到了不同的分支结果。也许我可以再次尝试并找出原因,但我投入了很多时间,但毫无结果。
我只是想检查一下在转向 Jenkinsfile Pipeline Multirepo 结账方法之前是否还有其他我没有找到的解决方案。
答案1
我找到了效果很好的解决方案:
https://bart.jakubowski.in/jenkins-active-reactive-plugin/
我最终使用此代码来获取和使用凭据(将 CREDENTIALS_ID 更改为您在 Jenkins 中的 ID):
import groovy.json.JsonSlurperClassic
import jenkins.model.Jenkins
creds = getCredentials()
def getCredentials() {
def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
Jenkins.instance,
null,
null)
for (c in creds) {
if (c.id == "CREDENTIALS_ID") {
user = c.username
pass = c.password
}
}
def credentials = "${user}:${pass}"
return credentials.toString()
}
def command = [ "/bin/bash", "-c", "curl --user ${creds} https://some_site_which_requires_authentication" ]