1

我正在使用 Jenkins 1.596、工作流 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”(我也试过“颠覆”)。尝试def revision = System.getenv('SVN_REVISION')打印“null”。

知道我该怎么做吗?

4

4 回答 4

0

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在您$PATHString.execute(). 那是因为流程脚本是在 Jenkins 主进程内部运行的,而不是在从属进程上运行的。您必须使用该sh步骤(或bat在 Windows 从站上)运行外部命令。至于从它们那里获取输出,JENKINS-26133描述了当前的成语。

String.find来自 JDK 的当前不起作用:JENKINS-26481。改用 Java 平台方法,或者使用任何不使用闭包的方法。

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

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

于 2015-04-02T11:46:04.707 回答
0

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

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

于 2017-01-16T16:13:10.440 回答
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*/

很抱歉挖掘了这个线程,但我希望这对某些人有用。

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

于 2016-11-24T08:28:27.967 回答
0

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

于 2016-01-28T12:31:15.833 回答