如何在仓库上传Artifact时触发GitHub工作流?硬件测试场景需求
解决方案
1. 事件驱动触发硬件测试工作流(无需轮询)
利用GitHub Actions的workflow_run事件,让每个复刻的A-hardware-test仓库主动监听项目A的目标工作流运行状态,实现纯事件触发,完全替代轮询方案:
在A-hardware-test模板的.github/workflows/hardware-test.yml中配置触发规则:
on: workflow_run: workflows: ["项目A的构建与虚拟测试工作流名称"] # 替换为项目A实际的工作流名称 repositories: ["你的用户名/项目A"] # 替换为项目A的完整仓库路径 types: [in_progress] # 匹配项目A工作流运行中状态,结合v4版Artifact提前可获取的特性,实现硬件测试与虚拟测试同步启动
当项目A的目标工作流进入运行中状态时,硬件测试仓库的工作流会自动触发。后续在工作流中添加步骤,用拥有项目A读取权限的PAT拉取对应运行ID的Artifact:
jobs: hardware-test: runs-on: self-hosted # 绑定对应真实硬件的自托管Runner steps: - name: 拉取项目A的构建产物 env: PAT: ${{ secrets.PROJECT_A_PAT }} RUN_ID: ${{ github.event.workflow_run.id }} REPO: "你的用户名/项目A" run: | # 调用GitHub API获取Artifact下载链接并拉取 ARTIFACT_URL=$(curl -s -H "Authorization: token $PAT" \ https://api.github.com/repos/$REPO/actions/runs/$RUN_ID/artifacts | \ jq -r '.artifacts[] | select(.name == "构建产物名称") | .archive_download_url') curl -L -H "Authorization: token $PAT" $ARTIFACT_URL -o artifact.zip unzip artifact.zip
2. 向项目A的PR反馈状态
通过GitHub API直接更新项目A对应PR的状态检查,实现任务接收、测试完成的全流程状态反馈:
步骤1:提取项目A工作流关联的PR编号
在硬件测试工作流中添加步骤,从项目A的工作流运行记录中获取关联的PR信息:
- name: 获取关联PR编号 env: PAT: ${{ secrets.PROJECT_A_PAT }} RUN_ID: ${{ github.event.workflow_run.id }} REPO: "你的用户名/项目A" run: | EVENT_DATA=$(curl -s -H "Authorization: token $PAT" \ https://api.github.com/repos/$REPO/actions/runs/$RUN_ID) PR_NUMBER=$(echo $EVENT_DATA | jq -r '.pull_requests[0].number') echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV
步骤2:实时更新PR状态检查
在测试启动时标记pending状态,测试结束后根据结果标记success/failure/error:
- name: 标记任务接收状态 env: PAT: ${{ secrets.PROJECT_A_PAT }} REPO: "你的用户名/项目A" RUN_ID: ${{ github.run_id }} run: | curl -X POST -H "Authorization: token $PAT" \ https://api.github.com/repos/$REPO/statuses/${{ github.event.workflow_run.head_sha }} \ -d '{ "state": "pending", "description": "硬件测试任务已接收,正在执行", "context": "hardware-test/你的硬件标识" }' # 此处添加真实硬件测试的执行步骤 - name: 执行硬件测试 run: ./run-hardware-tests.sh - name: 标记测试完成状态 if: always() env: PAT: ${{ secrets.PROJECT_A_PAT }} REPO: "你的用户名/项目A" TEST_STATUS: ${{ job.status }} RUN_ID: ${{ github.run_id }} run: | STATE="success" if [ "$TEST_STATUS" = "failure" ]; then STATE="failure" elif [ "$TEST_STATUS" = "cancelled" ]; then STATE="error" fi curl -X POST -H "Authorization: token $PAT" \ https://api.github.com/repos/$REPO/statuses/${{ github.event.workflow_run.head_sha }} \ -d '{ "state": "'"$STATE"'", "description": "硬件测试'"$STATE"'", "context": "hardware-test/你的硬件标识", "target_url": "https://github.com/你的用户名/A-hardware-test/actions/runs/'"$RUN_ID"'" }'
3. 模板化适配复刻需求
在A-hardware-test模板仓库中,将用户需要自定义的配置项通过GitHub Secrets和模板变量暴露:
- 在模板的
README.md中明确说明需配置的Secrets:PROJECT_A_PAT(拥有项目A repo权限的令牌)、PROJECT_A_REPO(项目A的完整仓库路径) - 将工作流中的硬编码值替换为模板变量(如
{{ secrets.PROJECT_A_REPO }}),让复刻仓库的用户只需配置Secrets即可快速适配自身硬件环境。
内容的提问来源于stack exchange,提问作者troglobit
相关产品推荐
相关产品推荐

