繁体   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