Jenkins Pipeline执行Docker构建脚本遇权限及标签问题求助
先帮你拆解一下遇到的两个问题,然后逐个给出解决方案,顺便优化你的脚本逻辑:
1. 搞定docker_build.sh: Permission denied权限问题
你用git update-index --chmod=+x的思路是对的,但漏了关键一步:必须把权限变更提交并推送到远程仓库,不然Jenkins拉取代码时,还是会拿到没有执行权限的脚本。
如果不想修改仓库权限,更稳妥的方式是在Jenkins的Build阶段里,执行脚本前先主动给它加执行权限:
stage('Build') { steps { echo 'Building Image...' sh ''' chmod +x ./docker_build.sh COMMIT="$(git log --format="%H" -n 1)" TAG=${COMMIT:0:7} ./docker_build.sh $TAG ''' } }
这样不管仓库里的脚本权限如何,Jenkins执行前都会确保它能正常运行。
2. 解决0852ac1: does not exist标签不存在错误
这个错误看起来和你用commit hash前缀当TAG的操作无关,反而大概率是docker_build.sh里的未定义变量或错误逻辑导致的连锁问题。我梳理了脚本里的几个明显问题:
问题a:SEDFLAG变量未定义
脚本里用了sed $SEDFLAG但没给这个变量赋值,不同系统的sed语法有差异,会直接导致sed命令执行失败。你可以在脚本开头加上兼容逻辑:
# 定义sed的扩展正则参数,兼容Linux和macOS if [[ "$OSTYPE" == "darwin"* ]]; then SEDFLAG="-E" else SEDFLAG="-r" fi
问题b:VCS_URL提取逻辑完全错误
你当前的sed $SEDFLAG 's/[^0-9.]//g'会把所有非数字和点的字符都删掉,这根本不是提取VCS_URL的正确逻辑。如果你的Dockerfile里是ARG VCS_URL=https://github.com/your/repo.git,应该改成提取等号后面的完整URL:
VCS_URL=$(cat Dockerfile | grep "ARG VCS_URL" | sed $SEDFLAG 's/ARG VCS_URL=//g')
问题c:NAME变量未定义
脚本里直接用了${NAME}但没有赋值,你需要在脚本里提前定义镜像名称,比如:
NAME="your-project-image" # 替换成你的实际镜像名
或者从Jenkins那边传参进来,比如修改Jenkins的sh命令:
./docker_build.sh $TAG "your-project-image"
然后在docker_build.sh里接收第二个参数:
TAG=$1 NAME=$2
问题d:IMAGE_VERSION提取可以简化
你当前的引号去除写法可以简化成更简洁的字符串替换:
VERSION=$(awk '/version =/{print $3;exit;}' "build.gradle.kts") IMAGE_VERSION=${VERSION//\"/} # 直接去掉所有引号
优化后的完整docker_build.sh
#!/usr/bin/env bash # 处理sed跨系统兼容问题 if [[ "$OSTYPE" == "darwin"* ]]; then SEDFLAG="-E" else SEDFLAG="-r" fi # 接收外部传入的参数 TAG=$1 NAME="your-project-image" # 替换成你的实际镜像名 # 正确提取Dockerfile中的VCS_URL VCS_URL=$(cat Dockerfile | grep "ARG VCS_URL" | sed $SEDFLAG 's/ARG VCS_URL=//g') # 简化版本号提取逻辑 VERSION=$(awk '/version =/{print $3;exit;}' "build.gradle.kts") IMAGE_VERSION=${VERSION//\"/} echo "============================================================================================" echo " Building docker { NAME:${NAME}, IMAGE_VERSION:${IMAGE_VERSION}, TAG:${TAG} }" echo "============================================================================================" # 这里可以补充你的docker build命令,比如: # docker build --build-arg VCS_URL=${VCS_URL} -t ${NAME}:${IMAGE_VERSION}-${TAG} .
最后检查Jenkins的Git配置
如果还是遇到commit hash相关的问题,去Jenkins的Git插件配置里看看,确保没有开启浅克隆(Shallow clone),浅克隆可能导致git log无法正确获取完整的commit信息。
内容的提问来源于stack exchange,提问作者Migdotcom

