34

我在 Jenkins 有一份 Maven 工作。在实际构建步骤之前,我有一个“执行 shell”预构建步骤。在那个shell中我设置了一个变量:

REVISION=$(cat .build_revision)

我想在“目标和选项”的 Maven 构建作业中使用该变量:

clean install -Drevision=${REVISION}

但这不起作用!“Drevision”设置为“${REVISION}”,而不是 ${REVISION} 的实际值。输出:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Drevision=${REVISION}

它适用于 Jenkins 环境变量:

clean install -Dbuild=${BUILD_NUMBER}

它将“Dbuild”设置为实际的内部版本号。输出:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Dbuild=54

我的问题:如何在 Maven“目标和选项”中使用 shell 变量?

编辑:

我尝试在预构建 shell 之后使用Jenkins EnvInject 插件来“注入环境变量”,现在我的变量可以通过构建后的 shell 访问,但它在 Maven“目标和选项”中仍然不可用。

然后可以使用 EnvInject 插件设置“将环境变量注入构建过程”,这实际上使这些变量在 Maven“目标和选项”中可用,但这些变量是在 SCM 签出之后立即设置的,即在预构建步骤之前,并且不支持表达式评估。

4

6 回答 6

40

你在正确的轨道上,但错过了 EnvInject-Plugin 的第三个功能:“注入环境变量”构建步骤,它可以根据脚本或属性的结果将变量注入到后续构建步骤中。

我们就是这样使用 EnvInject 插件的;脚本设置资源并使用属性传递其参数,然后由插件作为环境变量传播。

即为构建设置一个临时数据库: 为构建创建一个数据库

于 2013-07-25T13:27:14.493 回答
10

我有一个非常相似的问题,试图计算一个构建版本并将其注入到构建中。在遇到所有相同的问题(不扩展等)后,我使用了“从脚本生成环境变量”选项,它将输出解释为 tag=value 对到 Jenkins 变量中。剧本 :

  #generate a version code that is high enough to surpass previously published clients
  val=`expr 150000 + $BUILD_NUMBER`
  echo VERSION_CODE=$val

在此之后,我能够将 $VERSION_CODE 注入 maven,如下所示:

  -Dbuild.vercode=${VERSION_CODE}

希望这对你有用。

于 2013-09-19T23:40:47.663 回答
3

此问题是由 Jenkins Maven 项目插件中的错误引起的,详见2012 年 6 月 22 日打开的此错误报告。从 2.1 版开始,该插件尚未修复。

已针对 Maven 项目插件提出了修复,但尚未集成。这是拉取请求的链接:https ://github.com/jenkinsci/maven-plugin/pull/14

如果您在应用了拉取请求补丁的情况下自己构建插件,则变量将被注入并按预期提供给“目标和选项”字段。

于 2014-02-26T16:53:55.833 回答
3

我看到有一个公认的答案,但对于 Jenkins 的新手来说,我发现很难掌握这一切。这就是为什么我会在这个答案中添加更多细节并展示我是如何做到的。

正如@jjungnickel 建议的那样,您需要为 Jenkins 安装EnvInject 插件。然后在构建部分 >添加构建步骤中,您将获得“注入环境变量”选项。

基本上这个想法是:

  1. 将稍后要访问的变量添加到文件中(可能由 shell 脚本添加,也可能是文件系统中的文件)。
  2. 使用变量注入文件。
  3. 使用变量。

这是一个示例设置:

在此处输入图像描述

因为我想在 Maven 目标中使用它们,所以我需要选中 Inject Build Variables 复选框。

然后在构建结束时删除文件只是因为我想保持构建之前的环境。

于 2017-11-29T12:41:04.937 回答
0

I think your best shot is to try the EnvInject plugin for this along with your initial pre-scm step.

  1. You run the pre-scm as you already do.
  2. You use the env inject to load the file for the main job's build steps

Consider loading your file's content (properties format) or execute a script which will load the file as you want and make a variable available for the rest of the job with the "Prepare an environment for the run" option.

I hope this helps.

于 2013-05-02T14:31:19.933 回答
0

我需要在注入完成之前解析变量,所以我把它放在脚本内容中:

示例:(请注意,这里似乎无法简单地导出变量,所以我写了文件,jenkins 中的帮助部分似乎表明这是预期的)

git ls-tree --name-only -r ${sha1} | grep -v -c "*\.md" > diff.bak

git diff origin/master --shortstat | grep "1 files changed" && echo 1 > count.bak || echo 0 > count.bak

然后我在 groovy 脚本中添加了这个,使用我可以创建地图的输出文件:

def procDiff = "cat $WORKSPACE/diff.bak".execute()
def procCount = "cat $WORKSPACE/count.bak".execute()
def diff = procDiff.text
def count = procCount.text

print "string val = $diff and count = $count "

if ("0".equals(diff) || !"1".equals(count)){
def map = ["GOAL": "clean verify"]
return map
} else {
def map = ["GOAL": "clean"]
return map
}

然后我可以在我的 maven 构建中引用 $GOAL 以根据引发的 PR 类型有条件地触发“清理”或“清理验证”。

在此处输入图像描述

于 2020-04-17T19:18:48.020 回答