JiraとGitHubを連携！PBIとSBIを自動でIssue化する方法

## はじめに ~なぜJiraとGitHubを連携させるのか？
プロジェクト管理ツールとしてJiraを使いながら、コードの管理やプルリクエストの追跡にはGitHubを使っているチームは少なくありません。しかし、JiraとGitHubを個別に管理していると、以下のような問題が発生します。
- 2重管理による非効率さ
  - Jiraで課題を登録しても、GitHub上でも手動でIssueを作成する必要がある。これが続くと「結局どっちを見ればいいんだ？」という混乱が起こる
- 情報の分断
  - どの課題がどのGitHub Issueに対応しているのか、いちいち手動でリンクする手間が増える。更新漏れが起きると、最新の進捗が見えなくなる
- チーム全体の生産性の低下
  - 開発者がコーディングではなく「管理作業」に時間を取られることで、開発スピードが遅くなる


## JiraとGitHub連携の全体像をざっくり解説！
### 本記事における定義
まずは、本記事で使用する用語の定義を整理します。JiraとGitHubでの用語が異なるため、一貫性を持たせるために以下のように対応付けを行います。

- PBI: Jiraの課題(タスク)、　GitHubでのIssue
- SBI: Jiraの課題(サブタスク)、GitHubのSub-Issue

### 全体の流れをざっくり説明
Jiraの機能であるJira Automationを活用し、課題タイプに応じてGitHub側にIssueまたはSub-Issueを自動で作成します。
```mermaid
graph TD
    A[Jiraで課題を作成] -->|トリガー: Jira Automation| B{課題タイプは？}
    B -->|タスク| C[GitHubでブランチを作成]
    C --> D[GitHub Issueを作成]
    B -->|サブタスク| E[GitHub Issueを作成]
    D --> F[タスクのカスタムフィールドを更新<br>GitHub Issue<br>GitHub Issue URL]
    E --> G[サブタスクのカスタムフィールドを更新<br>GitHub Issue<br>GitHub Issue URL]
    G -->|サブタスク| H[GitHub Issueとsub-issueを紐づける]
```
### 必要なツールと環境設定
#### Jiraで必要なもの
- Atlassian アカウント
  - Jiraを利用するための基本的なアカウント
