如何在CodeBuild中用短commit SHA标记镜像及报错排查
报错原因
AWS CodeBuild 默认使用 /bin/sh(POSIX 标准 shell)执行 buildspec 中定义的命令,你使用的 ${VAR:0:8} 字符串截取语法是 Bash 独有的参数扩展特性,不属于 POSIX shell 标准语法,因此执行时会触发 Bad substitution 报错。
可行解决方法
你可以任选以下一种方案实现需求,优先推荐第一种,兼容性最好:
方案1:使用 POSIX 兼容的字符串截取语法,无需修改构建环境配置
把原有的 COMMIT_ID 赋值命令替换为cut命令实现前8位截取,所有标准shell都支持该写法:- COMMIT_ID=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-8)该写法完全不依赖特定shell,在CodeBuild默认的sh环境下可以直接运行,稳定性最高。注意不推荐直接使用
git rev-parse --short HEAD获取短SHA,部分CodeBuild运行环境的源码是通过压缩包方式拉取、而非完整git克隆,会导致git命令执行失败,使用内置环境变量CODEBUILD_RESOLVED_SOURCE_VERSION截取是最可靠的方案。方案2:显式指定CodeBuild使用Bash执行命令
如果你习惯使用Bash的参数扩展语法,可以在buildspec顶层配置指定shell为bash,原有截取写法不需要修改即可正常运行:version: 0.2 env: shell: bash phases: pre_build: commands: ... # 原有bash语法的截取命令可以正常使用 - COMMIT_ID=${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8} ... # 其余build、post_build阶段配置和你原有写法完全一致
修改后可直接运行的参考配置(采用兼容性最好的cut方案)
version: 0.2 phases: pre_build: commands: ... - COMMIT_ID=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-8) ... build: commands: ... - echo Tagging image with commit id $COMMIT_ID - docker tag $REPOSITORY_URI/$IMAGE_REPO_NAME:latest $REPOSITORY_URI/$IMAGE_REPO_NAME:$COMMIT_ID ... post_build: commands: ... - docker push $REPOSITORY_URI/$IMAGE_REPO_NAME:$COMMIT_ID
内容的提问来源于stack exchange,提问作者Matias Lopez
相关产品推荐
相关产品推荐

