Jenkins拉取Git代码新增DOS换行符导致Shell脚本报bad interpreter错误
问题根因
你之前在本地调整文件格式的操作无效,核心原因是问题出在Jenkins节点的Git客户端行尾转换逻辑:当Jenkins节点(多为Windows系统)的Git配置开启了自动行尾转换时,即使GitHub上的文件是LF格式,拉取到本地工作区时Git会自动将LF转换为CRLF,和源文件本身的格式无关。
解决方案
方案1:调整Jenkins节点的Git全局配置
- 登录到Jenkins执行拉取代码的节点(主节点就登录主节点,agent节点就登录对应agent)
- 执行命令关闭自动换行转换:
git config --global core.autocrlf false - 可选执行配置强制统一行尾格式:
git config --global core.eol lf - 配置完成后删除Jenkins任务的旧工作区,重新触发构建验证即可。
方案2:仓库内添加.gitattributes规则(优先级最高、跨环境生效,更推荐)
该方案不需要修改Jenkins节点配置,只要在代码仓库根目录添加.gitattributes文件,规则会覆盖所有环境的Git本地配置,从根源避免不同节点行尾配置不一致的问题:
- 在你的代码仓库根目录新建
.gitattributes文件,写入以下内容:
# 所有Shell脚本强制使用LF行尾,签入签出都不做转换 *.sh text eol=lf # yml配置类文件也可指定统一使用LF *.yml text eol=lf # 二进制文件不做任何转换 *.zip binary *.png binary
- 将该文件提交推送到GitHub,后续Jenkins再拉取代码时,会按照规则保留Shell脚本的LF换行,不会自动转成CRLF。
方案3:Jenkins构建步骤增加兜底转换逻辑
如果前两个方案因权限等问题无法实施,可以在Jenkins任务的构建步骤最前面(拉取代码之后、打包上传S3之前)增加批量转换命令:
- 若Jenkins节点安装了dos2unix工具,添加命令:
find . -name "*.sh" -exec dos2unix {} \; - 若未安装dos2unix,可使用sed实现转换:
find . -name "*.sh" -exec sed -i 's/\r$//' {} \;
内容的提问来源于stack exchange,提问作者Subbu
相关产品推荐
相关产品推荐

