[英]Git branch select in Jenkins with groovy script
我正在嘗試在 Jenkins 中進行Parameterized build
。 通過這種方式,用戶可以從級聯菜單中選擇他/她想要部署的 git 分支。
有兩種可能的方式:
在文件中寫入分支名稱並配置 Jenkins 以讀取此文件( project configuration > extend choice parameter and selecting Property file
)。
問題:您必須將本地存儲庫作為遠程存儲庫的鏡像,並使該本地存儲庫與遠程存儲庫保持同步。 換句話說,您必須更新包含可用分支名稱 updated 的文件。 這需要 cron 安排的作業,我不允許使用這種方法。
使用 Groovy 腳本( project configuration > extend choice parameter and selecting "Groovy script"
)。 然后你需要一個 groovy 腳本來檢索分支名稱,如下所示: branches=master,feature/Feature-1,feature/Feature-2,hotfix/Hotfix-1,release/Release-1
。
我在這里找到了一個 groovy 腳本,但它不起作用。 我已經在我的機器上安裝了 groovy。
有誰能夠幫助我? 簡而言之:我需要一個 groovy 腳本,它返回遠程存儲庫的可用分支名稱。
下面的腳本應該會有所幫助。 它基於來自鏈接問題的腳本。 它使用簡單的正則表達式過濾 git 命令輸出,並為指定的 git 存儲庫創建分支名稱列表。 在grails-core github repo上測試:
def gitURL = "https://github.com/grails/grails-core.git"
def command = "git ls-remote -h $gitURL"
def proc = command.execute()
proc.waitFor()
if ( proc.exitValue() != 0 ) {
println "Error, ${proc.err.text}"
System.exit(-1)
}
def branches = proc.in.text.readLines().collect {
it.replaceAll(/[a-z0-9]*\trefs\/heads\//, '')
}
println branches
嘗試使用
使用以下步驟:
向您的作業添加可擴展的選擇參數
在 Choice 參數字段中選擇System Groovy Choice 參數
將以下腳本放在Groovy 腳本文本框中,並將占位符“< >”替換為所需的值。
import groovy.json.JsonSlurper; try{ List<String>params = new ArrayList<String>() URL apiUrl = "https://api.github.com/users/<repo-owner>/repos?access_token=<github-access-token>".toURL() List branches = new JsonSlurper().parse(apiUrl.newReader()) for (branch in branches ) { params.add(branch.name) } return params } catch(IOException ex){ print ex }
為您的工作添加主動選擇反應參數
將參考參數作為存儲庫和以下腳本放置在 Groovy 腳本文本框中
import groovy.json.JsonSlurper; try{ List<String>params = new ArrayList<String>() URL apiUrl = "https://api.github.com/repos/<repo-owner>/$repository/branches?access_token=<github-access-token>".toURL() List json = new JsonSlurper().parse(apiUrl.newReader()) for (repo in json ) { params.add(repo.name) } return params } catch(IOException ex){ print ex }
筆記:
$repository
從存儲庫參數中獲取動態值。現在嘗試使用參數構建作業
查看 github api 文檔以獲取更多信息。 希望這對你有幫助..!! ;-)
為此,您不需要 Groovy 腳本。 Git 參數插件允許您添加 git 分支作為參數。
您可以使用可擴展選擇參數插件來檢索克隆存儲庫的 Git 分支。 為此,將 .git 目錄路徑的環境變量添加到 Master-Node 屬性,例如:
然后使用以下 groovy 腳本添加可擴展選擇參數(並選中“使用預定義變量”):
def envVars = jenkins.getNodeProperties()[0].getEnvVars()
def NODE_PROJECT_PATH = envVars.get('NODE_PROJECT_PATH')
def gettags = "git ls-remote -t --heads origin".execute(null, new File(NODE_PROJECT_PATH))
return gettags.text.readLines()
.collect { it.split()[1].replaceAll('\\^\\{\\}', '').replaceAll('refs/\\w+/', '') }
.unique()
.findAll { !it.startsWith('Branch_') }
那應該列出您的分支(我從列表中過濾掉了所有“Branch_*”):
注意:如果您在驗證腳本時看不到任何內容(使用“立即運行腳本”按鈕),這可能是由於需要用戶/密碼提示 - 所以最初在 .git 中運行“git ls-remote -t --heads origin”目錄。 要在 Windows 上保存憑據,請嘗試運行“git config --global credential.helper wincred”。
這是我想出的唯一一種不需要您從工作區中挖掘 git repo 信息的技術。 這使用 Groovy 代碼來檢查 Git URI 的作業參數,然后使用git
執行剩下的工作。
應該可以使用JGit以本機 Groovy 方式訪問存儲庫,但我無法弄清楚。
import jenkins.*
import jenkins.model.*
import hudson.*
import hudson.model.*
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;
def build = Thread.currentThread().toString()
def regexp= ".+?/job/([^/]+)/.*"
def match = build =~ regexp
def jobName = match[0][1]
def job = Jenkins.instance.getJob(jobName)
def workspace = job.lastBuild.workspace
for(project in Hudson.instance.items) {
scm = job.scm;
if (scm instanceof hudson.plugins.git.GitSCM) {
for (RemoteConfig cfg : scm.getRepositories()) {
for (URIish uri : cfg.getURIs()) {
gitUri = uri
}
}
}
}
def branchlist = ["/bin/bash", "-c", "git ls-remote --heads ${gitUri}"].execute() | ["/bin/bash", "-c", "cut -f2"].execute()
branchlist.waitFor()
return branchlist.in.text.readLines()
將其設置為擴展選擇參數上的Source for Value的Groovy 腳本,如下所示:
然后您將能夠從分支列表中選擇作為構建參數:
我正在關注這個https://stackoverflow.com/a/47880463/11951486 ,它工作得很好。 但問題是,現在 github 將禁用在 url 中使用 access_token,可以在此處找到更多詳細信息
所以我更改了 groovy 腳本以使用帶有用戶名和令牌或密碼的 curl
請在下面找到回購代碼。
import groovy.json.JsonSlurper;
try{
def user = "<username>"
def tokenId = "<tokenid>"
def url = "https://api.github.com/user/repos?per_page=200"
def command = "curl -u $user:$tokenId $url"
List<String>params = new ArrayList<String>()
apiUrl = command.execute().text
List json = new JsonSlurper().parseText(apiUrl)
for (repo in json ) {
params.add(repo.name)
}
return params
}
catch(IOException ex){
print ex
}
請在下面找到分支機構的代碼
import groovy.json.JsonSlurper;
try{
def user = "<username>"
def tokenId = "<tokenID>"
def url = "https://api.github.com/repos/<org_name>/${REPO}/branches?per_page=400"
def command = "curl -u $user:$tokenId $url"
List<String>params = new ArrayList<String>()
apiUrl = command.execute().text
List json = new JsonSlurper().parseText(apiUrl)
for (branch in json ) {
params.add(branch.name)
}
params.add(0, 'master:selected')// this is for default select master branch
return params
}
catch(IOException ex){
print ex
}
${REPO} = 這是列出repos的參數名,所以根據你選擇的repo,上面的代碼會列出分支。
這種方法描述了組成 Jenkins 管道所需的設置,該管道動態“輪詢”(列出)特定存儲庫的所有分支,然后允許用戶在運行此作業的構建時使用某些特定分支運行管道。
這里的假設是:
首先要做的是提供 Jenkins 憑據以連接(和“獲取”)到 BitBucket 中的私有存儲庫。 這可以通過創建一個 SSH 密鑰對來完成,以在托管 Jenkins 服務器的機器上的 Jenkins (!!) 用戶和(私有)BitBucket 存儲庫之間“鏈接”。
首先是為 Jenkins 用戶(即運行 Jenkins 服務器的用戶 - 它很可能在安裝時默認創建)創建一個 SSH 密鑰:
guya@ubuntu_jenkins:~$ sudo su jenkins [sudo] password for guya: jenkins@ubuntu_jenkins:/home/guya$ ssh-keygen
輸出應類似於以下內容:
生成公鑰/私鑰 rsa 密鑰對。 輸入要保存密鑰的文件
(/var/lib/jenkins/.ssh/id_rsa):創建目錄“/var/lib/jenkins/.ssh”。 Enter passphrase (empty for no passphrase):再次輸入相同的密碼:您的身份信息已保存在/var/lib/jenkins/.ssh/id_rsa。 您的公鑰已保存在 /var/lib/jenkins/.ssh/id_rsa.pub 中。 密鑰指紋為:SHA256:q6PfEthg+74QFwO+esLbOtKbwLG1dhtMLfxIVSN8fQY jenkins@ubuntu_jenkins 密鑰的隨機圖為:+---[RSA 2048]----+ | . .. oE | | . . .o...o | | . o.. o | | +.oo | | . ooX..S | |..+.Bo* . | |.++oo* o. | |..+*..*o | | .=+o==+。 | +----[SHA256]-----+ jenkins@ubuntu_jenkins:/home/guya$
Settings --> Access keys --> Add key
在 BitBucket 存儲庫中創建(添加)SSH Settings --> Access keys --> Add key
。cat /var/lib/jenkins/.ssh/id_rsa.pub
jenkins
此“特權”。 這可以通過將帶有私鑰的新 SSH 用戶名添加到Jenkins --> Credentials --> System --> Global Credentials --> Add credentials
。
jenkins
。~/.ssh/id_rsa
。 這是以字符串開頭的私鑰: -----BEGIN RSA PRIVATE KEY-----
並以字符串結尾: -----END RSA PRIVATE KEY-----
。 請注意,應將整個“塊”復制粘貼到上述部分中。安裝 Git Parameter 插件,可在此處的官方頁面中找到
列出(動態)給定存儲庫的所有分支所需的最小管道如下:
pipeline { agent any parameters { gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH', type: 'PT_BRANCH' } stages { stage("list all branches") { steps { git branch: "${params.BRANCH}", credentialsId: "SSH_user_name_with_private_key", url: "ssh://git@myCompanyBitBucketSite.com:port/myRepository.git" } } } }
筆記:
defaultValue
設置為master
以便如果不存在分支 - 它將顯示在管道的“下拉列表”中。credentialsId
具有先前配置的credentialsId
的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.