自托管GitHub Action Runner执行Zip命令无法匹配**/dist文件
解决GitHub Action/Yarn脚本中**通配符匹配失败的问题
问题场景
编译完成后尝试用**/dist通配符归档文件:
- 在自托管GitHub Action Runner的
_work目录下,直接通过shell执行ls -la **/dist能列出200多个文件,手动执行zip命令也正常 - 但在GitHub Action中执行zip命令时报错:
zip error: Nothing to do! (try: zip -qq -r archive.zip . -i **/dist)
- 在
package.json中添加脚本"archive": "pwd && ls -la **/dist && zip -r **/dist",执行yarn archive时复现同样问题:
yarn run v1.22.19 $ pwd && ls -la **/dist && zip -r **/dist /home/mathieu_auclair/actions-runner/_work/server/server ls: cannot access '**/dist': No such file or directory error Command failed with exit code 2. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
原因分析
**递归通配符属于bash的扩展glob特性(extglob),而:
- GitHub Action默认使用
sh作为执行shell,sh默认不支持**递归匹配 - Yarn/npm执行脚本时,默认也是用
sh而非bash,同样不支持该通配符
解决方案
1. 在GitHub Action中指定使用bash
在Action步骤里添加shell: bash,让命令在bash环境下执行,自动支持**通配符:
- name: Archive dist files shell: bash run: zip -qq -r archive.zip . -i **/dist
2. 修改Yarn脚本,显式用bash执行
在package.json的脚本中,用bash -c包裹命令,强制开启bash的扩展glob:
"scripts": { "archive": "bash -c 'pwd && ls -la **/dist && zip -r archive.zip **/dist'" }
3. 改用find命令替代通配符
如果不想依赖shell特性,可以用find命令定位所有dist目录,再传给zip:
find . -type d -name "dist" -exec zip -r archive.zip {} +
这条命令兼容性更强,可直接在Action或Yarn脚本中使用。
内容的提问来源于stack exchange,提问作者MathieuAuclair
相关产品推荐
相关产品推荐

