如何在gitlab-ci.yml中循环遍历目录?语法错误问题求助
GitLab CI中遍历目录的正确实现方法
你的目录结构为:
- /src
- /app1
- /app2
- /app3
你已经能通过以下代码获取文件夹列表:
script: - cd ${CI_PROJECT_DIR}/src/ - folders=($(ls -d */)) - echo ${folders[@]}
但原有的for循环写法会报错syntax error: unexpected end of file,原因是GitLab CI默认将每个-开头的行视为独立命令,循环的for、do、done分散在不同行时,bash无法识别完整的循环结构。
以下是几种可行的解决方法:
方法1:使用多行脚本块(推荐)
通过|符号将循环代码标记为一个完整的bash脚本块,保留换行和缩进:
script: - cd ${CI_PROJECT_DIR}/src/ - | for folder in */; do echo "${folder}" # 在此添加需要执行的脚本,例如: # cd "${folder}" && npm install && npm run build done
这种写法可读性强,适合复杂的循环逻辑。
方法2:将循环写成单行
用分号分隔循环的各个部分,作为单个命令执行:
script: - cd ${CI_PROJECT_DIR}/src/ - for folder in */; do echo "${folder}"; done
方法3:用bash -c包裹循环
将循环逻辑作为参数传递给bash执行:
script: - cd ${CI_PROJECT_DIR}/src/ - bash -c 'for folder in */; do echo "${folder}"; done'
额外优化:避免使用ls获取目录
直接用bash的glob匹配*/比ls -d */更安全,能处理包含空格的目录名,无需先将目录存入数组。
内容的提问来源于stack exchange,提问作者getunstuck
相关产品推荐
相关产品推荐

