Jenkins:如何在Maven“目标和选项”中使用预构建shell中的变量

时间:2013-05-02 07:33:43

标签: maven 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 Plugin来“注入环境变量”,现在可以通过以下方式访问我的变量:后期构建的shell,但它仍然无法在Maven“目标和选项”中使用。

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

6 个答案:

答案 0 :(得分:33)

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

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

即。为构建设置临时数据库: Create a database for the build

答案 1 :(得分:8)

我有一个非常类似的问题,尝试计算构建版本并将其注入构建版本。在遇到所有相同的问题(不扩展等)之后,我使用了“从脚本生成环境变量”选项,该选项将输出解释为标签=值对到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}

希望对你有用。

答案 2 :(得分:3)

此问题是由Jenkins Maven Project Plugin中的错误导致的,详情请参见2012-06-22开始的this bug report。该插件自版本2.1起尚未修复。

已经为Maven项目插件提出了一个修复程序,但尚未集成。以下是拉取请求的链接:https://github.com/jenkinsci/maven-plugin/pull/14

如果您自己使用拉取请求补丁构建插件,则会注入变量,并按预期将其用于“目标和选项”字段。

答案 3 :(得分:0)

我认为你最好的尝试就是尝试使用EnvInject插件以及最初的pre-scm步骤。

  1. 你像现在一样运行pre-scm。
  2. 您使用env注入来加载主作业构建步骤的文件
  3. 考虑加载文件的内容(属性格式)或执行一个脚本,该脚本将根据需要加载文件,并使用“为运行准备环境”为其余作业提供变量选项。

    我希望这会有所帮助。

答案 4 :(得分:0)

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

正如@jjungnickel建议您需要为Jenkins安装EnvInject Plugin。然后在构建部分&gt; 添加构建步骤您将获得“注入环境变量”选项。

基本上这个想法是:

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

    enter image description here

    由于我想在maven目标中使用它们,我需要检查Inject Build Variables复选框。

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

答案 5 :(得分: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类型有条件地触发“清除”或“清除验证”。

enter image description here