Jenkins "Invoke Maven 3" 构建步骤不公开 POM_* 变量

Jenkins "Invoke Maven 3" build step does not expose POM_* variables

我使用 Jenkins 作为我的 CI 服务器,使用 Artifactory 作为我的工件存储库。 Artifactory 插件适用于自由风格的项目,只需使用 Invoke Maven3 构建步骤即可获取依赖项并部署工件。此外,我还有另一个构建步骤,用于构建 docker 图像并使用 CloudBees Docker 构建和发布插件将其推送到我的私有 docker 注册表。

问题是我想在 CloudBees 配置中使用 POM_* 变量,如前所述 here,这些变量应该由 Maven 插件公开。但是每次构建项目时,都会出现以下错误:

    ERROR: Unrecognized macro 'POM_VERSION' in '${POM_VERSION}'
org.jenkinsci.plugins.tokenmacro.MacroEvaluationException: Unrecognized macro 'POM_VERSION' in '${POM_VERSION}'
    at org.jenkinsci.plugins.tokenmacro.TokenMacro.expand(TokenMacro.java:198)
    at org.jenkinsci.plugins.tokenmacro.TokenMacro.expandAll(TokenMacro.java:233)
    at org.jenkinsci.plugins.tokenmacro.TokenMacro.expandAll(TokenMacro.java:222)
    at com.cloudbees.dockerpublish.DockerBuilder$Perform.expandAll(DockerBuilder.java:266)
    at com.cloudbees.dockerpublish.DockerBuilder$Perform.getNameAndTag(DockerBuilder.java:277)
    at com.cloudbees.dockerpublish.DockerBuilder$Perform.exec(DockerBuilder.java:247)
    at com.cloudbees.dockerpublish.DockerBuilder$Perform.access0(DockerBuilder.java:233)
    at com.cloudbees.dockerpublish.DockerBuilder.perform(DockerBuilder.java:208)
    at hudson.tasks.BuildStepMonitor.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
    at hudson.model.Build$BuildExecution.build(Build.java:205)
    at hudson.model.Build$BuildExecution.doRun(Build.java:162)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:537)
    at hudson.model.Run.execute(Run.java:1744)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:98)
    at hudson.model.Executor.run(Executor.java:374)
Build step 'Docker Build and Publish' marked build as failure

我不知道这个问题到底是什么原因。也许 Invoke Maven3 构建步骤通过不公开 env 变量导致此问题。另一个来源可能是不使用环境变量的 CloudBees 插件。有什么想法吗?

您在自由式项目中提到的构建步骤不是 Maven 插件的一部分。所描述的环境变量仅为本机 Maven 项目设置。从另一个项目类型来看,我想你需要做一些类似

的事情
POM_VERSION=$(mvn help:evaluate -Dexpression=project.version | fgrep -v '[INFO]')

在继续使用该变量的脚本的开头。

将变量公开给后续的非shell 构建步骤,例如从 CloudBees Docker 构建和发布插件,是另一回事;可能有一些插件可以做到这一点,但我不确定是什么。 (也许是 EnvInject。)切换到工作流作业可能更简单,使用 CloudBees Docker Workflow plugin 驱动 Docker 操作(取决于您从 Artifactory 插件中使用的具体内容):

node { stage 'build' git '…' sh 'mvn package' stage 'package' sh 'mvn help:evaluate -Dexpression=project.version | fgrep -v '[INFO]' > .version' def version = readFile '.version' def image = docker.build("my-image:${version}") stage 'publish' docker.withRegistry(…) { image.push() } }

顺便说一下,您可以添加一个 shell 构建步骤 运行

env | sort

如果您想知道有哪些环境变量可用。

基于@Jesse Glick 的回答,四处搜索并与 jenkins 苦苦挣扎,我最终得到了以下非常有效的解决方案。

1-添加包含以下命令的 "Execute Shell" 构建步骤:

echo POM_VERSION=$(mvn help:evaluate -Dexpression=project.version | fgrep -v '[INFO]') > pom_file
echo POM_ARTIFACTID=$(mvn help:evaluate -Dexpression=project.groupId | fgrep -v '[INFO]') >> pom_file
echo POM_GROUPID=$(mvn help:evaluate -Dexpression=project.artifactId | fgrep -v '[INFO]') >> pom_file

2-添加 "Inject environment variables" 构建步骤(来自 EnvInject 插件)并输入 "pom_file" 作为 "Properties File Path"

3-添加 "Docker Build and Publish" 构建步骤并根据需要在其配置中使用 POM_VERSION、POM_ARTIFACTID、POM_GROUPID。