手动触发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 "开始执行浸泡测试..." # 替换为你的实际测试命令
核心逻辑说明
- 状态检查:通过GitHub API查询当前commit对应的
build.yml最新运行记录,判断其状态(未运行、运行中、已完成)。 - 触发构建:若
build.yml未运行,调用gh workflow run触发该工作流并记录运行ID。 - 等待完成:若
build.yml正在运行或刚被触发,使用gh run watch等待其完成,若运行失败则直接终止soaking.yml。 - 验证结果:确认
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
相关产品推荐
相关产品推荐

