【问题标题】:Configure a Jenkins job to select an application and trunk/tags/branches from SVN配置 Jenkins 作业以从 SVN 中选择应用程序和主干/标签/分支
【发布时间】:2017-05-23 19:29:51
【问题描述】:

我们想使用单个 Jenkins 作业来构建应用程序。

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? 显示供选择:

  • 主干
  • 分支机构/app1
  • 分支机构/app2
  • 分支机构/app3
  • 标签/app1
  • 标签/app2
  • 标签/app3

我们想要的如下:

选择 1:

  • app1
  • app2
  • app3

选择 2(自动基于选择 1,例如对于 app2):

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

【问题讨论】:

    标签: svn jenkins build jenkins-plugins hudson


    【解决方案1】:

    使用 Active Choice Parameter 和 Groovy 脚本。

    1. 创建参数APP 以选择应用程序。 Groovy 脚本会返回选择列表,因此只需返回硬编码列表(或从文件或您希望的任何位置读取):

    1. 创建参数VERSION选择版本。

      • 现在使用Active Choice Reactive参数,这样你就可以对参数APP的变化做出反应了。
      • Groovy 脚本逐渐构建可供选择的选项列表。首先是主干,然后是标签,然后是分支。
      • 使用命令行svn list获取数据,格式为

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

      • 引用的参数必须设置为APP。每当APP 的值更新时,Groovy 脚本将使用引用参数的更新值重新评估选择列表。

    这里是复制和粘贴的脚本:

    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
    
    1. 构建触发器部分,设置另一个变量(为了更好的可读性):BASE_SVN_URL=http://my-svn-repo/projects

    1. 现在您已准备好所有变量,您可以将它们打印到 Jenkins 作业控制台:

    复制粘贴脚本:

    #!/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 "================================================"
    

    在测试期间,您可以在脚本末尾添加一行以立即终止您的工作并只查看值:

    exit 1
    
    1. 最后,调用另一个 Jenkins 作业 Build-application-core-job,它将执行实际的构建。向作业传递所有必要的参数:

    1. 运行作业时,您将看到一个包含两个参数的屏幕,其中第二个参数始终包含有效值,具体取决于第一个参数的值:

    1. 最后但并非最不重要的一点:遵循标准是好的 :) 如果您遵循标准,您可以使用几乎开箱即用的 List Subversions 标签(以及更多) 插件,如 https://stackoverflow.com/a/32622725/2886891 所述

    【讨论】:

      【解决方案2】:

      您可以使用以下插件中的一个或一个。

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

      2 - Dynamic Parameter 在此您可以配置一个脚本来读取所有应用程序、分支或主干,并将其转换为您的工作的选择选项,或者只是添加静态选项列表。

      【讨论】:

        猜你喜欢
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 2012-10-19
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多