使用Jenkins </display-name>在构建时修改web.xml中的<display-name>

时间:2015-02-06 21:57:54

标签: java git maven grails jenkins

我需要处理几个独立环境中部署在多个服务器上的几个war文件。我们使用Jenkins来构建战争,这些战争是由Grails根据从git repo下载的代码生成的。战争部署在tomcat中。 tomcat管理页面显示&#34;显示名称&#34;为每场战争。我想在构建时使用一些构建标识符修改该显示名称,因此我可以从所有tomcat服务器轮询显示名称,并检测是否存在任何版本不同步的战争。

我承认&#34;显示名称&#34;在<display-name>文件中的WEB-INF/web.xml标记之间设置。

所以我的问题是:生成战争后是否有任何Jenkins插件可以修改web.xml <display-name>值?或者我可以用来修改给定war文件的特定值的任何现有工具? (所以我可以从Jenkins运行它作为最后一个构建步骤,将其设为BUILD_ID)。当然欢迎任何其他选择。

2 个答案:

答案 0 :(得分:1)

使用application.properties和环境名称中的信息生成显示名称。基本上它是这样生成的:"${app.name}-${env.name}-${app.version}"。您可以在编辑之前修改名称和版本,在Jenkins中添加构建步骤。

E.g。我们使用Gant脚本添加从Mercurial中提取的额外信息,以构建应用程序的名称和版本。这是我们的剧本:

// File: scripts/PrepareApplicationProperties.groovy
target(prepareApplicationProperties: "set application properties") {
    def buildNumber = metadata.'app.number' = System.getenv('BUILD_NUMBER') ?: "0"
    metadata.'app.mercurialRevision' = System.getenv('MERCURIAL_REVISION') ?: "0"
    def mercurialRevisionNumber = metadata.'app.mercurialRevisionNumber' = System.getenv('MERCURIAL_REVISION_NUMBER') ?: "0"
    metadata.'app.version' = metadata.'app.version' + ".$buildNumber.$mercurialRevisionNumber"
    metadata.persist()
}
setDefaultTarget(prepareApplicationProperties)

更为通用的解决方案是Haki先生提出的建议: http://mrhaki.blogspot.com.au/2011/02/grails-goodness-one-war-to-rule-them_4229.html因为他直接操纵web.xml

// File: scripts/_Events.groovy
eventWebXmlStart = { webXmlFile ->
    ant.echo message: "Change display-name for web.xml"
    def tmpWebXmlFile = new File(projectWorkDir, webXmlFile)
    ant.replace(file: tmpWebXmlFile, token: "@grails.app.name.version@",
            value: "${grailsAppName}-${grailsAppVersion}")
}

答案 1 :(得分:0)

根据文章中的步骤,在2.5.0中对我来说并不是很好。所以我发现_Events.groovy效果很好:

eventWebXmlStart = { webXmlFile ->
    ant.echo message: "Change display-name for web.xml"
    def tmpWebXmlFile = new File(projectWorkDir, webXmlFile)
    ant.replace(file: tmpWebXmlFile, token: "${grailsAppName}-${grailsEnv}-${grailsAppVersion}",
                value: "${grailsAppName}")
}

不需要安装模板的步骤