如何在Jenkins工作流插件中获取SVN修订号?

如何在Jenkins工作流插件中获取SVN修订号?,svn,jenkins,jenkins-workflow,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('tru

我使用的是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'打印空值

你知道我该怎么做吗?

没有这样的文件或目录错误意味着:Subversion没有安装在构建从属服务器上

您似乎已经了解了这一点,并试图通过使用工具安装Subversion来解决这一问题。但是Jenkins Subversion插件没有Subversion的工具定义;它总是使用SVNKit,一个进程内Java库。所以这是行不通的

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

假设您安装Subversion使svn位于$PATH中,下一个问题是使用GDK中的String.execute通常也不会在工作流中工作。这是因为流脚本在Jenkins主进程内运行,而不是在从进程上运行。必须在Windows从属设备上使用sh step或bat来运行外部命令。关于从他们那里获得输出,描述了当前的习惯用法

JDK中的String.find当前无法工作:。改用Java平台方法,或者任何不需要闭包的方法

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


您真正想要的是直接访问SVN_修订版,而不必自己运行SVN info。这被跟踪为。

有一种方法可以使用每个SVN模块的变量进行跟踪。请参见下面的答案
基本上使用$SVN_REVISION_x变量,其中x是SVN URL模块的计数器。您可以回显该变量并将其作为工件放入文件中。

因为我在internet上找到了一个很好的脚本,我不记得在哪里,我们使用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*/
很抱歉挖掘了这条线索,但我希望这对一些人有用

使用这些变量时,不要忘记使用双引号。 这对我来说有点难弄清楚-/

这是一个已知的错误:

我有相同的问题,环境变量未加载。
您可以从路径C:\Program Files x86\Jenkins\jobs\${pipelineTaskName}\builds\${buildNumber}中名为revision.txt的文件中获取修订号。

谢谢您的详细回答!所以我知道现在没有办法这么做?如果没有,我可以使用时间戳。您可以从sh步骤运行svn info,只要Subversion安装在从机上。