Backlog の課題に GitHub のプルリクを連携する GitHub Action を作りました

はじめに

【全部俺】 Web フロントエンドエンジニアのメモ Advent Calendar 2022 1日目の記事です。
プルリクストをBacklog課題のコメントに追加するGitHub Actionを公開しました。ぜひご利用ください。

GitHub Action

GitHub Actionとは、GitHub内で完結するCI / CDツールです。個人開発や仕事で大変お世話になっています。
Actions | GitHub
https://github.co.jp/features/actions
そのうち、仕事で活用できたパッケージを1つ公開し、GitHub Marketplaceに公開しています。

Backlog Notify

プッシュされたりプルリクストが作成されたらBacklog課題のコメントにリンクコメントを送信するGitHub Actionです。キーワードによる課題の状態変更も可能です。
Backlog Notify · Actions · GitHub Marketplace
https://github.com/marketplace/actions/backlog-notify

使用方法

プルリクエスト

Backlog Notifyの動作をイメージした図。GitHub にプルリクエストを作成すると Backlog にプルリクエスト情報のコメントがされる
プルリクエストのタイトルの中に課題番号 (例: PROJECT-123 ) がある場合は、その課題にプルリクエストに関するコメントを送信します。課題キーは先頭にある1つのみ認識します。
PROJECT-123 不具合修正
また、キーワードがある場合は、マージされたタイミングで課題ステータスを変更します。キーワードは末尾にある1つのみ認識します。
  • #fix #fixes #fixed のどれかで処理済み
  • #close #closes #closed のどれかで完了
PROJECT-123 不具合修正 #fix

プッシュ

Backlog Notifyの動作をイメージした図。GitHub にプッシュすると Backlog にコミット情報のコメントがされる
コミットメッセージの中に課題番号 (例: PROJECT-123 ) がある場合は、その課題にコミットログに関するコメントを送信します。課題キーは先頭にある1つのみ認識します。
PROJECT-123 不具合修正
また、キーワードがある場合は、プッシュされたタイミングで課題ステータスを変更します。キーワードは末尾にある1つのみ認識します。
  • #fix #fixes #fixed のどれかで処理済み
  • #close #closes #closed のどれかで完了
ちなみに空コミットすることで、Backlogを開かずともコメントを残したりステータスを変更できます。
PROJECT-123 不具合修正 #fix

設定方法

BOT ユーザーの作成

  1. Backlogのプロジェクトに移動します。
  2. プロジェクト設定 → 参加ユーザー → 新しいユーザの追加はこちらからを選択します。
  3. クラシックプランの場合は 一般ユーザ 、新プランの場合は ゲスト を選択します。
  4. 登録します。
Backlog.com のスクリーンショット 「プロジェクト設定」→「参加ユーザー」→「新しいユーザーの追加はこちら」を選択する

Backlog API キーの取得

  1. 登録したBOTアカウントにログインします。
  2. 個人設定 → API → 登録でAPIキーを発行します。
Backlog.com のスクリーンショット 「ユーザー設定」→「API設定」からAPIを発行します

API キーを GitHub に登録

  1. GitHubのリポジトリページに移動します。
  2. Setting → Secrets → Add a new secretを選択します。
  3. Nameは BACKLOG_API_KEY とし、 ValueにAPIキーをそのまま貼り付けます。
  4. 登録します。
GitHubのプロジェクトスクリーンショット リポジトリの「Settings」→「Secrets」→「Add a new secret」 を選択して、 BACKLOG_API_KEY を追加する

collaborator による workflow の実行を制限

プライベートリポジトリの場合は下記の操作する必要はありません。
パブリックリポジトリの場合は、collaboratorからのworkflowの実行を制限してください。
  1. Setting → Actions → Fork pull request workflows from outside collaboratorsを開きます。
  2. Require approval for all outside collaborators を選択します。
GitHubのプロジェクトスクリーンショット リポジトリの「Settings」→「Actions」→「Fork pull request workflows from outside collaborators」

Workflow の作成

GitHub Actions workflowを作成します (例: .github/workflows/backlog-notify.yml )。 下記のような形式である必要があります。
name: Backlog Notify

on:
  push:
  pull_request:
    types:
      - opened
      - reopened
      - ready_for_review
      - closed

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Backlog Notify
        uses: bicstone/backlog-notify@v4
        with:
          project_key: PROJECT_KEY
          api_host: example.backlog.jp
          api_key: ${{ secrets.BACKLOG_API_KEY }}

高度な設定

