带正则的grep命令在GitLab CI中运行失效该如何解决
问题根因
你遇到的执行失败问题根因为本地环境与GitLab CI运行环境的时区配置不一致:date +"%d-%b-%Y"命令生成的日期会遵循系统当前时区,CI环境默认时区通常为UTC,和你本地时区不符,导致生成的日期值和Artifactory中存储的构建产物日期不匹配,后续grep命令无法命中结果执行失败。
解决方案
你可以任选以下任意一种方案修复:
方案1:在date命令中强制指定时区(兼容性最好,无需修改CI环境配置)
直接修改pre_build.sh中的日期生成逻辑,指定你需要的时区即可,示例如下(以东八区/上海时区为例):# 强制指定时区生成日期,不受运行环境默认时区影响 todays_date=$(TZ=Asia/Shanghai date +"%d-%b-%Y")如果你需要使用UTC时区,将
Asia/Shanghai替换为UTC即可。方案2:统一GitLab CI运行环境的时区
如果你希望CI环境整体时区和本地保持一致,可以在CI脚本执行前先配置时区:- 如果你使用Debian/Ubuntu系的CI运行镜像:
# 仅需在pre_build.sh开头添加以下配置即可 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "Asia/Shanghai" > /etc/timezone- 如果你使用Alpine系的CI运行镜像:
# Alpine镜像默认不带tzdata,需要先安装再配置时区 apk add --no-cache tzdata ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "Asia/Shanghai" > /etc/timezone
可选优化(针对grep兼容性)
部分CI环境使用BusyBox自带的精简版grep,和GNU grep的参数组合存在细微差异,如果你后续遇到grep相关报错,可以将参数拆分写法,同时给变量加双引号避免解析异常:
latest=$(curl -i ${artifactory_url} | grep develop | grep -i "${todays_date}" | grep "${last_ok_build_number}" | grep -o -i -E '<a [^>]+>' | grep -o -E 'href="[^"]+"')
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

