Ubuntu无交互环境下用GH CLI运行GitHub工作流并等待完成的咨询
无交互运行GitHub工作流并等待完成的实现方案
可行性说明
完全可行。GH CLI支持无交互触发工作流,且能通过命令查询运行状态,结合shell循环即可实现等待工作流完成后再执行后续命令。
实现步骤
- 无交互触发工作流:指定工作流文件和仓库(避免环境默认仓库不一致),触发时直接获取运行ID
- 轮询等待运行结束:通过运行ID循环查询工作流状态,直到状态变为
completed(包含成功或失败) - 根据结果执行后续命令:可选判断运行是否成功,再决定后续操作
完整cloud-init示例
#cloud-config runcmd: - | # 触发Node.js CI工作流并获取运行ID RUN_ID=$(gh workflow run node.js.yml --repo <你的GitHub仓库名> --json databaseId --jq '.databaseId') echo "工作流已触发,运行ID: $RUN_ID" # 轮询等待工作流完成 MAX_ATTEMPTS=60 ATTEMPT=0 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do RUN_STATUS=$(gh run view $RUN_ID --json status --jq '.status') echo "当前工作流状态: $RUN_STATUS" # 状态为completed时退出循环 if [ "$RUN_STATUS" = "completed" ]; then break fi # 每30秒查询一次 sleep 30 ATTEMPT=$((ATTEMPT+1)) done # 检查工作流最终结果 if [ $ATTEMPT -ge $MAX_ATTEMPTS ]; then echo "工作流执行超时" else RUN_CONCLUSION=$(gh run view $RUN_ID --json conclusion --jq '.conclusion') if [ "$RUN_CONCLUSION" = "success" ]; then echo "工作流执行成功,开始后续命令..." # 此处添加后续需要执行的命令 # 示例:echo "执行后续部署操作" else echo "工作流执行失败,结论: $RUN_CONCLUSION" # 可选添加失败处理逻辑 fi fi
关键命令说明
gh workflow run node.js.yml --repo <仓库名>:无交互触发指定工作流--json databaseId --jq '.databaseId':提取触发后的运行ID,用于后续状态查询gh run view $RUN_ID --json status --jq '.status':查询工作流当前状态,常见值:queued、in_progress、completedgh run view $RUN_ID --json conclusion --jq '.conclusion':查询工作流最终结果,成功为success,失败为failure等
注意事项
- 确保EC2实例上的GH CLI已完成无交互认证(如通过环境变量
GITHUB_TOKEN或提前配置好登录状态) - 确认GitHub仓库的self-hosted runner处于在线状态,否则工作流会一直处于排队状态
- 可根据工作流实际运行时长调整轮询间隔(
sleep的时间)和最大尝试次数(MAX_ATTEMPTS)
附原工作流代码
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs name: Node.js CI on: push: branches: [ "master" ] pull_request: branches: [ "master" ] workflow_dispatch: jobs: build: runs-on: self-hosted strategy: matrix: node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' token: ${{ secrets.TOKEN_NAME }} - run: npm ci - run: npm run build --if-present
内容的提问来源于stack exchange,提问作者crvxッ
相关产品推荐
相关产品推荐

