[英]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.