Jira AutomationでSlackメンション通知を自動送信する設定手順

## これはなに

Jiraのエピックのステータス変更をトリガーとして、エピックのカスタムフィールドに登録されているメンバー宛にSlackでメンション通知を自動化で送る方法について書いている備忘録です。

## 使うもの

- Jira
- Slack（Pro版）

JiraはJira Softwareを対象として書いています。
Jira Work Managementでも同じように機能するかは未検証です。
    
Slack Pro版は、メンション通知したいメンバーが自動化フローごとに固定で決まっている場合は不要で、カスタムフィールドに登録されているメンバー宛にメンション通知をしたい場合は、ワークフロービルダーを使うためPro版が必要になると思われます。
もし他の方法があったら教えてください。

## 自動化の設定

今回は下記のようなケースを想定して設定を行います。

- Jiraのエピックのワークフローは下記の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/c161f0cf-fcd1-6dda-eb19-da1f041bf628.png)


- ステータスが`テスト完了`になった際、自動でSlackチャンネルにカスタムフィールド`authorizer`で設定した承認者宛のメンション通知を飛ばしたいとする


### カスタムフィールドの作成

まずカスタムフィールドを設定します。

プロフィールアイコン左にある設定（歯車アイコン）から`課題`を選び、サイドメニューの`カスタムフィールド`にアクセスします。

:::note warn
チームの管理者権限があるユーザーしかアクセスできないと思われるので注意です
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/e41e6078-8d4d-4c92-ddcf-fc4358ce08e2.png)

画面右上にある`カスタムフィールドを作成`のボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/d5b9b766-251b-2fcc-f2ee-3f77c4d96bdc.png)

するとフィールドタイプの選択がポップアップ表示されます。

ここで`ユーザーピッカー(単一ユーザー)`を選んでください。

後述しますが、Slackのワークフローでは`ユーザーピッカー(複数ユーザー)`で選んだユーザーの情報を受け取ることができなさそうだった為、単一ユーザーを選んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/36e8ab03-b406-da7c-7f6d-baa566829ce4.png)

カスタムフィールドの名前と説明を入れて作成します。

作成後に「フィールドを画面に関連づける」という画面表示が挟まりますが、これが何を指すのかわかっていません...
アクションとしては更新とキャンセルが選べますが、一旦キャンセルを選んで問題ないと思います。

### SlackワークフローでWebhookを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/f4793c09-ddb9-94e5-ccbb-567408b100e2.png)

サイドメニューの`自動化`→`ワークフロー`と進んで右上の`ワークフローを作成する`ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/e8e8613d-0a33-494c-c245-5a57ef88e79e.png)

新規タブでワークフローの設定画面が開くので、一番下の`Webhookから`を選択。

`変数を設定する`を選んで下記の3つを設定します。名前は任意です。

- `mentionUserEmail`
    - データタイプ...`Slackユーザーのメールアドレス`
- `jiraUrl`
    - データタイプ...`テキスト`
- `message`
    - データタイプ...`テキスト`

`続行する`ボタンを押すとワークフローが設定されてWebリクエストのURLが発行されるので、リンクをコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/27939aea-cdf2-3921-5d36-5c1ec4802cb1.png)

このようになっていればOKです。

### 自動化(Automation)の設定

Jiraに戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/e24cd9ca-83ce-55f8-6533-4ada16e8e8ba.png)

通知を設定したいプロジェクトに移動し、サイドバーの`プロジェクト設定`→`自動化`のメニューを選んで右上の`ルールを作成`ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/72257bf8-6046-43a6-8492-dba6d2800015.png)

ルールビルダーが立ち上がるので、ここで設定を行っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/67af8f22-dc8c-129a-4346-f969c6680225.png)

今回は`テスト完了`へのステータス変更時をトリガーとするので、`課題のトランジション時`を選択し、ターゲットステータスに`テスト完了`を選びます。

`コンポーネントを追加`を選んで他の条件も設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/ee526e8b-1e2f-52d9-e41a-2a6c0d793d8f.png)

ここは任意ですが、一応`課題フィールドの条件`で`課題タイプ`が`エピック`と一致する条件をIF条件で追加しておきます。

（後からエピックだけではなくストーリーにも`テスト完了`のステータスを追加したいということがあるかもしれないので）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/55bf5cdd-fa2c-e849-137b-45caf7a8e0ea.png)

続いて課題フィールドの条件で、先ほど作成したカスタムフィールド`authorizer`が「空ではない」という条件を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/2443b441-d3ef-5d56-b0df-7a7c7764aec1.png)

アクションで`Webリクエストを送信`を追加し、メソッドでPOSTを選んで下記のようにカスタムデータを設定します。

```
{
    "mentionUserEmail": "{{issue.customfield_XXXXX.emailAddress}}",
    "jiraUrl": "{{issue.url}}",
    "message": "リリース承認依頼がありました。"
}
```

`mentionUserEmail`,`jiraUrl`, `message`については先ほどSlackワークフローで設定した変数名を入れてください。

`customfield_XXXXX`の部分に関しては、冒頭で追加したカスタムフィールド`authorizer`のIDが入ります。

このIDは、`プロジェクトの設定`→`課題タイプ`にアクセスして、デベロッパーモードで対象のフィールド要素をフォーカスすると確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/afe9f6d7-44b4-44ba-12b9-9d8fc1ae14a8.png)

上の例だと、`10037`が`authorizer`のIDになります。

