【问题标题】:Is there a plugin for listing subversion tags in Hudson?有没有在 Hudson 中列出颠覆标签的插件?
【发布时间】:2011-03-07 08:02:19
【问题描述】:

Hudson 中,我们有一个将指定的颠覆标签部署到服务器的作业。此标签当前输入到文本字段中,但由于这只是等待发生的输入错误,我们希望将该文本字段替换为具有当前可用标签的下拉列表。也就是说,我们希望 Hudson 去 /tags 并获取在那里找到的所有标签。

我已经搜索了Hudson plugin 或其他方式来完成此操作,但没有成功。这不可能是第一次有人想要这个,对吧?或者由于某种我目前无法想到的原因,这是否会被视为不好的做法?

编辑

其他人确实有相同的想法(仅在三周前),但目前没有发布的解决方案:http://issues.hudson-ci.org/browse/HUDSON-6682?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

编辑 2

我现在已经实现了 Zachary Young 的答案,并且在对我们的环境进行了一些修改后,它可以完美运行。

我们的修改:

我们有以 UTF-8 编码的国际内容,我不得不将其添加到 join.xsl:

<xsl:output method="xml" indent="yes" encoding="UTF-8"/>

以及上传新配置的 curl 命令:

curl -H "Content-Type: text/xml; charset=UTF-8" -X POST --data-binary @$WORKING_DIR/new-config.xml $HUDSON_CONFIG_PATH -u $USER:$PASSWORD

至少我现在记得的。

这现在放在一个外部脚本中,但我会将它放在一个 Hudson 作业中,以便其他开发人员可以轻松运行它。

我敦促大家支持 Zachary Young 的回答

【问题讨论】:

    标签: svn tags hudson


    【解决方案1】:

    更新 01:
    这现在是 Subversion Plugin 的一部分,随 jenkins/hudson.war 一起提供。

    代替 Hudson 插件(我不懂 Java),用一些 XSL (1.0) 怎么样?在以下解决方案中:

    1. 我们通过svn list --xml得到标签的目录列表,保存到svn-list.xml
    2. 我们运行转换以将 svn-list.xml 转换为 Hudson 的内部模式,以供选择下拉菜单,保存到 hudson-list.xml
    3. 我们运行另一个转换以根据我们要更新的列表的特定名称将 hudson-list.xml 加入作业的 config.xml,保存到 new-config.xml,并使用新配置更新 Hudson 作业

    1. svn list --xml

      svn list [path-to-svn-tag-directory] --xml > svn-list.xml
    

    2。将 SVN 列表转换为 Hudson 列表

      xsltproc svn-to-hudson.xsl svn-list.xml > hudson-list.xml
    

    svn-to-hudson.xsl

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" indent="yes"/>
      <xsl:template match="/lists/list">
        <hudson.model.ChoiceParameterDefinition>
          <name>[Your Name for the List]</name>
          <description/>
          <choices class="java.util.Arrays$ArrayList">
            <a class="string-array">
              <xsl:apply-templates select="entry"/>
            </a>
          </choices>
        </hudson.model.ChoiceParameterDefinition>
      </xsl:template>
    
      <xsl:template match="entry">
        <string>
          <xsl:value-of select="name"/>
        </string>
      </xsl:template>
    </xsl:stylesheet>
    

    3.使用 Job 的 config.xml 加入 Hudson List

    以下使用curl 获取旧的config.xml,并发布新的,利用Hudson 的作业API 修改配置。

    curl -o old-config.xml http://[your-hudson-server]/job/[job-name]/config.xml -u [username]:[password]
    xsltproc join.xsl old-config.xml > new-config.xml
    curl -X POST -d @new-config.xml http://[your-hudson-server]/job/[job-name]/config.xml -u [username]:[password]
    

    join.xsl 要求同一目录中存在 hudson-list.xml:

    <xsl:variable name="tag-list" select="document('hudson-list.xml')"/>
    

    你还需要修改

    <xsl:variable name="list-name" select="string('Name')"/>
    

    添加到您在工作中的列表名称(例如,“SVN 标签”、“Tagged Builds”等...)。

    join.xsl:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:variable name="tag-list" select="document('hudson-list.xml')"/>
      <xsl:variable name="list-name" select="string('Name')"/>
    
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="hudson.model.ChoiceParameterDefinition">
        <xsl:choose>
          <xsl:when test="name = $list-name"> <!-- If the name matches, swap in new list -->
            <xsl:copy-of select="$tag-list"/>
          </xsl:when>
          <xsl:otherwise>                      <!-- If the name does not match, copy what's already there -->
            <xsl:copy-of select="."/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>
    </xsl:stylesheet>
    

    我希望这个端到端的解决方案对你有用。

    谢谢你,
    扎卡里

    【讨论】:

    • 哇,令人印象深刻的答案!这看起来不错,但我错过了如何从哈德逊运行。我的意思是:当 Hudson 用户导航到部署作业时,我希望标签列表已经存在,而无需用户运行您的代码。你的意思是我应该把它放在另一个 Hudson 工作中,即自动运行?那会起作用的,不是吗?
    • 嗨,彼得。是的,这可以作为定期在哈德逊的工作运行。这也可以实现为 SVN 中的提交后挂钩脚本,该脚本仅在创建新标签时运行。谢谢。
    • 我现在已经实施了您的解决方案,并且效果很好。请参阅我更新的问题。
    【解决方案2】:

    batch task Plugin 怎么样。这将允许您转到 Hudson 中的任何构建(当前和旧版本)并在该构建上运行批处理。批次是预定义的任务。

    只有在 Hudson 为您创建正式版本并在 subversion 中对其进行标记时,这才适用于您的目的。当然,仅适用于尚未删除的构建。 ;)

    【讨论】:

    • 目前我们正在手动标记我们的构建,但无论如何我都会看看那个插件。
    • 我不知道如何使用该插件,但我是 Hudson 新手。您有具体的解决方案吗?
    • 如果 hudson 是您的构建权限(这意味着 hudson 构建您的项目并创建 Hudson 标签),那么您可以使用存档的工件(因为它们与颠覆中的相同)或存档/生成 SVN 标签并运行您的部署。安装插件后,您可以为构建作业创建批处理任务,当您决定稍后实际部署时,您可以为给定的构建手动调用这些任务。
    • 我现在看不到的是,这将如何帮助我在我的 Hudson 部署作业中创建一个带有可用标签的选择框。你能稍微扩展一下吗?啊,你的意思是我应该跳过这种方法,而是调用自动创建的任务(每个标签一个)?嗯,我会考虑的。
    • 您不会有选择框。您只需从构建历史中选择一个构建,就会在左侧任务中找到一个链接。你选择你的部署任务,你就完成了。无需输入任何值。
    猜你喜欢
    • 2016-10-19
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2010-09-09
    • 2011-10-17
    相关资源
    最近更新 更多