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

手动触发GitHub Actions的soaking.yml前,如何管理build.yml工作流状态?

解决方案:手动触发浸泡测试工作流时处理前置构建任务状态

要实现手动触发soaking.yml时自动处理build.yml的三种状态(等待运行中、直接继续、触发并等待),可以通过GitHub CLI(gh)结合GitHub API在工作流内完成状态检查与控制,无需依赖workflow_run自动触发。

完整实现示例(soaking.yml)

name: Soaking Test
on:
  workflow_dispatch:

jobs:
  soaking-test:
    runs-on: self-hosted
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Check build workflow status
        id: check-build
        run: |
          # 获取当前commit对应的build.yml最新运行记录
          RUNS=$(gh api repos/${{ github.repository }}/actions/workflows/build.yml/runs \
            -f head_sha=${{ github.sha }} \
            -f status=all \
            -q '.workflow_runs | sort_by(.created_at) | reverse | .[0]')
          
          # 处理无运行记录的情况
          if [ -z "$RUNS" ] || [ "$RUNS" = "null" ]; then
            echo "status=null" >> $GITHUB_OUTPUT
            echo "conclusion=null" >> $GITHUB_OUTPUT
            echo "run_id=null" >> $GITHUB_OUTPUT
            exit 0
          fi
          
          # 提取运行状态、结论和ID
          RUN_STATUS=$(echo "$RUNS" | jq -r '.status')
          RUN_CONCLUSION=$(echo "$RUNS" | jq -r '.conclusion')
          RUN_ID=$(echo "$RUNS" | jq -r '.id')
          
          echo "status=$RUN_STATUS" >> $GITHUB_OUTPUT
          echo "conclusion=$RUN_CONCLUSION" >> $GITHUB_OUTPUT
          echo "run_id=$RUN_ID" >> $GITHUB_OUTPUT
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Trigger build workflow
        id: trigger-build
        if: steps.check-build.outputs.status == 'null'
        run: |
          # 触发当前commit的build.yml工作流
          RUN_ID=$(gh workflow run build.yml -f ref=${{ github.sha }} --json id -q '.id')
          echo "run_id=$RUN_ID" >> $GITHUB_OUTPUT
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Wait for build workflow completion
        if: steps.check-build.outputs.status == 'in_progress' || steps.trigger-build.outputs.run_id != 'null'
        run: |
          # 确定要等待的运行ID
          TARGET_RUN_ID=${{ steps.check-build.outputs.run_id || steps.trigger-build.outputs.run_id }}
          # 等待运行完成,若运行失败则终止工作流
          gh run watch "$TARGET_RUN_ID" --exit-status
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Verify build success
        run: |
          # 获取build工作流的最终结论
          TARGET_RUN_ID=${{ steps.check-build.outputs.run_id || steps.trigger-build.outputs.run_id }}
          RUN_CONCLUSION=$(gh api repos/${{ github.repository }}/actions/runs/$TARGET_RUN_ID --json conclusion -q '.conclusion')
          
          if [ "$RUN_CONCLUSION" != "success" ]; then
            echo "错误:build工作流执行状态为'$RUN_CONCLUSION',预期为'success'"
            exit 1
          fi
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Download artifact
        id: download-artifact
        uses: dawidd6/action-download-artifact@v2
        with:
          commit: ${{ github.sha }}
          name: engine.*
          workflow: build.yml
          workflow_conclusion: success
          if_no_artifact_found: fail
          name_is_regexp: true

      # 添加浸泡测试步骤
      - name: Run soaking tests
        run: |
          echo "开始执行浸泡测试..."
          # 替换为你的实际测试命令

核心逻辑说明

  1. 状态检查:通过GitHub API查询当前commit对应的build.yml最新运行记录,判断其状态(未运行、运行中、已完成)。
  2. 触发构建:若build.yml未运行,调用gh workflow run触发该工作流并记录运行ID。
  3. 等待完成:若build.yml正在运行或刚被触发,使用gh run watch等待其完成,若运行失败则直接终止soaking.yml。
  4. 验证结果:确认build.yml最终执行成功后,再执行产物下载和浸泡测试步骤。

注意事项

  • GitHub CLI安装:GitHub托管的runner默认已安装gh,若使用自托管设备,需手动安装。可添加以下步骤完成安装(以Linux为例):
    - name: Install GitHub CLI
      if: runner.os == 'Linux'
      run: |
        type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y)
        curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
        && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
        && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
        && sudo apt update \
        && sudo apt install gh -y
    
  • 权限配置:默认的GITHUB_TOKEN已具备读取工作流和触发工作流的权限,无需额外配置。

内容的提问来源于stack exchange,提问作者TorqueNoFriction

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:45:00