如何使用正则表达式将指定Maven构建产物复制到Dockerfile目录?
问题:使用正则匹配复制Maven主JAR包并在未找到时抛出错误
我正在构建Maven项目,构建后target目录结构如下:
target |____ my-application-1.0.0-SNAPSHOT.jar |____ my-application-1.0.0-SNAPSHOT-javadoc.jar |____ my-application-1.0.0-SNAPSHOT-sources.jar |____ my-application-1.0.0-SNAPSHOT.jar.original
我需要将应用容器化,在Jenkinsfile中仅把主JAR包(my-application-1.0.0-SNAPSHOT.jar)复制到Dockerfile所在目录。已编写匹配主JAR的正则表达式,但cp命令不支持正则匹配。
尝试过用find命令实现复制,但它在未找到文件时不会抛出错误,而我需要这种场景下能主动报错的方案。
现有Jenkinsfile代码:
def versionRegex = "[0-9]{2}\\.[0-9]{1,2}\\.[0-9]+(-(a[0-9]+-[0-9]{2}|SNAPSHOT|m[0-9]{2}|rc[0-9]{2}|[A-Z]+[a-zA-Z]*))?" sh """ find ./path/to/target -type f -regextype posix-egrep \ -regex './path/to/target/my-application-${versionRegex}\.jar' \ -exec cp {} ./path/to/dockerfile \; """
解决方案
方案1:统计匹配文件数,无匹配则报错
通过将find结果存入数组,检查数组长度判断是否找到文件,同时处理多匹配的异常情况:
def versionRegex = "[0-9]{2}\\.[0-9]{1,2}\\.[0-9]+(-(a[0-9]+-[0-9]{2}|SNAPSHOT|m[0-9]{2}|rc[0-9]{2}|[A-Z]+[a-zA-Z]*))?" sh """ # 将匹配结果存入数组 MATCHED_FILES=(\$(find ./path/to/target -type f -regextype posix-egrep \ -regex './path/to/target/my-application-${versionRegex}\\.jar')) # 检查是否找到文件 if [ \${#MATCHED_FILES[@]} -eq 0 ]; then echo "错误:未找到匹配的主JAR包" >&2 exit 1 fi # 检查是否存在多个匹配文件(Maven构建通常仅一个主JAR) if [ \${#MATCHED_FILES[@]} -gt 1 ]; then echo "错误:找到多个匹配的JAR包:\${MATCHED_FILES[*]}" >&2 exit 1 fi # 复制文件到目标目录 cp "\${MATCHED_FILES[0]}" ./path/to/dockerfile """
这个方案逻辑清晰,能精准处理未找到文件、多文件匹配两种异常场景,符合Jenkins流水线的错误捕获需求。
方案2:用glob匹配简化操作(版本规则适配时)
如果版本号格式可以通过shell glob表达式描述,可直接用cp配合条件判断,避免正则的复杂处理:
# 注意:需将原versionRegex转换为对应的glob格式,示例针对SNAPSHOT版本 def versionGlob = "[0-9][0-9].[0-9]*.[0-9]*-SNAPSHOT" sh """ JAR_PATH="./path/to/target/my-application-${versionGlob}.jar" if [ ! -f "\$JAR_PATH" ]; then echo "错误:未找到主JAR包 \$JAR_PATH" >&2 exit 1 fi cp "\$JAR_PATH" ./path/to/dockerfile """
此方案更简洁,但仅适用于版本规则能用glob覆盖的场景。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