`message`の内容はお好みでカスタマイズしてください。

:::note info
`{{issue.url}}`などはJQLというJira独自のクエリ言語で使われる「スマートバリュー」というもので、課題検索やフィルターで演算子を使って高度な課題検索ができるようになっています。
詳細は下記リンクを参照してください。
- [はじめてのJQL 第1回：Jiraでの検索の概要とJQLの基礎](https://www.atlassian.com/ja/blog/jql-for-beginners-1)
:::

最後にルールの名前を登録し、ルールをオンにして設定完了です。

しかし、このルールのみだと、`authorizer`が設定されていない状態でエピックを`テスト完了`ステータスにトランジションしてしまった時にAutomationが動かないため、もう一つルールを追加しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/83a485dc-7c18-f758-9c2b-c6907a6c5a5d.png)

自動化ルールの一覧に戻り、先ほど作成したルールのアクションで「コピー」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/7065a43b-fc4b-f7ce-33b8-5bffd3482a98.png)

コピーが完了したら適当にルールの名前を変え、トリガーを`課題のトランジション時`から`フィールド値の変更時`に変えます。

`変化を監視するためのフィールド`に`authorizer`をセットし、`変更タイプ`を`追加された値`にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/d31f20d4-e7c5-8b6e-b6ea-cd8174470464.png)

続いて、IF条件で`課題フィールドの条件`を追加し、対象フィールドを`ステータス`、条件を「`テスト完了`と等しい」に設定します。

その他はコピー元と条件を変える必要はありません。

これで、ステータスが`テスト完了`にトランジションした後で`authorizer`フィールドに承認者を追加した場合もAutomationが動くようになります。


### Slackワークフローで変数を含めたメッセージを作成する

先ほど作成していたSlackワークフローに戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/78822a9e-5027-ba17-450d-f7b5490d4a25.png)

ステップに`メッセージ`を選んで追加します。

今回は特定のチャンネルに通知する想定なので、`チャンネルへメッセージを送信する`を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/8b65915b-fb73-57cb-cc7b-f8b649044c1e.png)

通知したいチャンネルを選んだのち、`変数を挿入する`から上記のように変数をメッセージに追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/da766975-7f04-11e9-bef3-326cb2f9d55e.png)

この時、`mentionUserEmail`のプルダウンで `@表示名`が選択されていることを確認しておきます。デフォルトでこの設定になっているはずです。

:::note warn
`mentionUserEmail`に入ってくるデータが`ユーザーピッカー(複数ユーザー)`だとうまく動かなかったため、冒頭のカスタムフィールド作成では`ユーザーピッカー(単一ユーザー)`を選んで作成して対応しています。

この方法で複数名メンションしたい場合は、単一ユーザーのカスタムフィールドを複数作成し、Slack側の変数も人数分用意するしかなさそうです...
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/7cc3fb83-f05d-7b0f-3581-caced8fdbeb2.png)

全て設定が完了したら、ワークフローの名前、説明、画像などを任意で設定して準備完了です！


### 動作確認

ワークフローが正常に動くか確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/22254141-7d59-f12d-b735-0f4410b6a165.png)

Jiraのエピックに`authorizer`が設定されている状態で、ステータスを`開発完了`から`テスト完了`にトランジションします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/e585ef60-3e64-e61d-2589-b4b503f0a23b.png)

うまく設定できていれば、このようにワークフローが動いて通知が届くはずです。

同様に、`authorizer`が設定されていない状態でステータスを`テスト完了`にして、後から`authorizer`に承認者を設定した場合も通知が来るかどうかをチェックしてください。

## おまけ: ワークフローを使わずにSlack Integrationを使って通知する方法

承認者が1人であったり、Slackで承認者のユーザーグループが設定されていたりと、メンション先が固定の場合は、Slackワークフローを使わずにSlack Integrationを設定して通知することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/19722785-8201-92ae-bb69-95c098b0cd42.png)

チャンネル情報を開いて、`インテグレーション`タブからAppの`アプリを追加する`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/479bde16-f09f-65e0-136f-62c5dbbf1374.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/771d75cc-4f13-2eb1-8e62-1dc99193af75.png)

アプリ追加画面で検索してIncoming Webhookをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/5140c6c6-6e5d-d094-5b8e-e8834e044097.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/4dfdf0f0-a183-4067-af5c-f9750120b21a.png)

通知をしたいチャンネルを選んで、インテグレーションの追加ボタンをクリックし、次のページで表示されるWebhook URLをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/63232782-4ca5-19d5-115a-4e778999e92c.png)

JiraのAutomationではアクションに`Slackメッセージを送信`を設定します。

上記の例ではSlack側に`authorizer`というユーザーグループが設定されている前提で、そのグループ宛にメンションをする設定になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452658/d064d646-7b27-210c-2952-c5c27935e622.png)

このように通知されます。
こちらの方法はワークフロービルダーを使わないので、Pro版でなくても設定できます。


## 参考: JQLスマートバリューの一覧

- [Automation smart values - issues](https://support.atlassian.com/ja/cloud-automation/docs/jira-smart-values-issues/)
- [Automation smart values - users](https://support.atlassian.com/ja/cloud-automation/docs/jira-smart-values-users/)

上記ドキュメントにEpic関連の通知でよく使いそうなスマートバリューの値とプロパティが記載されています。
メッセージで通知したい内容に応じて参照してカスタマイズしてみてください。