コンテンツにスキップ

Pull Request と課題を連動させる

GitHub Issues では、PR に Closes #123 と書くだけで Issue のリンク・ステータス更新・クローズが自動で行われます。このレシピで Backlog 課題でも同じ操作感を実現できます。PR 本文に PROJECT-123 のような課題キーを書くだけで動作します。

  1. PR 作成

    課題に PR リンクをコメント+ステータスを「処理中」に

  2. PR 本文の編集

    新たに追加された課題キーにだけコメント

  3. PR マージ

    課題を自動クローズ

name: Sync PR Lifecycle to Backlog Issues
on:
pull_request:
types: [opened, edited, closed]
branches: [main]
# リポジトリへの書き込みは不要なので全権限を無効化
permissions: {}
env:
BACKLOG_API_KEY: ${{ secrets.BACKLOG_API_KEY }}
BACKLOG_SPACE: ${{ secrets.BACKLOG_SPACE }}
# 「処理中」ステータスの ID(bee status list <PROJECT> で確認)
STATUS_IN_PROGRESS: "2"
jobs:
sync:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
# PR 本文から課題キーを抽出する
# edited イベントでは変更前の本文からもキーを取得して差分を計算する
- name: Collect issue keys from PR body
id: collect
run: |
KEYS=$(echo "$PR_BODY" | grep -oE '[A-Z_]+-[0-9]+' | sort -u | tr '\n' ' ')
echo "Detected issue keys: ${KEYS:-(none)}"
echo "keys=$KEYS" >> "$GITHUB_OUTPUT"
if [ "$EVENT_ACTION" = "edited" ]; then
PREV=$(echo "$PREV_BODY" | grep -oE '[A-Z_]+-[0-9]+' | sort -u | tr '\n' ' ')
echo "Previous issue keys: ${PREV:-(none)}"
echo "prev=$PREV" >> "$GITHUB_OUTPUT"
fi
env:
PR_BODY: ${{ github.event.pull_request.body }}
PREV_BODY: ${{ github.event.changes.body.from }}
EVENT_ACTION: ${{ github.event.action }}
- name: Build PR link text
id: pr-link
run: |
echo "md=[${REPO}#${PR_NUMBER}](${PR_URL})" >> "$GITHUB_OUTPUT"
env:
REPO: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_URL: ${{ github.event.pull_request.html_url }}
# PR 作成 → 課題にリンク+ステータスを「処理中」に
- name: Update status to "In Progress" and comment PR link
if: github.event.action == 'opened' && steps.collect.outputs.keys != ''
run: |
for KEY in $KEYS; do
echo "Updating status: $KEY -> In Progress"
npx @nulab/bee issue edit "$KEY" --status "$STATUS_IN_PROGRESS" || echo "::warning::Failed to process $KEY"
echo "Commenting on: $KEY"
npx @nulab/bee issue comment "$KEY" \
--body "PR ${PR_LINK} が作成されました" || echo "::warning::Failed to process $KEY"
done
env:
KEYS: ${{ steps.collect.outputs.keys }}
PR_LINK: ${{ steps.pr-link.outputs.md }}
# PR 本文の編集 → 新しく追加された課題キーにだけコメント
- name: Comment PR link on newly added issues
if: github.event.action == 'edited' && steps.collect.outputs.keys != ''
run: |
for KEY in $KEYS; do
if echo "$PREV_KEYS" | grep -qw "$KEY"; then
echo "Skipping: $KEY (already linked)"
continue
fi
echo "Commenting on: $KEY"
npx @nulab/bee issue comment "$KEY" \
--body "PR ${PR_LINK} にリンクされました" || echo "::warning::Failed to process $KEY"
done
env:
KEYS: ${{ steps.collect.outputs.keys }}
PREV_KEYS: ${{ steps.collect.outputs.prev }}
PR_LINK: ${{ steps.pr-link.outputs.md }}
# PR マージ → 課題をクローズ
- name: Close linked issues
if: github.event.action == 'closed' && github.event.pull_request.merged == true && steps.collect.outputs.keys != ''
run: |
for KEY in $KEYS; do
echo "Closing: $KEY"
npx @nulab/bee issue close "$KEY" \
--comment "PR ${PR_LINK} のマージにより自動クローズ" || echo "::warning::Failed to process $KEY"
done
env:
KEYS: ${{ steps.collect.outputs.keys }}
PR_LINK: ${{ steps.pr-link.outputs.md }}
ステータス ID を確認するには
bee status list <PROJECT> でプロジェクトのステータス一覧と ID を確認できます。STATUS_IN_PROGRESS の値をプロジェクトに合わせて変更してください。
ステータス変更が不要
bee issue edit の行と STATUS_IN_PROGRESS 環境変数を削除すれば、リンクのコメントだけになります。
自動クローズが不要
「Close linked issues」ステップを削除してください。
クローズではなく別のステータスにしたい
bee issue closebee issue edit --status <ステータスID> に変更してください。ステータス ID は bee status list <PROJECT> で確認できます。
edited イベントが不要
トリガーの types から edited を削除し、「Comment PR link on newly added issues」ステップを削除してください。