Workflow syntax for GitHub Actions - GitHub Docs を参照に実行する条件を制御できます。 また、コメントのフォーマットや、メッセージを解析する際の正規表現などをカスタマイズできます。
name: Backlog Notify
on:
  push:
    branches:
      - main
  pull_request:
    types:
      - opened
      - reopened
      - ready_for_review
      - closed
    branches:
      - releases/**
jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Backlog Notify
        uses: bicstone/backlog-notify@v4
        with:
          # 必須設定 (The following are required settings)
          project_key: PROJECT_KEY
          api_host: example.backlog.jp
          api_key: ${{ secrets.BACKLOG_API_KEY }}
          # 任意設定 (The following are optional settings)
          fix_keywords: |-
            #fix
            #fixes
            #fixed
          close_keywords: |-
            #close
            #closes
            #closed
          push_comment_template: |-
            <%= commits[0].author.name %>さんが[<%= ref.name %>](<%= ref.url %>)にプッシュしました
            <% commits.forEach(commit=>{ %>
            + [<%= commit.comment %>](<%= commit.url %>) (<% print(commit.id.slice(0, 7)) %>)<% }); %>
          pr_opened_comment_template: |-
            <%= sender.login %>さんがプルリクエストを作成しました
            + [<%= title %>](<%= pr.html_url %>) (#<%= pr.number %>)
          pr_reopened_comment_template: |-
            <%= sender.login %>さんがプルリクエストを作成しました
            + [<%= title %>](<%= pr.html_url %>) (#<%= pr.number %>)
          pr_ready_for_review_comment_template: |-
            <%= sender.login %>さんがプルリクエストを作成しました
            + [<%= title %>](<%= pr.html_url %>) (#<%= pr.number %>)
          pr_closed_comment_template: |-
            <%= sender.login %>さんがプルリクエストをクローズしました
            + [<%= title %>](<%= pr.html_url %>) (#<%= pr.number %>)
          pr_merged_comment_template: |-
            <%= sender.login %>さんがプルリクエストをマージしました
            + [<%= title %>](<%= pr.html_url %>) (#<%= pr.number %>)
          commit_message_reg_template: "\
            ^\
            (<%= projectKey %>\\-\\d+)\\s?\
            (.*?)?\\s?\
            (<% print(fixKeywords.join('|')) %>|<% print(closeKeywords.join('|')) %>)?\
            $\
            "
          pr_title_reg_template: "\
            ^\
            (<%= projectKey %>\\-\\d+)\\s?\
            (.*?)?\\s?\
            (<% print(fixKeywords.join('|')) %>|<% print(closeKeywords.join('|')) %>)?\
            $\
            "
          fix_status_id: 3
          close_status_id: 4

設定一覧

設定名説明
project_keyBacklog プロジェクトキー (必須)
api_hostBacklog のホスト (必須)
api_keyBacklog API キー (必須)
fix_keywords処理済みにするキーワード
close_keywords完了にするキーワード
push_comment_templateプッシュ時のコメント雛形
pr_opened_comment_templateプルリクエストオープン時のコメント雛形
pr_reopened_comment_templateプルリクエスト再オープン時のコメント雛形
pr_ready_for_review_comment_templateプルリクエスト下書き解除時のコメント雛形
pr_closed_comment_templateプルリクエストクローズ時のコメント雛形
pr_merged_comment_templateプルリクエストマージ時のコメント雛形
commit_message_reg_templateコミットメッセージ解析の正規表現雛形
pr_title_reg_templateプルリクエストタイトル解析の正規表現雛形
fix_status_id処理済みの 状態 ID
close_status_id完了の 状態 ID

push_comment_template

プッシュ時のコメントの雛形を変更できます。
構文については lodash/template をご参照ください。
使用可能な変数
変数名
commitsParsedCommit[]
refParsedRef
ParsedCommit
変数名
idstring
tree_idstring
distinctboolean
messagestring
timestampstring
urlstring
authorCommitter
committerCommitter
addedstring[]
modifiedstring[]
removedstring[]
issueKeystring
commentstring
keywordsstring
isFixboolean
isCloseboolean
ParsedRef
変数名
namestring
urlstring
Committer
変数名
namestring
emailstring | null
datestring | undefined
usernamestring | undefined

pr_*_comment_template

プルリクエストイベントのコメントの雛形を変更できます。
構文については lodash/template をご参照ください。
使用可能な変数
変数名
prPullRequest
action
"opened" | "reopened" | "ready_for_review" | "closed" ※1
senderUser
issueKeystring
titlestring ※2
keywordsstring
isFixboolean
isCloseboolean
※1マージとクローズは共に "closed" となります。マージであるかを判別したい場合は pr.merged を参照ください。
※2課題キーとキーワードを除いたタイトルです。加工前のタイトルは pr.title を参照ください。
PullRequest
Get a pull request - GitHub Docs のResponse schemaをご参照ください。
User
Get the authenticated user - GitHub Docs のResponse schemaをご参照ください。

commit_message_reg_template

コミットメッセージ解析の正規表現雛形を変更できます。
構文については lodash/template をご参照ください。
使用可能な変数
変数名
projectKeystring
fixKeywordsstring[]
closeKeywordsstring[]

pr_title_reg_template

プルリクエストタイトル解析の正規表現雛形を変更できます。
構文については lodash/template をご参照ください。
使用可能な変数
変数名
projectKeystring
fixKeywordsstring[]
closeKeywordsstring[]

よくある質問と回答

  • 何をプッシュしても実行に失敗し、ログに401エラーとある
    APIキーが誤っている可能性があります。
  • プロジェクトキーと課題キーが正しいのにも関わらず、実行に失敗し、ログに404エラーとある
    該当APIキーのユーザーがプロジェクトに参加していない可能性があります。

料金について

GitHub Actionsは処理時間で課金されるためできるだけ実行時間を減らすよう設計しています。
ncc を活用し、単一のファイルにコンパイルしたNode.jsのプログラムとなっており、数秒で実行が完了します。2コミットでは3秒でした。とてもエコです。
GitHub Actions の実行履歴スクリーンショット

まとめ

もし、便利だと思ったらスター頂ければ幸いです。実はしばらくBacklogを使用しておらず、多くの方に使用していただいているという責任感で維持している状態です。反響があると、維持するモチベーションに繋がります。
よろしくお願いいたします。
Backlog Notify · Actions · GitHub Marketplace
https://github.com/marketplace/actions/backlog-notify

ホームプロフィール外部リンクのため、別ウインドウで開きますプライバシーポリシー

時間のないサイト運営者リング外部リンクのため、別ウインドウで開きます

© 2024 Oishi Takanori / Made with Gatsby.js