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



我使用的是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:Cannot run program"svn":error=2,No such file or directory",第二次显示"No tool named svn found"(我也尝试过"Subversion")。尝试def revision = System.getenv('SVN_REVISION')打印"null"。

你知道我该怎么做吗?

No such file or directory错误的含义正是它所说的:Subversion没有安装在您的构建从属服务器上。

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

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

假设您安装了Subversion,使svn位于$PATH中,那么下一个问题是从GDK中使用String.execute()通常也不会在工作流中工作。这是因为流脚本是在Jenkins主进程中运行的,而不是在从属进程上运行的。必须使用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。

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

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

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

由于我在互联网上找到了一个很好的脚本(我不记得在哪里),并且我们使用了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*/

很抱歉挖掘出这条线索,但我希望这对一些人有用。

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

最新更新