2017-06-23 225 views
0

我想使用freemarker模板自定义Teamcity通知电子邮件。如何使用freemarker的枚举参数调用方法

从freemarker获取Teamcity数据模型是可行的。

数据模型是类似于下面

<#-- @ftlvariable name="project" type="jetbrains.buildServer.serverSide.SProject" --> 
<#-- @ftlvariable name="buildType" type="jetbrains.buildServer.serverSide.SBuildType" --> 
<#-- @ftlvariable name="build" type="jetbrains.buildServer.serverSide.SBuild" --> 
<#-- @ftlvariable name="agentName" type="java.lang.String" --> 
<#-- @ftlvariable name="buildServer" type="jetbrains.buildServer.serverSide.SBuildServer" --> 
<#-- @ftlvariable name="webLinks" type="jetbrains.buildServer.serverSide.WebLinks" --> 

<#-- @ftlvariable name="var.buildFailedTestsErrors" type="java.lang.String" --> 
<#-- @ftlvariable name="var.buildShortStatusDescription" type="java.lang.String" --> 
<#-- @ftlvariable name="var.buildChanges" type="java.lang.String" --> 
<#-- @ftlvariable name="var.buildCompilationErrors" type="java.lang.String" --> 

<#-- @ftlvariable name="link.editNotificationsLink" type="java.lang.String" --> 
<#-- @ftlvariable name="link.buildResultsLink" type="java.lang.String" --> 
<#-- @ftlvariable name="link.buildChangesLink" type="java.lang.String" --> 
<#-- @ftlvariable name="responsibility" type="jetbrains.buildServer.responsibility.ResponsibilityEntry" --> 
<#-- @ftlvariable name="oldResponsibility" type="jetbrains.buildServer.responsibility.ResponsibilityEntry" --> 

我知道这是可以通过它的名字直接得到bean的属性,例如,有继承getName()方法jetbrains.buildServer.serverSide.SBuildType,所以由我可以得到name属性来自freemarker模板的buildType.name

但是,对于下面的方法,我不知道如何从模板中获取具有不同参数的构建工件。

的方法文档是如下:

getArtifacts 

@NotNull 
BuildArtifacts getArtifacts(@NotNull 
            BuildArtifactsViewMode mode) 
Returns accessor for build artifacts. This accessor checks all necessary permissions for accessing files. 
Parameters: 
mode - view mode to see artifacts 
Returns: 
build artifacts viewer 

BuildArtifactsViewMode的定义如下,

Enum BuildArtifactsViewMode 

VIEW_ALL 
      Will show all build artifacts i.e. 
VIEW_ALL_WITH_ARCHIVES_CONTENT 
      Will show all build artifacts and archives content 
VIEW_DEFAULT 
      Will show all user-published artifacts 
VIEW_DEFAULT_WITH_ARCHIVES_CONTENT 
      Will show all user-published artifacts and archives content 
VIEW_HIDDEN_ONLY 
      Will show only hidden build artifacts 

感谢您的帮助提前。

+0

顺便说一句,以在通知中列出构建的构件,在TeamCity doc中提到了一种解决方法:https://confluence.jetbrains.com/display/TCD10/Customizing+Notifications#CustomizingNotifications-Listingbuildartifacts – Yaegor

+0

@Yaegor。有用。谢谢。 – Gearon

回答

1

我对Teamcity一无所知,但作为模板作者,您依赖于暴露给您的内容,并且类和枚举不会在最小的FreeMarker设置中公开。如果你有能力在Teamcity中配置FreeMarker,或者添加填充数据模型的Java代码,那么你可以做这样的事情(在这里我使用基于Configuration的方法,但是你可以将这些方法添加到数据模型中,模型同样也):

cfg.setSharedVariable(
     "enums", 
     ((BeansWrapper) cfg.getObjectWrapper()).getEnumModels()); 

,然后在模板:

${someMethod(enums['com.example.MyEnum'].FOO)} 

和/或你可以这样做:

cfg.setSharedVariable(
     "MyEnum", 
     ((BeansWrapper) cfg.getObjectWrapper()).getEnumModels().get(MyEnum.class.getName())); 

,然后在临时晚:

${someMethod(MyEnum.FOO)} 

如果TeamCity的不允许你做这样的事情,那么它的他们,以确保一些类似的设施给你,让我们希望别人知道的是......

+0

默认情况下,TeamCity不公开枚举枚举,但这里是一个简单的TeamCity插件,它可以这样做:https://youtrack.jetbrains.com/issue/TW-50431#comment=27-2266647 – Yaegor