如何在GitHub Actions中实现成功工作流N小时后触发另一工作流?
在GitHub Actions中延迟触发工作流的实现方法
GitHub Actions本身没有内置的延迟触发功能,但可以通过两种变通方案实现“工作流A成功后N小时触发工作流B”的需求:
方案1:中间工作流+sleep命令(适用于N≤6小时)
GitHub Actions单作业最长运行时间为6小时,若延迟时间不超过6小时,可采用此简单方案:
- 工作流A成功后触发一个中间延迟工作流
- 中间工作流执行
sleep命令等待N小时,再触发工作流B
工作流A配置示例(触发中间工作流)
name: Workflow A on: [push] jobs: build: runs-on: ubuntu-latest steps: - name: 执行工作流A任务 run: echo "完成工作流A核心任务" - name: 触发延迟中间工作流 if: success() uses: actions/github-script@v6 with: script: | await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'delay-workflow.yml', ref: context.ref, inputs: { delay_hours: '2' # 此处设置需要延迟的小时数 } })
中间延迟工作流配置示例(delay-workflow.yml)
name: Delay Workflow on: workflow_dispatch: inputs: delay_hours: description: '延迟小时数' required: true type: number jobs: delay-and-trigger: runs-on: ubuntu-latest steps: - name: 等待指定时长 run: sleep ${{ inputs.delay_hours * 3600 }}s - name: 触发工作流B uses: actions/github-script@v6 with: script: | await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'workflow-b.yml', ref: context.ref })
方案2:定时检查+GitHub变量(适用于N>6小时)
若延迟时间超过6小时,需用定时工作流定期检查触发条件:
- 工作流A成功后,将完成时间写入GitHub仓库变量
- 创建定时工作流,每隔一段时间检查当前时间是否超过A的完成时间+N小时
- 满足条件则触发工作流B,并标记已触发避免重复执行
工作流A配置示例(记录完成时间)
name: Workflow A on: [push] jobs: build: runs-on: ubuntu-latest steps: - name: 执行工作流A任务 run: echo "完成工作流A核心任务" - name: 记录完成时间到仓库变量 if: success() uses: actions/github-script@v6 with: script: | const completionTime = new Date().toISOString(); // 记录工作流A完成时间 await github.rest.repos.createOrUpdateEnvironmentVariable({ owner: context.repo.owner, repo: context.repo.repo, environment: 'default', name: 'WORKFLOW_A_COMPLETION_TIME', value: completionTime }); // 重置工作流B触发标记 await github.rest.repos.createOrUpdateEnvironmentVariable({ owner: context.repo.owner, repo: context.repo.repo, environment: 'default', name: 'WORKFLOW_B_TRIGGERED', value: 'false' });
定时检查工作流配置示例
name: Check and Trigger Workflow B on: schedule: - cron: '0 * * * *' # 每小时检查一次,可按需调整频率 jobs: check-trigger: runs-on: ubuntu-latest steps: - name: 获取仓库变量 uses: actions/github-script@v6 id: get-vars with: script: | const vars = await github.rest.repos.getEnvironmentVariables({ owner: context.repo.owner, repo: context.repo.repo, environment: 'default' }); const completionTime = vars.data.vars.find(v => v.name === 'WORKFLOW_A_COMPLETION_TIME')?.value; const triggered = vars.data.vars.find(v => v.name === 'WORKFLOW_B_TRIGGERED')?.value === 'true'; return { completionTime, triggered }; - name: 判断触发条件 if: steps.get-vars.outputs.completionTime != '' && steps.get-vars.outputs.triggered == 'false' run: | COMPLETION_TIME="${{ steps.get-vars.outputs.completionTime }}" DELAY_HOURS=8 # 设置需要延迟的小时数 TRIGGER_TIME=$(date -d "$COMPLETION_TIME + $DELAY_HOURS hours" +%s) CURRENT_TIME=$(date +%s) if [ $CURRENT_TIME -ge $TRIGGER_TIME ]; then echo "触发条件满足" echo "TRIGGER_B=true" >> $GITHUB_ENV else echo "未到达触发时间" fi - name: 触发工作流B并标记状态 if: env.TRIGGER_B == 'true' uses: actions/github-script@v6 with: script: | // 触发工作流B await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'workflow-b.yml', ref: context.ref }); // 更新标记为已触发 await github.rest.repos.createOrUpdateEnvironmentVariable({ owner: context.repo.owner, repo: context.repo.repo, environment: 'default', name: 'WORKFLOW_B_TRIGGERED', value: 'true' });
注意事项
- 确保
GITHUB_TOKEN拥有workflow权限,若权限不足可使用个人访问令牌(PAT)并赋予repo和workflow权限 - 定时工作流的cron表达式可按需调整检查频率,比如每15分钟检查一次:
*/15 * * * * - 若需多次触发工作流B,需在合适时机重置
WORKFLOW_B_TRIGGERED变量
内容的提问来源于stack exchange,提问作者Mocanu Gabriel
相关产品推荐
相关产品推荐

