如何根据上一次测试结果停止GitHub Actions定时运行
GitHub Actions 定时任务按需启停方案
需求背景
现有一个执行sanity测试的GitHub Actions工作流,配置如下:
on: workflow_dispatch: schedule: - cron: '*/30 5-20 * * 1-5'
需要实现:
- 当测试步骤
steps.run_tests.outcome != 'success'时,禁用定时触发,仅允许手动触发运行 - 当手动触发运行测试成功时,恢复定时触发
之前的尝试(未成功)
曾尝试用锁文件存储运行状态,但因GitHub Actions环境临时,文件无法持久化,配置如下:
- name: Lock run if: always() && steps.run_tests.outcome != 'success' run: | echo "failure" > last_run_status.txt # Store failure status exit 0 - name: Unlock run if: always() && steps.run_tests.outcome == 'success' run: | echo "success" > last_run_status.txt # Store success status exit 0
可行实现方案
利用GitHub仓库的存储库变量持久化状态,结合定时任务的条件判断来实现启停:
1. 创建存储库变量
进入仓库Settings → Secrets and variables → Variables → New repository variable:
- 变量名:
SCHEDULE_ENABLED - 初始值:
true
2. 修改工作流触发条件
给定时任务添加条件判断,仅当变量为true时触发:
on: workflow_dispatch: schedule: - cron: '*/30 5-20 * * 1-5' if: vars.SCHEDULE_ENABLED == 'true'
3. 完整工作流配置
name: Sanity Tests on: workflow_dispatch: schedule: - cron: '*/30 5-20 * * 1-5' if: vars.SCHEDULE_ENABLED == 'true' jobs: run-tests: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 执行Sanity测试 id: run_tests run: | # 替换为你的实际测试命令 npm run sanity-test - name: 测试失败时禁用定时任务 if: always() && steps.run_tests.outcome != 'success' run: | gh variable set SCHEDULE_ENABLED --body "false" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 测试成功时启用定时任务 if: always() && steps.run_tests.outcome == 'success' run: | gh variable set SCHEDULE_ENABLED --body "true" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
关键说明
- 锁文件方案失效原因:GitHub Actions的运行环境是临时容器,生成的文件不会自动持久化到仓库,除非手动提交推送,这会产生冗余提交且无法在定时任务中读取到状态。
- 权限配置:确保仓库的Workflow权限设置为
Read and write permissions(路径:Settings→Actions→General→Workflow permissions),否则GITHUB_TOKEN无法修改存储库变量。 - 手动触发不受变量限制:无论
SCHEDULE_ENABLED状态如何,都可以通过workflow_dispatch手动运行,方便测试成功后恢复定时任务。
内容的提问来源于stack exchange,提问作者WKOW
相关产品推荐
相关产品推荐

