如何通过名称获取GitHub Project V2的项目项ID
解决GitHub Project V2通过名称获取项目项ID的问题
核心问题分析
- GraphQL查询结构错误:GitHub Project V2的API字段与经典版完全不同,原代码使用的
repository.project是经典项目字段,且V2不存在itemByName方法,需通过项目项搜索匹配名称。 - 步骤输出引用错误:同一Job内的步骤引用输出应使用
steps.步骤ID.outputs.输出名,而非needs(needs用于跨Job依赖)。 - 权限不足:默认
GITHUB_TOKEN无Project V2访问权限,需显式配置权限。
修正后的工作流代码
name: Get Card ID on Issue Close on: issues: types: - closed permissions: contents: read project: read # 必须添加该权限才能访问Project V2 jobs: getCardId: runs-on: ubuntu-latest steps: - name: Fetch Card ID id: fetchCardId run: | # Project V2需用projectV2字段,通过items搜索匹配名称 QUERY='query { repository(owner: "owner-name", name: "repo-name") { projectV2(number: 2) { items(query: "name:\"Play music through the AUX jack\"", first: 1) { nodes { id } } } } }' # 构造标准JSON请求体 PAYLOAD=$(jq -n --arg query "$QUERY" '{query: $query}') # 发送请求并提取第一个匹配项的ID ITEM_ID=$(curl -s -H "Authorization: bearer ${{ secrets.GITHUB_TOKEN }}" \ -H "Content-Type: application/json" \ -X POST -d "$PAYLOAD" https://api.github.com/graphql | \ jq -r '.data.repository.projectV2.items.nodes[0].id') # 设置输出变量(推荐用GITHUB_OUTPUT替代旧命令) echo "item_id=$ITEM_ID" >> "$GITHUB_OUTPUT" - name: Print Card Name and ID run: | CARD_NAME="Play music through the AUX jack" CARD_ID="${{ steps.fetchCardId.outputs.item_id }}" echo "Card name: $CARD_NAME --> ID: $CARD_ID"
关键修正点说明
- GraphQL查询调整:用
projectV2替代project,通过items(query: "...")搜索项目项,query参数支持用双引号包裹名称实现精确匹配,first:1仅返回首个匹配结果。 - 请求体优化:用
jq构造标准JSON请求体,避免原代码可能出现的格式错误。 - 输出方式更新:使用GitHub Actions官方推荐的
GITHUB_OUTPUT设置输出,替代已弃用的::set-output命令。 - 权限配置:在工作流顶部添加
permissions字段,授予project: read权限,确保GITHUB_TOKEN能访问Project V2数据。 - 输出引用修正:将
needs.fetchCardId.outputs.item_id改为steps.fetchCardId.outputs.item_id,适配同一Job内的步骤引用规则。
额外注意事项
- 若为组织级Project V2,需调整查询结构:
query { organization(login: "org-name") { projectV2(number: 2) { items(query: "name:\"你的项目项名称\"", first: 1) { nodes { id } } } } } - 项目项名称需完全匹配,搜索区分大小写;如需模糊匹配可去掉名称外的双引号。
内容的提问来源于stack exchange,提问作者Marc Proux
相关产品推荐
相关产品推荐

