From 63dc01d587edb4caccf9bff471d96efeffa5cc8e Mon Sep 17 00:00:00 2001 From: shimomura-shunsuke Date: Wed, 5 Aug 2026 15:02:57 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20Renovate=20PR=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E3=82=92GraphQL=E3=81=AEbot=20login(renovate)=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GraphQL APIではRenovate botのauthor.loginは"renovate"(Bot型)で返るが、 フィルタが"renovate[bot]"(REST/UI表記)と比較していたため常に不一致となり、 Status=DoneのRenovate PRがあってもTrackingがClosedに更新されず素通りしていた。 両表記にマッチさせ、content=nullの項目でも落ちないよう修正。 --- .github/workflows/update-renovate-tracking.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-renovate-tracking.yml b/.github/workflows/update-renovate-tracking.yml index 27ab249..c20130d 100644 --- a/.github/workflows/update-renovate-tracking.yml +++ b/.github/workflows/update-renovate-tracking.yml @@ -147,7 +147,10 @@ jobs: JQ_FILTER=' [.data.organization.projectV2.items.nodes[] | select(.content.__typename == "PullRequest") | - select(.content.author.login == "renovate[bot]") | + # GraphQL returns the Renovate bot login as "renovate" (Bot actor), + # whereas the REST API / UI show "renovate[bot]". Accept both so the + # filter matches regardless of which form the API surfaces. + select((.content.author.login // "") | . == "renovate" or . == "renovate[bot]") | { id, pr: "\(.content.repository.nameWithOwner)#\(.content.number)", From fcb67d1b097f19ef7a2dfbcb701ef4eee4052398 Mon Sep 17 00:00:00 2001 From: shimomura-shunsuke Date: Wed, 5 Aug 2026 15:45:16 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20Renovate=20PR=E3=81=AETracking?= =?UTF-8?q?=E3=82=92=E4=B8=80=E5=BE=8BClosed=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renovate PRは議論・手動トラッキングの対象にならないため、PRの状態 (open/closed/merged)やプロジェクトのStatusに関わらず、Renovate項目は 一律Tracking=Closedにする。既にClosedの項目はスキップ。 これにより、autocloseされた(未マージCLOSEDの)PRがTrackedへ復活する 問題も解消される。不要になったstate/status/Trackedの参照およびStatus 関連のinput/env(status-field-name)を削除して簡素化。 --- .../workflows/update-renovate-tracking.yml | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/.github/workflows/update-renovate-tracking.yml b/.github/workflows/update-renovate-tracking.yml index c20130d..68272bf 100644 --- a/.github/workflows/update-renovate-tracking.yml +++ b/.github/workflows/update-renovate-tracking.yml @@ -12,11 +12,6 @@ on: required: false type: string default: "Tracking" - status-field-name: - description: "The name of the status field in the project" - required: false - type: string - default: "Status" dry-run: description: "If true, only log changes without applying them" required: false @@ -46,7 +41,6 @@ jobs: ORG: ${{ github.repository_owner }} PROJECT_NUMBER: ${{ inputs.project-number }} TRACKING_FIELD: ${{ inputs.tracking-field-name }} - STATUS_FIELD: ${{ inputs.status-field-name }} DRY_RUN: ${{ inputs.dry-run }} run: | set -euo pipefail @@ -94,20 +88,19 @@ jobs: TRACKING_FIELD_ID=$(echo "$META" | jq -r \ ".data.organization.projectV2.fields.nodes[] | select(.name == \"$TRACKING_FIELD\") | .id") - TRACKED_OPT=$(extract_option_id "$TRACKING_FIELD" "Tracked") CLOSED_OPT=$(extract_option_id "$TRACKING_FIELD" "Closed") if [ -z "$TRACKING_FIELD_ID" ]; then echo "::error::Field '${TRACKING_FIELD}' not found in project '${PROJECT_TITLE}'" exit 1 fi - if [ -z "$TRACKED_OPT" ] || [ -z "$CLOSED_OPT" ]; then - echo "::error::Required options 'Tracked' and/or 'Closed' not found in field '${TRACKING_FIELD}'" + if [ -z "$CLOSED_OPT" ]; then + echo "::error::Required option 'Closed' not found in field '${TRACKING_FIELD}'" exit 1 fi echo "Project: \"${PROJECT_TITLE}\" (${PROJECT_ID})" - echo "Tracking field: ${TRACKING_FIELD_ID}, Tracked=${TRACKED_OPT}, Closed=${CLOSED_OPT}" + echo "Tracking field: ${TRACKING_FIELD_ID}, Closed=${CLOSED_OPT}" # ── Step 2: Fetch all Renovate PRs from the project ── # shellcheck disable=SC2016 @@ -155,7 +148,6 @@ jobs: id, pr: "\(.content.repository.nameWithOwner)#\(.content.number)", title: .content.title, - status: [.fieldValues.nodes[] | select(.field.name? == $sf) | .name][0], tracking: [.fieldValues.nodes[] | select(.field.name? == $tf) | .name][0] }] ' @@ -174,7 +166,7 @@ jobs: -f cursor="$CURSOR") fi - PAGE_ITEMS=$(echo "$RESULT" | jq -c --arg sf "$STATUS_FIELD" --arg tf "$TRACKING_FIELD" "$JQ_FILTER") + PAGE_ITEMS=$(echo "$RESULT" | jq -c --arg tf "$TRACKING_FIELD" "$JQ_FILTER") RENOVATE_ITEMS=$(echo "$RENOVATE_ITEMS" "$PAGE_ITEMS" | jq -s '.[0] + .[1]') HAS_NEXT=$(echo "$RESULT" | jq -r '.data.organization.projectV2.items.pageInfo.hasNextPage') @@ -221,29 +213,23 @@ jobs: ITEM_ID=$(echo "$item" | jq -r '.id') PR=$(echo "$item" | jq -r '.pr') TITLE=$(echo "$item" | jq -r '.title') - STATUS=$(echo "$item" | jq -r '.status // "none"') TRACKING=$(echo "$item" | jq -r '.tracking // "none"') - if [ "$STATUS" = "Done" ]; then - DESIRED="Closed" - DESIRED_OPT="$CLOSED_OPT" - else - DESIRED="Tracked" - DESIRED_OPT="$TRACKED_OPT" - fi - - if [ "$TRACKING" = "$DESIRED" ]; then + # Renovate PRs never need discussion or manual tracking on the board, + # so every Renovate item is forced to Closed regardless of PR state or + # project Status. Items already Closed are skipped. + if [ "$TRACKING" = "Closed" ]; then SKIP=$((SKIP + 1)) continue fi echo "${PR}: ${TITLE}" - echo " Status=${STATUS}, Tracking=${TRACKING} → ${DESIRED}" + echo " Tracking=${TRACKING} → Closed" if [ "$DRY_RUN" = "true" ]; then echo " [DRY RUN]" SUCCESS=$((SUCCESS + 1)) - elif update_tracking "$ITEM_ID" "$DESIRED_OPT"; then + elif update_tracking "$ITEM_ID" "$CLOSED_OPT"; then echo " [OK]" SUCCESS=$((SUCCESS + 1)) else