我在詹金斯有一个Maven工作 . 在实际构建步骤之前,我有一个“执行shell”预构建步骤 . 在那个shell中我设置了一个变量:
REVISION=$(cat .build_revision)
我想在“目标和选项”中的Maven构建作业中使用该变量:
clean install -Drevision=${REVISION}
但这不起作用! “Drevision”设置为“$ ”而不是$ 的实际值 . 输出:
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到"Inject environment variables",现在可以通过例如访问我的变量后构建shell,但在Maven "Goals and options"中仍然无法使用 .
然后可以使用EnvInject插件设置“向构建过程注入环境变量”,这实际上使这些变量在Maven“目标和选项”中可用,但这些变量在SCM结账后立即设置,即在预构建步骤之前,并且不支持表达式评估 .
5 回答
你在这里正确的轨道,但错过了EnvInject-Plugin的第三个功能:“注入环境变量”构建步骤,可以根据脚本或属性的结果将变量注入以下构建步骤 .
我们正在使用EnvInject插件;脚本设置资源并使用属性传递其参数,然后由插件作为环境变量传播 .
即为构建设置临时数据库:
我有一个非常类似的问题,试图计算构建版本并将其注入构建中 . 在遇到所有相同的问题(不扩展等)之后,我使用了“从脚本生成环境变量”选项,该选项将输出解释为标签=值对到Jenkins变量中 . 剧本 :
在此之后,我能够将$ VERSION_CODE注入maven,如下所示:
希望对你有用 .
此问题是由Jenkins Maven Project Plugin中的错误引起的,如2012-06-22中打开的this bug report中所述 . 从版本2.1开始,该插件尚未修复 .
已经为Maven项目插件提出了一个修复程序,但尚未集成 . 以下是拉取请求的链接:https://github.com/jenkinsci/maven-plugin/pull/14
如果您自己使用pull请求补丁构建插件,则会注入变量并使其可用于“目标和选项”字段 .
我认为你最好的尝试是尝试使用EnvInject插件以及你最初的pre-scm步骤 .
你像现在一样运行pre-scm .
您使用env注入来加载主作业构建步骤的文件
考虑加载文件的内容(属性格式)或执行一个脚本,该脚本将根据需要加载文件,并使用 "Prepare an environment for the run" 选项为其余作业提供变量 .
我希望这有帮助 .
我看到有一个公认的答案,但对于詹金斯的新手我发现很难把握住这一切 . 这就是为什么我会在这个答案中添加更多细节并展示我是如何做到的 .
正如@jjungnickel建议您需要为Jenkins安装EnvInject Plugin . 然后在 Build 部分> Add build step 中,您将获得选项"Inject environment variables" .
基本上这个想法是:
将以后要访问的变量添加到文件中(可能由shell脚本添加,也可能是文件系统中的文件) .
使用变量注入文件 .
使用变量 .
这里有一个示例设置:
由于我想在maven目标中使用它们,我需要检查Inject Build Variables复选框 .
然后在构建结束时我删除文件只是因为我想保持环境在构建之前 .