2015-02-06 262 views
0

我需要处理几个部署在几个独立环境中的服务器上的war文件。我们使用Jenkins构建战争,Grails根据从git repo下载的代码生成战争。战争部署在tomcat中。 tomcat管理页面显示每个战争的“显示名称”。我想在构建时使用构建标识符来修改显示名称,以便我可以从所有tomcat服务器轮询显示名称,并检测是否有任何战争版本不同步。在Jenkins修改web.xml中的<display-name>

我承诺,“显示名称”设置在WEB-INF/web.xml文件中的<display-name>标记之间。

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

回答

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: "@[email protected]", 
      value: "${grailsAppName}-${grailsAppVersion}") 
} 
+0

谢谢你,我想我会尝试一些类似'_Events.groovy'钩选项,也许将Jenkins环境变量添加到字符串中。 – AlejandroVD 2015-02-09 21:09:59

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}") 
} 

并与安装模板的步骤是没有必要的