我能够创建一个maven插件,从存储库中获取url信息并从svn获取信息:
@Mojo(name = "svn-info", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
@Execute(phase = LifecyclePhase.PROCESS_SOURCES)
public class SvnInfoMojo extends AbstractMojo {
@Parameter(property="project.scm.url", defaultValue = "${project.scm.url}", required = true)
private String url;
private SVNInfo info;
private Long svnLastRevision;
private Date svnLastChangedDate;
public void execute() throws MojoExecutionException, MojoFailureException {
// the controller uses SVNKit to fetch the info
SVNController controller = new SVNController(url);
info = controller.getInfo();
this.svnLastRevision = info.getCommittedRevision().getNumber();
this.svnLastChangedDate = info.getCommittedDate();
}
}
现在我的问题是:
如何在项目pom中设置变量${last-rev}
和${last-changed}
?我尝试了以下内容:
@Parameter(property = "last-rev")
private Long svnLastRevision;
@Parameter(property = "last-changed")
private Date svnLastChangedDate;
但是这不起作用,我的测试pom仍显示$ {last-rev}。
我正在使用Maven和Jenkins来构建项目。我已经能够使用<properties>
和<filtering>true</filtering>
来包含pom文件中的属性:
application.revision=${project.version} #uses maven's version tag.
application.revision=Rev. ${last-rev} of ${last-changed}
application.build.type=${project.buildType} #depends on the maven profile
我现在正尝试按以下格式将SVN修订信息插入属性文件中:
application.revision=Rev. ${last-rev} of ${last-changed}
例如,这会给我Rev. 11981 of 2014-02-03 11:01:20 -0200 (Mon, 03 Fev 2014)
。
这是我到目前为止所尝试的:
在Jenkins预构建作业期间调用shell脚本。
虽然这有效(使用svn info
和sed
命令) ,它取决于平台,这并不理想。
我的问题是它为我提供了SVN 修订版号,而不是 Last Changed Rev 。
另外,如果我尝试将修订格式化为我想要的格式(使用<format>
配置选项),它会将$ {buildNumber}更改为内部版本并使用构建日期(例如:Rev. 1 of 2014-02-04 15:03:57 -0800 (Tue, 04 Fev 2014)
)。
使用SVNKit创建我自己的Maven插件。
为了做到这一点,我需要:
在后一种情况下,我是maven插件API的新手。我真的不知道如何获取Scm组件或创建项目pom可用的变量。我已尝试使用@Component private Scm scm;
,但这不起作用。
关于如何将Last Changed Rev.和Last Changed Date添加到我的属性文件中的任何想法?
答案 0 :(得分:0)
在Jenkins预构建作业期间调用shell脚本。
虽然这有效(使用svn info和sed命令),但它是平台 依赖,这是不理想的。
此外,如果您使用svn info
,您将获得SVN修订号而不是
最后改变了Rev.除了有更好的工具
获取此类信息svnversion
。
使用Build Number Maven插件。
我的问题是它给了我SVN版本号,而不是最后一个 改变了修订版
这给我的印象是你不理解SVN之间的差异
修订号和最后更改的转速。如果你想拥有
last changed rev
您必须说明哪个文件?通常你喜欢
有最后一次更改你的主干的修改,这正是
内置编号maven插件将提供(以及svn info或svnversion)。
使用SVNKit创建我自己的Maven插件。
你将采用与build-number-maven-plugin相同的方式。
您可以使用buildnumber-maven-plugin的以下配置来获取您应该使用的svn修订版:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.2</version>
<configuration>
<revisionOnScmFailure>UNKNOWN</revisionOnScmFailure>
<getRevisionOnlyOnce>true</getRevisionOnlyOnce>
</configuration>
<executions>
<execution>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
</plugin>
通过使用上述配置,您可以使用包含SVN修订号的${buildNumber}
。
答案 1 :(得分:0)
我能够解决这两个问题(获得Last Changed Rev并创建我的Maven插件)!我不需要maven插件,但我可能会在以后派上用场(即如果Jenkins Subversion插件稍后将${SVN_REVISION}
变量更改为存储库修订版)。
对于第一个问题,我误读了Jenkins Subversion插件文档。 ${SVN_REVISION}
环境变量确实返回 Last Changed Rev 编号,而不是存储库修订版编号。所以,我能够在我的pom中做到这一点:
<强>的pom.xml 强>
<properties>
<!-- this default revision number will be changed by Jenkins -->
<svn.revision>REV</svn.revision>
<!-- other properties -->
</properties>
然后,在Jenkins 构建任务中,我使用package -Dsvn.revision=${SVN_REVISION}
调用maven,然后更改Maven中的svn.revision参数。
为了在我的Maven插件中设置参数,我使用了类MavenProject
,它为我提供了项目pom属性:
@Mojo(name = "svn-info", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
@Execute(phase = LifecyclePhase.PROCESS_SOURCES)
public class SvnInfoMojo extends AbstractMojo {
@Component
private MavenProject project;
@Parameter(property="project.scm.url", defaultValue = "${project.scm.url}", required = true)
private String url;
private String svnLastRevision;
private String svnLastChangedDate;
public void execute() throws MojoExecutionException, MojoFailureException {
SVNController controller = new SVNController(url);
info = controller.getInfo();
this.svnLastRevision = Long.toString(info.getCommittedRevision().getNumber());
// Sets the property ${last-rev} in the project pom
project.getProperties().setProperty("last-rev", this.svnLastRevision);
// uses DateFormat to parse the date
this.svnLastChangedDate = parseDate(info.getCommittedDate());
// Sets the property ${last-changed} in the project pom
project.getProperties().setProperty("last-changed", this.svnLastChangedDate);
}
}