如何在Jenkins pipeline中获取当前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('\
').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的工具"(我也尝试了" 颠覆")。 尝试def revision = System.getenv('SVN_REVISION')打印"空"。

知道我该怎么做吗?


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

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


由于我在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*/

如果是已经在版本控制的目录里了,如:D:\_job\TestJava\trunk\,可以直接使用:

很抱歉,您无法使用此线程,但我希望这对某些人有用。

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


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


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 Platform方法,或者使用任何不需使用闭包的方法。

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

您真正想开始的是直接访问SVN_REVISION,而不必自己运行svn info。跟踪为JENKINS-26100。

 

 

 

出处:https://www.codenong.com/29191399/

posted on 2022-04-24 12:15  jack_Meng  阅读(1077)  评论(0编辑  收藏  举报

导航