如何在GitHub Actions中检出变更YAML文件并保存为数组
解决GitHub Actions动态处理变更YAML文件并上传的方案
1. 动态获取变更的YAML文件列表
不用第三方工具,直接用actions/checkout拉取仓库后,通过git命令筛选出最近推送里变更的YAML文件,把结果存为步骤输出变量:
- name: Checkout repo uses: actions/checkout@v4 with: fetch-depth: 2 # 必须拉取前一次提交才能对比变更 - name: Extract changed YAML files id: get-yamls run: | # 对比当前提交与上一次提交,过滤出.yml/.yaml文件 CHANGED=$(git diff --name-only HEAD^ HEAD | grep -E '\.(yml|yaml)$') # 将结果写入步骤输出,空值也会正确传递 echo "changed_files<<EOF" >> $GITHUB_OUTPUT echo "$CHANGED" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT
2. 循环上传每个变更文件
基于上面的输出,用bash数组处理文件列表,逐个调用curl上传:
- name: Upload YAML files to target site if: steps.get-yamls.outputs.changed_files != '' run: | # 把换行分隔的文件列表转为bash数组,兼容带空格的文件名 IFS=$'\n' read -r -d '' -a yaml_list <<< "${{ steps.get-yamls.outputs.changed_files }}" # 遍历数组上传每个文件 for file in "${yaml_list[@]}"; do echo "Uploading $file..." curl -X POST \ -H "Content-Type: application/yaml" \ --data-binary "@$file" \ "https://your-upload-endpoint.com" # 替换成你的目标站点地址 done
核心优势
- 完全动态获取文件列表,不需要硬编码任何路径
- 用GitHub Actions原生的步骤输出传递数据,避免第三方工具的限制
- bash数组处理确保文件名含空格时也能正常工作
- 加了条件判断,没有变更文件时跳过上传步骤,节省资源
内容的提问来源于stack exchange,提问作者CB_at_Sw
相关产品推荐
相关产品推荐

