You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action动态生成含GITHUB_SHA的tar文件名报错解决

问题:GitHub Actions中使用Commit SHA动态命名tar包失败

在GitHub Actions部署Workflow中,尝试将制品打包为tar文件并使用github.sha作为文件名,编写了以下步骤:

- name: Create deployment artificact with ${{ github.sha }} as Commit-Hash
  env:
    GITHUB_SHA: ${{ github.sha }}
  run: tar vcfz "${ GITHUB_SHA }".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *

使用静态名称(如app.tar.gz)时能正常运行,但动态命名报错,错误信息如下:

0s
Run tar vcfz "${ GITHUB_SHA }".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *
  tar vcfz "${ GITHUB_SHA }".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *
  shell: /usr/bin/bash -e {0}
  env:
    GITHUB_SHA: 134e1d9adb515cfe908866092a37aa0880ada128
/home/runner/work/_temp/32bf4668-1034-4849-9eab-b789d201b43f.sh: line 1: ${ GITHUB_SHA }: bad substitution
Error: Process completed with exit code 1.

解决方案

错误原因

报错bad substitution是因为Bash变量引用时,${ GITHUB_SHA }里的变量名和大括号之间多了空格,Bash无法识别这个变量格式。

修改方式1:修正变量引用格式并简化步骤

去掉变量名前后的空格,同时无需手动定义env(GitHub Actions会自动注入GITHUB_SHA环境变量):

- name: Create deployment artifact with commit SHA as filename
  run: tar vcfz "${GITHUB_SHA}".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *

修改方式2:直接使用GitHub表达式拼接文件名

跳过环境变量,直接在run命令里用${{ github.sha }}生成文件名:

- name: Create deployment artifact with commit SHA as filename
  run: tar vcfz "${{ github.sha }}".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *

额外优化建议

  • 建议调整tar参数顺序为tar czfv(f参数紧跟文件名是更标准的写法,避免部分环境下的参数解析问题):
run: tar czfv "${GITHUB_SHA}".tar.gz --exclude=*.git --exclude=node_modules --exclude=tests *
  • 避免用*通配所有文件,可明确指定要打包的目录/文件,减少不必要的内容被打包。

内容的提问来源于stack exchange,提问作者MartinTTS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:50:17