2017-01-09 23 views
4

我们希望使用单个Jenkins作业来构建应用程序。配置Jenkins作业以从SVN中选择应用程序和干线/标签/分支

How to configure a single Jenkins job to make the release process from trunk or branches?的解决方案确实工作,因为我们SVN结构是不同的(从历史的原因,我们不能改变它):

http://my-svn-repo/projects/ 
├───branches 
│ ├───app1 
│ │ ├───BRANCH_A 
│ │ ├───BRANCH_B 
│ │ └───BRANCH_C 
│ ├───app2 
│ │ ├───BRANCH_D 
│ │ ├───BRANCH_E 
│ │ └───BRANCH_F 
│ └───app3 
│  ├───BRANCH_G 
│  ├───BRANCH_H 
│  └───BRANCH_I 
├───tags 
│ ├───app1 
│ │ ├───BRANCH_D 
│ │ ├───BRANCH_E 
│ │ └───BRANCH_F 
│ ├───app2 
│ │ ├───TAG_D 
│ │ ├───TAG_E 
│ │ └───TAG_F 
│ └───app3 
│  ├───TAG_G 
│  ├───TAG_H 
│  └───TAG_I 
└───trunk 
    ├───app1 
    ├───app2 
    └───app3 

所描述的解决方案How to configure a single Jenkins job to make the release process from trunk or branches?节目供选择这样的:

  • trunk
  • branches/app1
  • 分支/ APP 2
  • 分支/ APP3
  • 标签/ APP1
  • 标签/ APP 2
  • 标签/ APP3

我们想什么有如下:

选择1:

  • app1
  • APP2
  • APP3

选择2(自动基于所述选择1,例如对于应用2):

  • 干线
  • BRANCH_D
  • BRANCH_E
  • BRANCH_F
  • TAG_D
  • TAG_E
  • TAG_F

回答

4

使用Active Choice Parameter和Groovy脚本。

  1. 创建参数APP来选择应用程序。Groovy的脚本应返回选择列表,所以只返回硬编码的列表(或从文件中读取,或从任何地方你想):

enter image description here

  • 创建参数VERSION以选择版本。

    • 现在使用主动选择参数,所以你能够到参数APP的变化作出反应。
    • Groovy脚本逐渐建立可供选择的选项列表。首先树干,然后标记,然后分支。使用命令行svn list

    svn list http://my-svn-repo/projects/tags/appX --username some_name --password some_password

    • 引用参数形式必须被设置为APP获得
    • 数据。每当更新APP的值时,Groovy脚本将使用参考参数的更新值重新评估选项列表。
  • enter image description here

    这里是复制&膏中的脚本:

    def svnBaseUrl = 'http://my-svn-repo/projects/' 
    def versions = ['trunk/' + APP] 
    
    def svnTagsUrl = svnBaseUrl + 'tags/' + APP 
    def command = ['svn', 'list', svnTagsUrl,'--username', 'some_name', '--password', 'some_password'] 
    def proc = command.execute() 
    proc.waitForOrKill(10000) 
    if (proc.exitValue() == 0) { 
        proc.text.eachLine { versions.add('tags/' + APP + '/' + it) } 
    } 
    
    def svnBranchesUrl = svnBaseUrl + 'branches/' + APP 
    command = ['svn', 'list', svnTagsUrl,'--username', 'some_name', '--password', 'some_password'] 
    proc = command.execute() 
    proc.waitForOrKill(10000) 
    if (proc.exitValue() == 0) { 
        proc.text.eachLine { versions.add('branches/' + APP + '/' + it) } 
    } 
    
    return versions 
    
  • 生成触发部分,设置另一个变量(为了更好的可读性):BASE_SVN_URL=http://my-svn-repo/projects
  • enter image description here

  • 现在你把所有的变量准备就绪,你可以将其打印到詹金斯工作控制台:
  • enter image description here

    的脚本复制&贴:

    #!/bin/bash 
    echo "================================================" 
    echo "Parameters for the build:" 
    echo "Application: $APP" 
    echo "Base SVN URL: ${BASE_SVN_URL}" 
    echo "Version:  ${VERSION}" 
    echo "SVN URL:  ${BASE_SVN_URL}/${VERSION}" 
    echo "================================================" 
    

    在测试过程中,您可以在t添加一行他结束脚本的立即终止你的工作,只看到值:

    exit 1 
    
  • 最后,调用另一个詹金斯工作Build-application-core-job,将执行实际的构建。通过这项工作所需的所有参数:
  • enter image description here

  • 当你运行你的工作,你会得到两个参数,其中第二将一个总是包含屏幕根据所述第一个的所述值的有效值:
  • enter image description here

  • 最后但并非最不重要的:以下的标准是好:)如果你遵循标准,你可以使用List Subversions标签(和更多)几乎开箱即用,如https://stackoverflow.com/a/32622725/2886891
  • 0

    您可以使用插件的一个或摊位下面。

    1 - Dynamic Extended Choice Paramenter 这似乎正是你想要的,但我从来没有使用过这个。

    2 - Dynamic Parameter在此,您可以配置脚本以读取所有应用程序的分支或中继,并在您的作业的选项选项上进行转换,或者只添加一个静态选项列表。

    相关问题