Jenkins Groovy 매개변수 스크립트에 보안 비밀번호를 추가하는 방법

Jenkins Groovy 매개변수 스크립트에 보안 비밀번호를 추가하는 방법

나의 전반적인 목표는 릴리스 분기에만 적용되는 드롭다운 메뉴인 Jenkins의 빌드 매개변수를 만드는 것입니다. 나는 한동안 이 일을 해왔고 그것을 할 수 있는 방법이 많다는 것을 알고 있습니다. 제가 시도한 접근 방식 중 일부를 살펴보고 특정 접근 방식이 제 시나리오에 적합하지 않은 이유와 제가 시도한 방식이 제 애플리케이션에 가장 적합한 이유를 설명하겠습니다.

나의 현재 시도

이제 활성 선택 매개변수가 생겼습니다. (Expandable Selection 및 Expanding Selection과 같은 다른 기능도 좋습니다.) 거기에는 내 일반 스크립트가 있습니다. 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>실패했습니다. 또한 github 자격 증명에 대한 환경 변수를 가져오기 위해 user secret text or files이 섹션의 옵션을 시도했습니다 . Build Environment그러나 매개변수 플러그인 문서(활성 선택, 확장 선택 등)를 많이 읽고 읽은 후에는 해당 환경 변수에 액세스할 수 없다는 것이 분명해졌습니다. 이는 분명히 빌드 단계에 도달한 후에만 액세스할 수 있습니다. 내가 착각하지 않는 한. 확신을 가지려고 노력했지만 성공하지 못했습니다. 다음은 내가 그것을 얻으려고 노력하는 방법의 예입니다.

  • "빌드 환경"에서 "사용자 비밀 텍스트 또는 파일"을 선택했습니다.
  • 이름을 지정하고 내 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이 포함된 저장소와 다릅니다. 할 수는 있지만 git 옵션을 구현하려는 저장소에 Jenkinsfile을 넣고 싶지 않습니다. 애플리케이션 코드이므로 많은 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" ]

관련 정보