Jenkins - 获取回购和分支机构作为选择参数

Jenkins - 获取回购和分支机构作为选择参数

问题描述:

嗨我希望能够获取回购列表并将它们呈现为我的管道的可选择的选择参数。Jenkins - 获取回购和分支机构作为选择参数

这样做的最好方法是什么?

我想避免必须运行某种构建,它会删除所有回购和分支,并在xml或json文件中创建列表。

我还希望能够将该回购中的所有分支都显示为另一个可选择的选择参数。

编辑:

有没有一种方法来添加不同类型的项目识别器的GitHub的组织。我不想使用jenkins文件。宁愿在repo(“JenkinsProject.xml”)中查找特定的文件名,因为我在其他repos中有jenkinsFiles,我不想在此列表中找到它。

编辑2:

我发现詹金斯这个sh命令。

resolveScm源:github上(checkoutCredentialsId: 'SAME',ID: '_',repoOwner: 'GITOWNER',存储库: 'REPONAME',scanCredentialsId: 'CREDENTIALS'),目标:[” ']

似乎找到给定回购的所有分支。但是,如何将提供的信息作为其唯一输出访问控制台。

编辑3

好了,所以我想我会用GitHub的API。我可以调用这个API调用

GET /单位启用/:组织/回购

它返回JSON格式的特定组织的所有回购。在这里,我可以抢在给定的回购各分支机构与API调用

GET /回购/:业主/:回购/​​枝

然后我可以检出每个回购的主人。如果master包含“JenkinsProject.xml”,我将把repo名称和分支名称保存到一个文件中,希望将其用作选择参数。

不幸的是,我不能找到另一种方式来做到这一点,而不是解析所有的回购协议。

如果解决这个问题,我会再次更新这个问题。否则,我还在更多建议

编辑开4

我需要帮助搞清楚如何导入该JSON文件作为参数。或者可能不使用json。我可能需要解析和更新我的buildscript然后提交它。

+0

有趣的挑战分支参数:-)那些是回购所有可见的詹金斯在多分支职位的形式?或者,您是否只能通过GitHub API获取这些内容? – StephenKing

+0

目前我有一个可选择的手动输入回购清单。然后git抓住这些名字作为回购名称并将其检出。 目前只有通过github API可用,但如果需要作为多分支作业,我可以添加到jenkins作为单个作业。 我想过为需要构建的任何项目添加jenkins文件。并让jenkins文件将repo名称列表保存为json或xml文件以及分支名称。但如果我能避免这种情况,我认为会更好。 –

+0

您可以通过Groovy阅读Jenkins实例中定义的作业列表。 – StephenKing

所以我如何做到这一点是使用api。我有一个JenkinsProject.xml文件,里面有我想用这个工作构建的任何游戏。

所以我有一个名为JenkisDevOps和jenkinsfile的回购。

这jenkinsfile调用github API并将其保存到文件。

API调用来搜索一个组织内的文件是

https://api.github.com/search/code?q=org:{} ORGANIZATION_NAME +文件名:{FILENAME}

这将返回所有的回购与此文件在里面。从这里我可以得到每个分支与这些回购。

https://api.github.com/repos/ {ORGANIZATION_NAME}/{} REPO_NAME /分支

然后从这里我这一切保存到一个JSON文件与

repos{ 
    repo:{ 
     name:"repoName", 
     branches:{ 
      name:"branchname", 
      name:"branchName2" 
      ... 
     } 
    } 
} 

完整的脚本是在这里。我仍然需要弄清楚如何将保存的json文件转换为参数选项。

pipeline { 
agent any 

stages { 
stage ('Create Build Parameters'){ 
    steps{ 
     sh 'echo !---SETUP---!' 
     git credentialsId: '', url: 'https://github.com/GenesisGaming/DevOpsJenkins.git' 
     httpRequest acceptType: 'APPLICATION_JSON', authentication: '', consoleLogResponseBody: false, contentType: 'APPLICATION_JSON', outputFile: 'Repos.json', responseHandle: 'NONE', url: 'https://api.github.com/search/code?q=org:GenesisGaming+filename:Project.xml&per_page=100' 
     readFile 'Repos.json' 
     stash includes: '**', name: 'build' 
     script { 
      node{ 
       unstash 'build' 
       env.WORKSPACE = pwd() 
       def buildConfig = load "GenerateBuildSelections.Groovy" 
       def repos = buildConfig.GetListOfRepos("${env.WORKSPACE}/Repos.json") 

       def dataMap = new HashMap<String,List>() 
       for(i = 0; i < repos.size(); i++){ 
        def repoName = repos[i] 
        httpRequest acceptType: 'APPLICATION_JSON', authentication: '', consoleLogResponseBody: false, contentType: 'APPLICATION_JSON', outputFile: "branches_${repoName}.json", responseHandle: 'NONE', url: "https://api.github.com/repos/GenesisGaming/${repoName}/branches" 
        env.WORKSPACE = pwd() 
        def branches = buildConfig.GetListOfBranches("${env.WORKSPACE}/branches_${repoName}.json") 
        dataMap.put("${repoName}", "${branches}") 

       } 
       def builder = new groovy.json.JsonBuilder(dataMap) 
       new File("/home/service/BuildSelectionOptions/options.json").write(builder.toPrettyString()) 
      } 
     } 
    } 
} 
} 
post { 
always { 
    sh 'echo !---Cleanup---!' 
    cleanWs() 
} 
} 
} 

我使用活动参数插件来获取可选分支和回购。

对于selectedGame(回购)我使用groovyscript选择机智hthis脚本。

#!/usr/bin/env groovy 
import groovy.json.JsonSlurper 

def inputFile = new File("/var/BuildOptions/options.json") 
def InputJSON = new JsonSlurper().parseText(inputFile.text) 
def output = [] 
InputJSON.each{key, val -> 
    output.add(key) 
} 
return output; 

,然后我用一个积极的反应参数选择与此Groovy脚本,我引用selectedGame参数

#!/usr/bin/env groovy 
import groovy.json.JsonSlurper 

def inputFile = new File("/var/BuildOptions/options.json") 
def InputJSON = new JsonSlurper().parseText(inputFile.text) 
def output = [] 
InputJSON.each{key, val -> 
String strOut = "" 
if(selectedGame == key){ 
    val.each { outChar -> 
     if(outChar == "[" || outChar == " ") 
     { 
      strOut = "" 
     } 
     else if(outChar == "]" || outChar == ",") { 
      output.add(strOut) 
      strOut = "" 
     } 
     else 
     { 
      strOut+= outChar 
     } 
    } 
} 
} 

return output;