Jenkins - 获取repos和branches作为选择参数

时间:2017-06-05 20:10:48

标签: jenkins jenkins-plugins jenkins-pipeline

您好我希望能够获取一个repos列表并将它们作为我的管道的可选择参数显示。

最好的方法是什么?

我想避免运行某种构建来擦除所有repos和分支并在xml或json文件中创建一个列表。

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

修改

有没有办法为github组织添加不同类型的项目识别器。我不想使用jenkins文件。宁愿在回购中找到一个特定的文件名(" JenkinsProject.xml"),因为我在其他回购中有jenkinsFiles,我不想在这个列表中。

编辑2:

我在詹金斯找到了这个sh命令。

resolveScm source:github(checkoutCredentialsId:' SAME',id:' _',repoOwner:' GITOWNER',存储库:' REPONAME&#39 ;,scanCredentialsId:' CREDENTIALS'),目标:[' ']

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

编辑3

好的所以我想我会使用github api。我可以打电话给这个api电话

GET / orgs /:org / repos

以json格式返回给定组织中的所有repos。从这里我可以通过api调用获取给定仓库中的所有分支

GET / repos /:owner /:repo / branches

然后我可以结账每个回购的主人。如果master包含" JenkinsProject.xml"我会将repo名称和分支名称保存到一个文件中,该文件将被用作选择参数。

可悲的是,除了解析所有的回购之外,我无法找到另一种方法。

如果能解决这个问题,我会再次更新这个问题。否则我仍然愿意接受更多建议

编辑4

我需要帮助找出如何将此json文件作为参数导入。或者也许不使用json。我可能需要解析并更新我的buildscript然后提交它。

1 个答案:

答案 0 :(得分:1)

所以我这样做是使用api。我在想要用这个作业构建的任何游戏中都有一个JenkinsProject.xml文件。

所以我有一个名为JenkisDevOps的回购用jenkins文件。

这个jenkinsfile调用github api并将其保存到文件中。

在组织内搜索文件的api调用是

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

这将返回包含此文件的每个repo。从这里我可以通过这个回购获得每个分支。

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()
}
}
}

我使用active参数插件来获取可选分支和repos。

对于selectedGame(回购)我用这个脚本的groovyscript选择。

#!/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;