Programing

지정된 리포지토리의 Git 분기로 Jenkins Choice 매개 변수를 동적으로 채우기

lottogame 2020. 12. 11. 07:38
반응형

지정된 리포지토리의 Git 분기로 Jenkins Choice 매개 변수를 동적으로 채우기


특정 Git 리포지토리에 특정 Git 분기의 입력이 필요한 매개 변수화 된 Jenkins 작업이 있습니다. 현재이 매개 변수는 문자열 매개 변수입니다.

이 매개 변수를 선택 매개 변수로 만들고 드롭 다운 목록을 Git 브랜치로 동적으로 채우는 방법이 있습니까? 새 분기가 생성 될 때마다 수동으로 드롭 다운을 구성하여이 선택 매개 변수를 유지하도록 누군가에게 요구하고 싶지 않습니다.


Extended Choice Parameter 플러그인 을 사용하면 파일에서 선택 사항을 읽을 수 있습니다.

물론 이제 또 다른 문제가 있습니다. 파일이 최신 상태인지 확인하고 (커밋 후 후크로 수행 할 수 있음) 모든 사용자에게 전파 (공유 파일에 배치하여 수행 할 수 있음) 파일 서버). 그러나 더 나은 해결책이있을 수 있습니다.


이 링크에 언급 된 몇 가지 답변을 시도했지만 Jenkins에게 사용자가 선택한 분기에 대해 알리는 방법을 알 수 없었습니다. 위의 스레드의 이전 주석에서 언급했듯이 분기 선택기 필드를 비워 두었습니다.

그러나 추가 조사 중에 동일한 작업을 수행하는 다른 방법을 찾았습니다. https://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin 이 방법이 훨씬 더 간단하고 더 적은 것을 발견했습니다. 구성합니다!

내가 구성한 내용은 다음과 같습니다.

  1. git 매개 변수 플러그인 설치
  2. 'This build is parameterized'를 확인하고 'Git 매개 변수'를 추가했습니다.
  3. 다음 값을 추가했습니다. 작업의 Git 매개 변수 플러그인 구성

  4. 그런 다음 작업의 git SCM 섹션에서 '이름'섹션에 언급 된 동일한 값을 환경 변수 인 것처럼 추가했습니다. (이 git 매개 변수 플러그인에 대한 도움말을주의 깊게 읽으면이를 알게 될 것입니다.)분기 선택기

이 후 방금 빌드를 실행하고 브랜치를 선택하고 (Jenkins는 빌드하기 전에이 브랜치를 확인합니다) 빌드를 성공적으로 완료하고 지정한 브랜치를 선택합니다.


Jenkins Dynamic Parameter Plug-in을 사용하여이 결과를 얻을 수있었습니다 . Dynamic Choice Parameter 옵션을 사용했으며 선택 스크립트의 경우 다음을 사용했습니다.

proc1 = ['/bin/bash', '-c', "/usr/bin/git ls-remote -h ssh://user@server.com/path/to/repo.git"].execute()
proc2 = ['/bin/bash', '-c', "awk '{print \$2}'"].execute()
proc3 = ['/bin/bash', '-c', "sed s%^refs/heads%origin%"].execute()

all = proc1 | proc2 | proc3
String result = all.text

String filename = "/tmp/branches.txt"
boolean success = new File(filename).write(result) 

def multiline = "cat /tmp/branches.txt".execute().text
def list = multiline.readLines()

"Git Parameter Plug-in"을 사용하면 매우 간단합니다 .

"SELECT_BRANCH"와 같은 이름 추가 ## 나중에 사용되므로이 변수에 대해 확인하십시오. 그런 다음 매개 변수 유형 : 분기

그런 다음 SCM에 문의하십시오. 선택 : Git 및 분기 지정자 : $ {SELECT_BRANCH}

확인하려면 젠킨스의 쉘에서 아래를 실행하십시오.

에코 $ {SELECT_BRANCH}

env. 여기에 이미지 설명 입력

여기에 이미지 설명 입력


