如何让GitHub Actions按顺序执行(无需额外包导入)
实现GitHub Actions顺序执行(无需额外依赖)
核心思路
利用GitHub API查询当前仓库中同类型Workflow的运行状态,循环等待直到上一次运行完成,再触发当前任务。
具体实现步骤
1. 配置Workflow权限
在Workflow文件开头添加权限配置,确保能读取Workflow运行状态:
permissions: actions: read contents: read
2. 添加等待逻辑步骤
在需要等待的任务前,加入一段使用curl和jq查询API的脚本:
jobs: sequential-job: runs-on: ubuntu-latest steps: - name: 等待上一次同类型Workflow完成 id: wait-for-previous run: | # 获取当前Workflow的名称 WORKFLOW_NAME="${{ github.workflow }}" # 获取当前运行的ID CURRENT_RUN_ID="${{ github.run_id }}" # 循环查询直到上一次运行完成 while true; do # 调用GitHub API获取最近的Workflow运行记录 RESPONSE=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ "https://api.github.com/repos/${{ github.repository }}/actions/workflows/${WORKFLOW_NAME}/runs?status=in_progress&per_page=1") # 解析是否有正在运行的其他实例(排除当前运行) IN_PROGRESS=$(echo "$RESPONSE" | jq -r ".workflow_runs[] | select(.id != $CURRENT_RUN_ID) | .id") if [ -z "$IN_PROGRESS" ]; then echo "无正在运行的同类型Workflow,继续执行任务" break else echo "上一次Workflow仍在运行,等待30秒后重试..." sleep 30 fi done # 这里放你实际要执行的任务步骤 - name: 执行核心任务 run: | echo "开始执行核心任务..." # 你的任务命令
3. 关键说明
GITHUB_TOKEN:GitHub自动提供的令牌,无需手动创建,只要配置了正确的权限就能使用- 循环间隔:示例中用30秒,可根据实际需求调整
- 状态过滤:API查询时只筛选
in_progress状态的运行,确保只等待未完成的任务 - 排除当前运行:通过
CURRENT_RUN_ID避免等待自身
注意事项
- 确保运行环境安装了
jq(Ubuntu-latest镜像默认已包含) - 如果Workflow名称包含特殊字符,需要对
WORKFLOW_NAME进行URL编码 - 若仓库为私有,权限配置需确保
actions: read权限生效
内容的提问来源于stack exchange,提问作者user20531393
相关产品推荐
相关产品推荐

