我想通过 gitlab CI 构建 docker 镜像,并以项目版本作为标签:
docker build -t dockerimage:VERSION-IN-POM .
在詹金斯的管道中,我得到了这样的版本:
${pom.version}
是否可以以类似、方便的方式从 gitlab CI 读取版本?或者我必须为此编写脚本吗?
假设你的构建环境中有maven,你可以使用maven帮助插件和grep来提取版本。
VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -v '\[.*')
echo $VERSION
这适用于我的变量:
gitlab-ci.yml
mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q
Gitlab-CI 并没有提供这样的便利,相反,它让你可以使用 shell 脚本做任何你想做的事情。在命令脚本中做到这一点并不难。您可以安装xmllint(在Ubuntu上为
apt install libxml2-utils
),然后您可以通过简单查询来获取它:
xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml
所以这一切都可以通过这两行来解决:
- apt install libxml2-utils
- docker build -t dockerimage:$(xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml) .
另一种maven命令行替代方案,直接获取版本信息
mvn --non-recursive help:evaluate -Dexpression=project.version -q -DforceStdout
您可以使用 sed 或 grep。
比使用
mvn --non-recursive help:evaluate ...
更快
获取artifactID
grep -m1 '<artifactId>' pom.xml | grep -oP '(?<=>).*(?=<)'
获取版本
grep -m1 '<version>' pom.xml | grep -oP '(?<=>).*(?=<)'
如果你使用的是 docker,有些镜像没有最新版本的 grep,所以你需要使用带有 cut 的创造性解决方案,例如:
grep -m1 '<artifactId>' pom.xml |cut -d '<' -f2 |cut -d '>' -f2
您可以在您的
.gitlab-ci.yml
文件中使用以下命令:
VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version -q -DforceStdout)
echo $VERSION
此外,您可以通过将
groupId
更改为 artifactId
和 Dexpression=project.version
来获得
Dexpression=project.artifactId
和
Dexpression=project.groupId
有关更多信息,请参阅 maven 文档以获取帮助:evaluate。
正如 Ivan 在他的 post 中所指出的,这在我的脚本中有效:
-RELEASE_VERSION=
xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml
-回显$RELEASE_VERSION
如果你知道项目名称,这里是另一种使用 shell 的方法;就是从./target目录下创建的目标.jar文件中剪切版本。
注意:这仅在成功构建命令后才有效:
cd target
version=`ls <PROJECT_NAME>*.jar`
version=${version#<PROJECT_NAME>}
version=${version%.jar}
cd ..
echo $version
我最终使用了
vars:
stage: prepare
script:
- echo "POM_VERSION=$(mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q)" > vars.env
- echo "POM_NAME=$(mvn -Dexec.executable='echo' -Dexec.args='${project.name}' --non-recursive exec:exec -q)" >> vars.env
- echo "POM_GROUP_ID=$(mvn -Dexec.executable='echo' -Dexec.args='${project.groupId}' --non-recursive exec:exec -q)" >> vars.env
- echo "POM_ARTIFACT_ID=$(mvn -Dexec.executable='echo' -Dexec.args='${project.artifactId}' --non-recursive exec:exec -q)" >> vars.env
artifacts:
reports:
dotenv: vars.env
这是一个带有 Maven 帮助的解决方案:评估,但使用正则表达式(请参阅命令中的“-E”):
export VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -E '^[0-9]+.[0-9]+.[0-9]+(-[A-Z]+)?$')
echo $VERSION
它将能够在 Maven 命令的输出中找到例如 5.0.1-SNAPHOT 或仅找到 5.0.1 或再次找到 5.0.1-GA。
在这种真实的 Maven 输出上进行了测试:
Downloaded from fodfin: http://your.server/artifactory/com/thoughtworks/xstream/xstream/1.4.11.1/xstream-1.4.11.1.jar (621 kB at 369 kB/s)
[INFO] No artifact parameter specified, using 'be.test.super.package:the-application:pom:5.0.1-SNAPSHOT' as project.
[INFO]
5.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.127 s
[INFO] Finished at: 2022-10-06T14:40:29+02:00
[INFO] ------------------------------------------------------------------------
jobname:
stage: stage
before_script:
- export "MAVEN_ID=$(mvn help:evaluate -Dexpression=project.id -q -DforceStdout)"
- >
IFS=: read -r MAVEN_GROUPID MAVEN_ARTIFACTID MAVEN_PACKAGING MAVEN_VERSION <<< ${MAVEN_ID}
script:
- >
echo -e "groupId: ${MAVEN_GROUPID}\nartifactId: ${MAVEN_ARTIFACTID}\nversion: ${MAVEN_VERSION}\npackaging: ${MAVEN_PACKAGING}"
mvn help:evaluate -Dexpression=project.id -q -DforceStdout
以以下格式打印工件识别信息:com.group.id:artifactid:packaging:version
MAVEN_ID
变量使用IFS
进行解析,以冒号(:
)为分隔符,得到常见的maven变量,如artifactId、groupId、版本和打包(解释)无需假设任何内容,并使用版本来构建可重复性,以及额外的缓存 maven:
build:
stage: build
cache:
key: maven
paths:
- .m2/repository
script:
# Extract Maven version
- export MAVEN_VERSION=$(docker run --rm -v $CI_PROJECT_DIR:/app -w /app maven:3.8.4-openjdk-11-slim mvn org.apache.maven.plugins:maven-help-plugin:3.1.1:evaluate -Dexpression=project.version -q -DforceStdout)