- GitHub Cloud を Jira に接続する
  - [GitHub Cloud を Jira に接続する](https://support.atlassian.com/ja/jira-cloud-administration/docs/integrate-with-github/ "GitHub Cloud を Jira に接続する") 参照
  - JiraとGitHubを連携させるために、「GitHub for Jira」アプリをインストールし、両方を接続します

#### GitHubで必要なもの
- GitHubアカウント
   - GitHubを利用するためのアカウント
- Organization
   - 組織
- Organizationのリポジトリ
   - 組織に紐づくリポジトリ
- personal access token(Fine-grained personal access token)
   - GitHub APIと連携するためのアクセストークン
   - [個人用アクセス トークンを管理する](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) 参照
   - [組織の個人用アクセス トークン ポリシーを設定する](https://docs.github.com/ja/organizations/managing-programmatic-access-to-your-organization/setting-a-personal-access-token-policy-for-your-organization) 参照


## Jira → GitHub Issue 自動化の手順
### カスタムフィールドの追加
GitHub Issueの情報を取り込むためのカスタムフィールドをJiraの課題（タスクやサブタスク）用に作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/58910274-dc58-07c7-004a-a519253b8cc4.png" width=50%>

### Jira Automationの全体構成
今回作成するJira Automationルールの完成形のイメージは以下のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/1cddbe65-932e-0432-a1c5-76f38499a6b1.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/02cb635d-b1a8-e35f-f464-e7929e5b99ac.png" width=50%>

### Jira Automationのルール詳細
#### コンポーネント1: トリガー
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/21cacc55-4a04-c086-8789-90c8803c0429.png" width=50%>

- トリガー内容
   - 課題の作成時

#### コンポーネント2: 条件
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/68b7f0de-fd2e-e05f-5d35-0738aa1b4db5.png" width=50%>

- 条件内容
   - {{issue.issueType.name}} が Task と等しいかどうかを確認します
- 動作概要
   - この条件は、課題の種類（Issue Type）が "Task" に該当するかを判定します
条件が満たされた場合のみ、次のアクションに進みます。

#### コンポーネント3: アクション
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/2b707b7d-531c-e6ff-6b81-0681a0adc105.png" width=50%>

- アクション内容
   - GitHubリポジトリで新しいブランチを作成します
- 動作概要
   - ブランチ名をfeature/{{issue.key}}の形式で作成します
   - {{issue.key}} はJira課題のキー（例: TASK-123）が自動的に挿入されます

#### コンポーネント4,8: アクション
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/9ed66eee-e4f8-45de-82b8-ce1e9341b786.png" width=50%>

- アクション内容
   - GitHub APIを使用して、新しいIssueを作成するWebリクエストを送信します
- 動作概要
   - Web リクエスト URL: `https://api.github.com/repos/OWNER/REPO/issues`
   - HTTP メソッド: POST
   - Web リクエスト本文: `{"title": "【PBI】{{issue.summary}}"}`
- 補足
   - 後続の処理で、リクエストの応答を使うので以下のチェックボックスをONにします
      - 「この Web リクエストからの応答を受信するまで、後続のルール アクションの実行を遅延します」
      - 「リクエストの応答が正常でなかった場合 (200 応答でない場合) でも、ルールの実行を続行します」

#### コンポーネント5,9: 条件
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/1a9d41fb-b431-c35e-33f5-0203c3ffdb43.png" width=50%>

- 条件内容
   - Webリクエストの応答ステータスコードが 201 と等しいかどうかを確認します
- 動作概要
   - この条件は、{{webResponse.status}}（WebリクエストのHTTPレスポンスコード）が 201 に該当するかを判定します

#### コンポーネント6,10: アクション
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/497a9a56-b5c5-695d-449c-ce1659a14c9e.png" width=50%>

- アクション内容
   - Jira課題のフィールドを編集し、GitHub Issueに関連する情報を追加します
- 動作概要
   - 編集対象フィールド
      - GitHub Issue
      - GitHub Issue URL
   - 設定内容
      - Webリクエストで取得したGitHub Issueの情報（Issue番号とURL）をJira課題のフィールドに書き込みます

#### コンポーネント7: 条件
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/dc9cc4f0-53d8-3857-b263-6aead1c134fa.png" width=50%>

- 条件内容
   - {{issue.issueType.name}} が サブタスク と等しいかどうかを確認します
- 動作概要
   - この条件は、課題の種類（Issue Type）が "サブタスク" に該当するかを判定します
条件が満たされた場合のみ、次のアクションに進みます。


#### コンポーネント11: アクション
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/9ed66eee-e4f8-45de-82b8-ce1e9341b786.png" width=50%>

- アクション内容
   - GitHub APIを使用して、新しいIssueを作成するWebリクエストを送信します
- 動作概要
   - Web リクエスト URL: `https://api.github.com/repos/OWNER/REPO/issues/ISSUE_NUMBER/sub_issues`
   - HTTP メソッド: POST
   - Web リクエスト本文: `{"sub_issue_id": {{webResponse.body.id}}}`
- 補足
   - ISSUE_NUMBERにはタスクの「GitHub Issue」のフィールドを指定します
      - 例: {{issue.parent.customfield_10040}}

### Jira Automationのルール実行結果
作成したJira Automationのルールを実際に試してみます。

1. 課題(タスク)の作成します
![スクリーンショット 2024-12-11 18.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/e0a29b0c-8ba4-a2d3-41ed-db252bd0b1f5.png)

2. 自動でGithub Issuesが作成されます
![スクリーンショット 2024-12-11 18.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/a4bb5c8e-1aae-450f-d220-e401724480b0.png)

3. ブランチが自動で作成され、カスタムフィールド（GitHub Issue、GitHub Issue URL）にGitHub Issueの情報が登録されます
![スクリーンショット 2024-12-11 18.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/dbcc2e16-394e-f442-b1c1-fecbaad3f462.png)

4. 課題(サブタスク)の作成します
![スクリーンショット 2024-12-11 18.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/d296cfd0-9b81-e81e-e8f4-0a6c892ccfe6.png)

5. GitHub Issueが自動で作成され、そのIssueを課題（タスク）のGitHub Issueにsub-issueとして紐付けされます
![スクリーンショット 2024-12-11 18.17.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/0ff4356b-64e4-e0d1-4f2c-8a30b3b87f03.png)

6. カスタムフィールド（GitHub Issue、GitHub Issue URL）にGitHub Issueの情報が登録されます
![スクリーンショット 2024-12-11 18.18.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935482/c9ddf69e-aab2-4bfa-e4de-b667fefcffa6.png)

## おわりに
今回の記事では、Jira Automationを活用してJiraとGitHubを連携し、タスク管理を効率化する方法について解説しました。この設定を導入することで、手動での同期作業が不要になり、チーム全体の作業スピードや精度が向上します。
この記事が、日々のタスク管理をよりスムーズにする一助となれば幸いです。ぜひ試してみて、プロジェクトの効率化を実現してください！