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

如何在GitHub Actions中实现成功工作流N小时后触发另一工作流?

在GitHub Actions中延迟触发工作流的实现方法

GitHub Actions本身没有内置的延迟触发功能,但可以通过两种变通方案实现“工作流A成功后N小时触发工作流B”的需求:

方案1:中间工作流+sleep命令(适用于N≤6小时)

GitHub Actions单作业最长运行时间为6小时,若延迟时间不超过6小时,可采用此简单方案:

  1. 工作流A成功后触发一个中间延迟工作流
  2. 中间工作流执行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小时,需用定时工作流定期检查触发条件:

  1. 工作流A成功后,将完成时间写入GitHub仓库变量
  2. 创建定时工作流,每隔一段时间检查当前时间是否超过A的完成时间+N小时
  3. 满足条件则触发工作流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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:05:01