GitLab CI执行失败:hw_03目录run.sh文件未找到求助
GitLab CI流水线执行失败:hw_03目录中找不到run.sh文件
仓库结构
/ ...仓库根目录 |- hw_01/ ...第一份作业 |- hw_02/ ...第二份作业 ... |- Makefile ...全局Makefile
每个hw_*子目录下包含main.c、Makefile和run.sh脚本。
流水线执行流程
- GitLab CI执行根目录的全局Makefile
- 全局Makefile遍历所有
hw_*子目录,执行目录内的本地Makefile - 本地Makefile先编译
main.c生成二进制文件,再执行run.sh完成测试
问题现象
hw_01、hw_02的构建与测试流程正常执行,但进入hw_03目录时,流水线报错:
./run.sh - no such file or directory
已确认本地仓库中hw_03目录下确实存在run.sh,且已做以下排查:
- 合并了CI的“构建”与“测试”阶段,排除阶段间自动清理文件的可能
- 将
run.sh内容简化为仅echo "Hi, im here",确认报错是文件找不到而非脚本内部逻辑问题
相关文件内容
全局Makefile
SUBDIRS := $(wildcard hw_*) all: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ clean: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir clean; \ done .PHONY: all clean $(SUBDIRS)
本地Makefile(hw_*目录内)
CC = gcc CFLAGS = -Wall -Wextra -std=c99 all: main main: main.c $(CC) $(CFLAGS) -o main main.c test: main ./run.sh clean: rm -f main .PHONY: all test clean
完整CI流水线输出片段
$ make make[1]: Entering directory '/builds/honza/uni-hw/hw_01' gcc -Wall -Wextra -std=c99 -o main main.c ./run.sh Hi, im here make[1]: Leaving directory '/builds/honza/uni-hw/hw_01' make[1]: Entering directory '/builds/honza/uni-hw/hw_02' gcc -Wall -Wextra -std=c99 -o main main.c ./run.sh Hi, im here make[1]: Leaving directory '/builds/honza/uni-hw/hw_02' make[1]: Entering directory '/builds/honza/uni-hw/hw_03' gcc -Wall -Wextra -std=c99 -o main main.c ./run.sh: No such file or directory make[1]: *** [Makefile:8: test] Error 127 make[1]: Leaving directory '/builds/honza/uni-hw/hw_03' make: *** [Makefile:5: hw_03] Error 2
可能的原因与解决方案
1. 文件换行符不兼容
如果run.sh在Windows系统下创建,换行符为CRLF,而GitLab CI运行环境是Linux,会将CR字符识别为路径的一部分,导致找不到文件。
- 解决:将
run.sh换行符转为LF,本地执行:
同时配置Git自动转换:sed -i 's/\r$//' hw_03/run.shgit config core.autocrlf input
2. 文件缺少可执行权限
GitLab CI拉取代码后,run.sh可能无执行权限,Linux下无权限的脚本直接运行会触发“找不到文件”的类似报错。
- 解决:
- 本地添加权限并提交:
chmod +x hw_03/run.sh git add hw_03/run.sh git commit -m "Add execute permission to hw_03/run.sh" - 或在全局Makefile中提前设置权限:
$(SUBDIRS):
$(MAKE) -C $@ - 本地添加权限并提交:
3. Git忽略规则问题
检查.gitignore文件,确认是否误将run.sh加入忽略列表,导致CI拉取代码时未同步该文件。
- 解决:删除
.gitignore中run.sh相关条目并提交变更。
4. 目录名称大小写不匹配
Git默认大小写不敏感,但Linux环境(CI运行环境)大小写敏感,若本地目录名称与GitLab仓库中不一致(如HW_03 vs hw_03),会导致路径匹配错误。
- 解决:统一本地与GitLab仓库的目录名称大小写,提交修正后的变更。
内容的提问来源于stack exchange,提问作者Honza
相关产品推荐
相关产品推荐

