簡體   English   中英

使用 groovy 腳本在 Jenkins 中選擇 Git 分支

[英]Git branch select in Jenkins with groovy script

我正在嘗試在 Jenkins 中進行Parameterized build 通過這種方式,用戶可以從級聯菜單中選擇他/她想要部署的 git 分支。

有兩種可能的方式:

  1. 在文件中寫入分支名稱並配置 Jenkins 以讀取此文件( project configuration > extend choice parameter and selecting Property file )。

    問題:您必須將本地存儲庫作為遠程存儲庫的鏡像,並使該本地存儲庫與遠程存儲庫保持同步。 換句話說,您必須更新包含可用分支名稱 updated 的文件 這需要 cron 安排的作業,我不允許使用這種方法。

  2. 使用 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

嘗試使用

使用以下步驟:

  1. 向您的作業添加可擴展的選擇參數

    在此處輸入圖片說明

  2. 在 Choice 參數字段中選擇System Groovy Choice 參數

    在此處輸入圖片說明

  3. 將以下腳本放在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 }
  4. 為您的工作添加主動選擇反應參數

    在此處輸入圖片說明

  5. 參考參數作為存儲庫和以下腳本放置在 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從存儲庫參數中獲取動態值。
    • 忽略公共存儲庫。
  6. 現在嘗試使用參數構建作業

    在此處輸入圖片說明 在此處輸入圖片說明

查看 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 ValueGroovy 腳本,如下所示:

擴展選擇參數

然后您將能夠從分支列表中選擇作為構建參數:

分公司名單

我正在關注這個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 服務器是2.204.2 (托管在Ubuntu 18.04 上
  • 存儲庫托管在BitBucket 中

首先要做的是提供 Jenkins 憑據以連接(和“獲取”)到 BitBucket 中的私有存儲庫。 這可以通過創建一個 SSH 密鑰對來完成,以在托管 Jenkins 服務器的機器上的 Jenkins (!!) 用戶和(私有)BitBucket 存儲庫之間“鏈接”。

  1. 首先是為 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$

  1. 現在需要在 BitBucket 存儲庫中設置此 SSH 密鑰的內容,如下所示:
  • 通過轉到: Settings --> Access keys --> Add key在 BitBucket 存儲庫中創建(添加)SSH Settings --> Access keys --> Add key
  • 賦予密鑰讀取權限,並將 PUBLIC 密鑰的內容復制到密鑰的“主體”。 運行可以顯示key的內容: cat /var/lib/jenkins/.ssh/id_rsa.pub
  1. 在 BitBucket 存儲庫中設置 SSH 密鑰之后,我們需要“告訴”Jenkins 在嘗試獲取(在這種情況下讀取)存儲庫的內容時實際使用它。 請注意,讓 Jenkins 知道實際上意味着讓用戶jenkins此“特權”。

這可以通過將帶有私鑰的新 SSH 用戶名添加到Jenkins --> Credentials --> System --> Global Credentials --> Add credentials

  • 在 ID 部分,為鍵添加任何描述性名稱。
  • 在 Username 部分,輸入 Jenkins 服務器的用戶名jenkins
  • 勾選 Private key 部分並粘貼之前通過復制粘貼以下內容生成的 PRIVATE key 的內容: ~/.ssh/id_rsa 這是以字符串開頭的私鑰: -----BEGIN RSA PRIVATE KEY-----並以字符串結尾: -----END RSA PRIVATE KEY----- 請注意,應將整個“塊”復制粘貼到上述部分中。
  1. 安裝 Git Parameter 插件,可在此處的官方頁面中找到

  2. 列出(動態)給定存儲庫的所有分支所需的最小管道如下:

     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的名稱。
  • 在這種情況下,我在 url 參數中使用了存儲庫的 SSH URL。
  • 此答案假定(並已配置)git 服務器是 BitBucket。 我假設在初始步驟中完成的所有“管理”設置都在 GitHub 中具有等效設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM