如何在Jenkins Workflow Plugin中获取SVN修订版号?

时间:2015-03-22 05:41:27

标签: svn jenkins jenkins-workflow

我使用的是Jenkins 1.596,Workflow 1.3和Svn插件2.5。我试图在我的工作流脚本中获取svn版本号。

我的工作流程脚本部分是:

node {
   checkout scm: [ $class: "SubversionSCM", locations: [[ remote:'https://secure3.svnrepository.com/somerepo/trunk', credentialsId: cid]] ]
   stage 'build'
   dir('trunk') {
      def revision = 'svn info'.execute().in.text.split('\n').find { it.startsWith('Revision') }.split(':')[1].trim()
      println revision
      def svnHome = tool 'Svn'
      sh "$svnHome/bin/svn info"
      def mvnHome = tool 'Maven'
      sh "export JAVA_HOME=/var/jenkins_home/java; $mvnHome/bin/mvn --version"
      sh "export JAVA_HOME=/var/jenkins_home/java; $mvnHome/bin/mvn clean deploy"
}

在这里你看到两次尝试:第一次打印" java.io.IOException:无法运行程序" svn":error = 2,没有这样的文件或目录",和第二次说"没有找到名为Svn的工具" (我也试过" Subversion")。尝试def revision = System.getenv('SVN_REVISION')打印" null"。

知道我怎么做这个吗?

4 个答案:

答案 0 :(得分:0)

No such file or directory错误意味着它的含义:构建从属服务器上没有安装Subversion。

您似乎已经得到了这个,并尝试使用tool安装Subversion来解决它。但是Jenkins Subversion插件没有Subversion的工具定义;它总是使用SVNKit,一个进程内(Java)库。所以这不起作用。

(顺便说一下,Mercurial插件总是运行hg可执行文件,而Git插件可以使用git可执行文件或嵌入式JGit库。两者都允许你定义工具安装,但是< em> not 定义特殊(自动)安装程序,因此它们对这种情况没有多大帮助。你可以运行sh 'sudo apt-get install subversion'。)

假设您安装Subversion以便svn位于$PATH,则下一个问题是,使用GDK中的String.execute()通常也无法在工作流中使用。这是因为流脚本在Jenkins主进程内运行,而不是在slave上运行。您必须使用sh步骤(或Windows从站上的bat)来运行外部命令。至于从它们返回输出,JENKINS-26133描述了当前的习语。

来自JDK的

String.find目前无效:JENKINS-26481。请改用Java平台方法,或者只使用任何不关闭的方法。

由于类似于String.execute()不合适的原因,System.getenv无法为工作流构建定义“环境变量”:这只会加载在Jenkins主进程上设置的环境变量,已修复在Jenkins创业时间。您正在考虑的变量仅在分叉流程(sh / bat)上设置;或者您可以使用env.VARIABLE语法从Groovy访问它们。

您真正想要的是直接访问SVN_REVISION而无需自己运行svn info。这被跟踪为JENKINS-26100

答案 1 :(得分:0)

有一种方法可以使用每个SVN模块的变量。请参阅以下答案 https://stackoverflow.com/a/24956967/5842403 基本上你使用$ SVN_REVISION_x变量,其中“x”是svn URL模块的计数器。您可以回显该变量并将文件作为工件放入。

答案 2 :(得分:0)

由于我在互联网上发现了一个不错的脚本(我不记得在哪里),我们使用groovy脚本,我想分享这个对我有用的解决方案:

def url = "ENTER HERE YOUR SVN URL"
def SVN_REVISION = "svn info --show-item last-changed-revision $url".execute().text

echo "$SVN_REVISION" /*should work now*/

很抱歉发布这个帖子,但我希望这对一些人有用。

使用这些变量时不要忘记使用双引号。 这对我来说很难找到。 : - /

答案 3 :(得分:0)

这是一个已知错误:https://issues.jenkins-ci.org/browse/JENKINS-32744

我遇到了同样的问题(环境变量没有被加载)。 您可以从名为&#34; revision.txt&#34;的文件中获取修订号。在路径中:&#34; C:\ Program Files(x86)\ Jenkins \ jobs \ $ {pipelineTaskName} \ builds \ $ {buildNumber}&#34;。