나는 여기서 비슷한 문제에 직면하고 있습니다. 사용자는 프리 스타일에서 파이프 라인으로 작업을 마이그레이션하고 있습니다. 그들은 Jenkinsfile이 자신의 저장소 (역사적 이유)에 저장되는 것을 원하지 않고 여전히 "Git Parameter"플러그인을 사용하기를 원합니다.

그래서 우리는 "Pipeline script"를 사용하고 "Git Parameter"처럼 작동하는 다른 플러그인을 개발해야합니다.

이 새 플러그인은 프로젝트의 SCM 설정과 통합되지 않습니다. 플러그인은 https://plugins.jenkins.io/list-git-branches-parameter에 있습니다.

도움이되기를 바랍니다.


@malenkiy_scot의 답변을 확장합니다. Extended Choice Plugin에서 사용하는 파일을 빌드하기 위해 새 jenkins 작업을 만들었습니다.

다음을 수행 할 수 있습니다 (젠킨스에서 쉘 단계 실행으로 수행했지만 스크립트에서 수행 할 수 있음).

git ls-remote git@github.com:my/repo.git |grep refs/heads/* >tmp.txt
sed -e 's/.*refs\/heads\///' tmp.txt > tmp2.txt
tr '\n' ',' < tmp2.txt > tmp3.txt
sed '1i\branches=' tmp3.txt > tmp4.txt
tr -d '\n'  < tmp4.txt > branches.txt

그런 다음 Artifact 배포자 플러그인을 사용하여 해당 파일을 웹 URL에있는 공유 위치로 푸시 한 다음 확장 선택 플러그인의 'http : //localhost/branches.txt'를 URL로 사용합니다. 매력처럼 작동합니다.


이전에 malenkiy_scot에서 언급 한 확장 선택 매개 변수 플러그인과 다음과 같은 간단한 PHP 스크립트를 사용하여 동일한 작업을 수행 할 수 있습니다 (Jenkins 머신에서 실행할 수있는 PHP 스크립트를 배포 할 서버가 있다고 가정).

<?php
chdir('/path/to/repo');
exec('git branch -r', $output);
print('branches='.str_replace('  origin/','',implode(',', $output)));
?>

또는

<?php
exec('git ls-remote -h http://user:pass@repo.git', $output);
print('branches='.preg_replace('/[a-z0-9]*\trefs\/heads\//','',implode(',', $output)));
?>

첫 번째 옵션을 사용하면 저장소를 복제해야합니다. 두 번째는 그렇지 않지만 두 경우 모두 PHP 스크립트를 호스팅하는 서버에 git을 설치해야합니다. 이 옵션 중 어느 것이 든 완전히 동적 인 것이기 때문에 목록 파일을 만들 필요가 없습니다. 확장 선택 매개 변수 "속성 파일"필드에 스크립트의 URL을 입력하기 만하면됩니다.


예, 트릭을 수행하는 약간의 멋진 스크립트를 작성했습니다. 'Dynamic Choice Parameter'를 작업에 추가하고 다음 멋진 스크립트를 필요에 맞게 사용자 정의해야합니다.

#!/usr/bin/groovy

def gitURL = "git repo url"
def command = "git ls-remote --heads --tags ${gitURL}"

def proc = command.execute()
proc.waitFor()              

if ( proc.exitValue() != 0 ) {
   println "Error, ${proc.err.text}"
   System.exit(-1)
}

def text = proc.in.text
# put your version string match
def match = /<REGEX>/
def tags = []

text.eachMatch(match) { tags.push(it[1]) }
tags.unique()
tags.sort( { a, b ->
         def a1 = a.tokenize('._-')
         def b1 = b.tokenize('._-')
         try {
            for (i in 1..<[a1.size(), b1.size()].min()) { 
                 if (a1[i].toInteger() != b1[i].toInteger()) return a1[i].toInteger() <=> b1[i].toInteger()
            }
            return 1
         } catch (e) {
            return -1;
         }
} )
tags.reverse()

필자의 경우 버전 문자열은 XXXX 형식이고 XXX-username 등의 형식으로 사용자 분기를 가질 수 있습니다. 그래서 제 자신의 정렬 함수를 작성해야했습니다. 이것은 내 첫 번째 멋진 스크립트 였으므로 더 나은 방법이 있다면 알고 싶습니다.


나를 위해 입력 단계 매개 변수를 사용합니다.

  1. git 프로젝트를 확인하여 파이프 라인을 시작합니다.
  2. awk commade를 사용하여 모든 분기 목록이있는 barnch.txt 파일을 생성합니다.
  3. 스테이지 setps에서 파일을 읽고 입력 선택 매개 변수를 생성하는 데 사용합니다.

사용자가 파이프 라인을 시작할 때이 파이프 라인은 목록 선택에서 선택하기를 기다리고 있습니다.

pipeline{
agent any

stages{

    stage('checkout scm') {
        steps {
            script{
                git credentialsId: '8bd8-419d-8af0-30960441fcd7', url: 'ssh://jenkins@git.company.com:/usr/company/repositories/repo.git'
                sh 'git branch -r | awk \'{print $1}\' ORS=\'\\n\' >>branch.txt'
            }

        }
    }
     stage('get build Params User Input') {
        steps{
            script{

                liste = readFile 'branch.txt'
                echo "please click on the link here to chose the branch to build"
                env.BRANCH_SCOPE = input message: 'Please choose the branch to build ', ok: 'Validate!',
                        parameters: [choice(name: 'BRANCH_NAME', choices: "${liste}", description: 'Branch to build?')]


            }
        }
    } 
    stage("checkout the branch"){
        steps{
            echo "${env.BRANCH_SCOPE}"
            git  credentialsId: 'ea346a50-8bd8-419d-8af0-30960441fcd7', url: 'ssh://jenkins@git.company.com/usr/company/repositories/repo.git'
            sh "git checkout -b build ${env.BRANCH_NAME}"
        }
    }
    stage(" exec maven build"){
        steps{
            withMaven(maven: 'M3', mavenSettingsConfig: 'mvn-setting-xml') {
               sh "mvn clean install "
            }
        }
    }
    stage("clean workwpace"){
        steps{
            cleanWs()
        }
    }
}

}

그런 다음 사용자는 빌드와 상호 작용합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력


을 사용하여 불필요한 파일 읽기 / 쓰기를 제거 할 수 있습니다 text. 내 완전한 솔루션은 다음과 같습니다.

proc1 = ['/bin/bash', '-c', 
  "/usr/bin/git ls-remote --heads ssh://repo_url.git"].execute()
proc2 = ['/bin/bash', '-c', 
  "/usr/bin/awk ' { gsub(/refs\\/heads\\//, \"\"); print \$2 }' "].execute()
all = proc1 | proc2

choices = all.text
return choices.split().toList();

작업이 "소스 코드 관리"를 직접 사용하지 않지만 (예 : "Git Parameter Plugin") 로컬 (복제 된) git 저장소에 액세스 할 수있는 경우 다음 그루비 스크립트가 유용 합니다.

import jenkins.model.Jenkins

def envVars = Jenkins.instance.getNodeProperties()[0].getEnvVars() 
def GIT_PROJECT_PATH = envVars.get('GIT_PROJECT_PATH') 
def gettags = "git ls-remote -t --heads origin".execute(null, new File(GIT_PROJECT_PATH))

return gettags.text.readLines()
         .collect { it.split()[1].replaceAll('\\^\\{\\}', '').replaceAll('refs/\\w+/', '')  }
         .unique()

여기에서 전체 설명을 참조하십시오 : https://stackoverflow.com/a/37810768/658497


이 경우에 대한 새로운 응답이 있습니다.이 문제를 해결하는 쉬운 방법은 소스 코드에서 jenkinsFile을 사용하는 것입니다.

그런 다음 선택했습니다.이 작업에는 git 매개 변수가 있습니다.

여기에 이미지 설명 입력

그리고 Pipeline 설정에서 "Lightweight checkout"확인란을 선택 취소하면 작업 작업 공간에서 실제로 git checkout이 수행됩니다.

여기에 이미지 설명 입력

그 후 매개 변수는 git 브랜치에 의해 자동으로 채워집니다.

참고 URL : https://stackoverflow.com/questions/10433105/dynamically-fill-jenkins-choice-parameter-with-git-branches-in-a-specified-repo

반응형