8

I have a job in Jenkins for a project on GitHub, that I would like to be triggered whenever a new branch is created or an existing branch has been removed. Is this possible?

Notice: The Jenkins server is located internally in a company, so we can't use web hooks from GitHub.

4

4 回答 4

3

我可以想到一种方法,您可以使用。

使用 Job DSL Plugin 允许您使用 Groovy 创建或删除项目。包含 github 扫描并从中创建工作并不难。它的好处是,它也可以识别已删除的作业。

即安装 Job DSL 插件,使用常规触发器创建种子作业(自由样式),并将类似于以下内容的内容粘贴到您的脚本中。

def project = 'nbn/griffon-maven-plugin'
def branchApi = new URL("https://api.github.com/repos/${project}/branches")
def branches = new groovy.json.JsonSlurper().parse(branchApi.newReader())


branches.each { 
    def branchName = it.name
    job {
        name "${project}-${branchName}".replaceAll('/','-')
        scm {
            git("git://github.com/${project}.git", branchName)
        }
        steps {
            maven("test -Dproject.name=${project}/${branchName} ")
        }
    }
}
于 2014-09-26T16:18:28.647 回答
3

如果它对您来说不错,您可以尝试这种方法。:)

在构建机器上安排一个 cron 来执行以下任务:

  1. 从 Git 存储库中获取分支列表并将其存储在一个文件中,例如branch_list

    我们使用 Gitolite 并使用git ls-remote命令访问分支名称。

    git ls-remote gitolite@git.server.com:repository_name

    例如,

    [tom@master ~]$ git ls-remote gitolite@git.server.com:repository_name
    08a119f0aec5d4286708d2e16275fcd7d80d2c25        HEAD
    a91ef29f1be5bfe373598f6bb20d772dcc65b8ca        refs/heads/dev-mob
    d138356cf752a46fd8c626229809c9eaae63a719        refs/heads/dev-ssorel
    e7d7e2c617c4a42b299b29c0119283813800f1bb        refs/heads/dev-omni
    3193b36d678f1af2dcc3a291c6313f28ede97149        refs/heads/dev-pay
    72fd9d8586708011c763cd7bc4f7bd2a3513a12f        refs/heads/dev-sell
    39455fc2672039a7f325e9cafe3777ed563368ef        refs/heads/dev-apis
    a22eb000ffa1ac0fbbf51b6bc8aea31b040567a3        refs/heads/dev-front
    78a63105ec754d7ba758af97d542e749ceb9c533        refs/heads/dev-tpsp
    82d99796690b6c562872ea68655c74ebc3f0abfb        refs/heads/mainline
    fd82522f9999cedb11e245b515d480187c2e9cc6        refs/heads/master
    

    要仅过滤掉分支名称,您可以使用:

    [tom@master ~]$ git ls-remote gitolite@git.server.com:repository_name | grep -v HEAD | cut -d/ -f3 | sort > branch_list_latest
    
  2. 最后获取的文件(即branch_list )进行比较。如果有差异,则触发构建。您可以使用diffcmp命令。

    git ls-remote gitolite@git.server.com:repository_name | grep -v HEAD | cut -d/ -f3 | sort > branch_list_latest
    
    if ! cmp -s branch_list branch_list_latest; then
       mv branch_list_latest branch_list
       echo "Files differ which means branch created or removed. Triggering build..."
       # Trigger build command
    fi
    

Cron 将在一定间隔后继续获取分支列表。您可以根据需要定义间隔。

于 2014-09-27T06:23:34.660 回答
0

我现在所在的位置有两个长期存在的分支,其余的几乎都是短期特性分支。

我们已经为长期存在的分支机构提供了工作。

对于我看过的功能分支

https://pythonhosted.org/jenkins-autojobs/

http://entagen.github.io/jenkins-build-per-branch/

并发现它们对于我们的使用来说都有点过于复杂。

相反,我使用分支说明符“*_build”设置了一项工作,约定如果您推送以“_build”结尾的分支,它将由 Jenkins 构建。下一步是记住,当您审查时,拉取请求最好命名为“xyz ..._build”:)

最好的,安德斯

于 2014-09-30T19:52:32.110 回答
0

根据https://jenkins-ci.org/blog/2015/12/03/pipeline-as-code-with-multibranch-workflows-in-jenkins/您应该能够根据创建创建和删除作业并移除一个分支。

不过我没试过。。。

您可能还想阅读https://blog.codecentric.de/en/2015/04/generated-jenkins-jobs-and-automatic-branch-merging-for-feature-branches/

于 2016-02-04T10:38:38.927 回答