如何在 Jenkins Workflow Plugin 中获取 SVN 修订号?
How to get SVN revision number in Jenkins Workflow Plugin?
我使用的是 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 master 进程中,而不是在 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.
有一种方法可以使用每个 SVN 模块的变量来实现。请参阅下面的答案
基本上你使用 $SVN_REVISION_x 变量,其中 "x" 是 svn URL 模块的计数器。您可以回显该变量并将其作为工件放入文件中。
因为我在互联网上找到了一个不错的脚本(我不记得在哪里)并且我们使用 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*/
抱歉挖出这个话题,但我希望这对某些人有用。
使用这些变量时不要忘记使用双引号。
这对我来说很难找到。 :-/
这是一个已知错误:https://issues.jenkins-ci.org/browse/JENKINS-32744。
我遇到了同样的问题(未加载环境变量)。
您可以从路径中名为 "revision.txt" 的文件中获取修订号:"C:\Program Files (x86)\Jenkins\jobs${pipelineTaskName}\builds${buildNumber}".
我使用的是 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 master 进程中,而不是在 slave 上。您必须使用 sh
步骤(或 Windows 从机上的 bat
)到 运行 外部命令。至于从他们那里取回输出,JENKINS-26133 描述了当前的习惯用法。
String.find
当前将不起作用:JENKINS-26481。请改用 Java 平台方法,或任何不采用闭包的方法。
出于类似于 String.execute()
不合适的原因,System.getenv
无法获取为工作流构建定义的“环境变量”:这只会加载在 Jenkins 主进程上设置的环境变量,固定在 Jenkins 启动时间。您正在考虑的变量仅在分叉进程上设置(sh
/bat
);或者您可以使用 env.VARIABLE
语法从 Groovy 访问它们。
您真正想要开始的是直接访问 SVN_REVISION
,而不必自己 运行 svn info
。这被跟踪为 JENKINS-26100.
有一种方法可以使用每个 SVN 模块的变量来实现。请参阅下面的答案 基本上你使用 $SVN_REVISION_x 变量,其中 "x" 是 svn URL 模块的计数器。您可以回显该变量并将其作为工件放入文件中。
因为我在互联网上找到了一个不错的脚本(我不记得在哪里)并且我们使用 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*/
抱歉挖出这个话题,但我希望这对某些人有用。
使用这些变量时不要忘记使用双引号。 这对我来说很难找到。 :-/
这是一个已知错误:https://issues.jenkins-ci.org/browse/JENKINS-32744。
我遇到了同样的问题(未加载环境变量)。 您可以从路径中名为 "revision.txt" 的文件中获取修订号:"C:\Program Files (x86)\Jenkins\jobs${pipelineTaskName}\builds${buildNumber}".