如何在 Jenkins Groovy 参数脚本中添加安全密码

如何在 Jenkins Groovy 参数脚本中添加安全密码

我的总体目标是在 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" ]

相关内容