GitHub Action监控页面变更:无法下载历史工件求助
解决GitHub Action无法获取历史工件的问题
首先明确:你提到的方案1(始终触发同一个工作流实例)无法实现,GitHub Action的每个触发事件(定时任务、push等)都会生成独立的工作流运行实例,不存在复用实例的机制,每个run都是完全独立的环境,所以这个思路直接放弃。
下面是方案2的具体实现步骤,以及更稳定的替代方案:
方案2:获取上一次成功运行的工件
步骤1:配置工作流权限
先给工作流的GITHUB_TOKEN添加读取工作流运行和工件的权限,在工作流顶部追加:
permissions: contents: read actions: read artifacts: read
步骤2:获取上一次成功运行的Run ID
用GitHub CLI获取最近一次成功运行的同工作流ID,添加步骤:
- name: Get last successful run ID id: get-run-id run: | RUN_ID=$(gh run list --workflow "job run" --limit 1 --status success --json id --jq '.[0].id') echo "run-id=$RUN_ID" >> $GITHUB_OUTPUT env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
注:第一次运行时该命令会返回空值,后续脚本需要处理这种无历史数据的场景,比如直接生成初始基准文件。
步骤3:下载对应Run的工件
修改actions/download-artifact步骤,指定run-id参数:
- name: Download last successful artifact if: steps.get-run-id.outputs.run-id != '' uses: actions/download-artifact@v3 with: name: archive run-id: ${{ steps.get-run-id.outputs.run-id }}
处理工作流失败的情况
如果需要兼容最近一次运行失败的场景,可以调整gh run list命令,列出多个历史run并过滤出第一个成功的:
RUN_ID=$(gh run list --workflow "job run" --limit 5 --status success --json id --jq '.[0].id')
只取成功run的工件,因为失败run生成的文件大概率不完整,没有对比价值。
替代方案:将历史数据提交到仓库
如果觉得依赖artifact不够稳定,也可以把历史CSV文件提交到仓库的专用分支(比如history-data),用Git存储历史数据:
步骤1:配置写入权限
在工作流顶部追加写入权限:
permissions: contents: write
步骤2:更新并提交历史数据
添加以下步骤替换原有的artifact下载/上传逻辑:
- name: Checkout or create history branch run: git checkout history-data || git checkout -b history-data - name: Copy history files (if exists) run: | if [ -f spider_old.csv ]; then cp spider_old.csv ./ fi if [ -f cats_old.txt ]; then cp cats_old.txt ./ fi - run: npm i - run: node monitor.js - name: Commit and push history data run: | git config --global user.name "GitHub Actions" git config --global user.email "actions@github.com" git add spider_old.csv cats_old.txt git commit -m "Update history data $(date +'%Y-%m-%d')" || echo "No changes to commit" git push origin history-data
这种方案无需依赖artifact,直接用Git仓库存储历史数据,既能稳定留存,也方便查看历史版本。
调整后的完整工作流示例(方案2)
name: job run run-name: Check page change and mail the result. on: push: schedule: - cron: '0 10 * * *' permissions: contents: read actions: read artifacts: read jobs: run: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: '16' - name: Get last successful run ID id: get-run-id run: | RUN_ID=$(gh run list --workflow "job run" --limit 1 --status success --json id --jq '.[0].id') echo "run-id=$RUN_ID" >> $GITHUB_OUTPUT env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Download last successful artifact if: steps.get-run-id.outputs.run-id != '' uses: actions/download-artifact@v3 with: name: archive run-id: ${{ steps.get-run-id.outputs.run-id }} - run: npm i - run: node monitor.js - uses: actions/upload-artifact@v3 with: name: archive path: | cats_old.txt spider_old.csv
内容的提问来源于stack exchange,提问作者kaikaiiiiiii
相关产品推荐
相关产品推荐

