0

我有一个运行 maven 目标的 Hudson 工作。在执行这个 maven 目标之前,我添加了一个在构建开始之前运行的步骤,它是一个 shell 脚本,用于获取我想在“目标和选项”字段中使用的版本号。

因此,在我的作业配置中,在构建环境下,我检查了配置 M2 额外构建步骤框并在构建之前添加了一个 shell 脚本。脚本如下所示:

export RELEASE={command to extract release version}
echo $RELEASE

然后在Build部分下,我指向我的“root pom”。然后,在目标和选项中,我希望能够执行以下操作:

-Dbuild.release.version=${RELEASE} deploy

其中build.release.version是 POM 中引用的 Maven 属性。然而,由于 shell 似乎没有使其变量成为全局变量,所以它不起作用。有任何想法吗?

我唯一拥有的是安装Envfile插件并让 shell 脚本将 RELEASE 属性写到文件中,然后让插件读取文件,但是一切运行的顺序可能会导致问题,看起来像必须有更简单的方法......有吗?

提前致谢。

4

2 回答 2

1

我最近想做同样的事情,但是 AFAIK 不可能将值从预构建 shell 导出到作业环境。如果有一个哈德逊插件,我已经错过了。

但是,起作用的是类似于您建议的设置:让预构建 shell 脚本将所需的值写入工作区中的属性文件,然后使用参数化触发器插件来触发另一个作业这实际上完成了工作(在您的情况下,调用 Maven 作业)。插件可以配置为从属性文件中读取它传递的参数。所以第一个作业只有 shell 脚本和构建后触发器,第二个作业执行实际工作,将正确的参数用作环境变量。

shell脚本的总体思路:

echo "foo=bar
baz=`somecmd`" > build.properties

对于您的目标和选项,例如:

-Dbuild.release.version=${foo} deploy

当然,这并不像人们想要的那样优雅,但对我们来说确实很好,因为我们的构建从一开始就被分解为几个作业,我们实际上可以重用第一个触发的其他作业(即调用它们具有不同的参数)。

于 2011-05-25T07:43:18.773 回答
0

当你说它不起作用时,你的意思是你的RELEASE变量没有传递给maven命令吗?我相信问题是默认情况下,shell脚本的每一行都是单独执行的,所以环境变量会丢失。

如果您希望整个 shell 脚本像一个脚本文件一样执行,请创建第一行:

#!/bin/sh

我认为这在 shell 脚本构建步骤旁边的帮助信息中有所描述(如果我错了,那是寻找正确语法的好地方)。

于 2010-09-02T21:52:21.373 回答