CircleCIを使ってAutifyのテスト結果をTeamsに通知する

## 1. はじめに

CircleCIを用いてAutifyとMicrosoft Teams(以降Teams)を連携する方法を説明します。

具体的には、ソースコードがGitHubのmainブランチへマージされたタイミングで、Autifyのテストプランを実行し、テスト結果URLをTeamsへ通知します。見た目をよりリッチにしたい方は「[Microsoft Teams API (Incoming Webhook) で投稿 - Qiita](https://qiita.com/wataash/items/72b49509c3964294dd67)」が参考になると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/caef569b-f628-fcfb-0b57-c7dc1e884e6b.png)

なお、今回はテスト実行の完了を待たずに結果URLを通知します。完了を待つためには、AutifyのAPIによってテスト結果の`status`を取得し、待機または結果通知を行うスクリプトを作成することで可能になります。

## 2. 使用するツール

- [CircleCI](https://circleci.com/ja/) 
- [Autify](https://autify.com/ja)
- Microsoft Teams

## 3. 手順

1. Teamsのチャネルに受信Webhookを設定
2. CircleCIに環境変数を設定
3. CircleCIの`config.yml`を作成
    1. Autifyのテストプランを実行する
    2. テスト結果のIDを取得する
    3. テスト結果URLをTeamsへ通知する
    4. トリガーを指定する

### 3-1. Teamsのチャネルに受信Webhookを設定

[受信 Webhook を作成する - Teams | Microsoft Docs](https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook)を参考に、通知を受け取りたいTeamsのチャネルにWebhookを設定します。

設定したURLは後述の手順で使うので、どこかにメモしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/0fb070ba-3fa0-da5c-4b06-65e9905d04c5.png)

### 3-2. CircleCIに環境変数を設定

CircleCIの「Project Setting > Environment Variable」から、次の３つの環境変数を設定します。

- **AUTIFY_PERSONAL_ACCESS_TOKEN**
    - Autifyの「設定 > 個人設定」から「新しいパーソナルアクセストークンを生成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/81f47d34-a3b0-4265-f60f-4ab8b72e0d97.png)


- **AUTIFY_PROJECT_ID**
    - Autifyの「設定 > プロジェクト」を開き、URLからプロジェクトIDを取得
        - 例) `https://app.autify.com/settings/projects/999`の場合、`999`

- **AUTIFY_TEST_PLAN_ID**
    - 実行したいテストシナリオを選択し、テストプランを作成します
    - 「テストプラン」ページを開き、URLからテストプランIDを取得
        - 例) `https://app.autify.com/projects/999/test_plans/0000`の場合、`0000`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/a70ae57e-e358-1d00-3770-ced9e279634d.png)

### 3-3. CircleCIの`config.yml`を作成

Autifyのテストプランの実行と結果の通知を行うワークフローを作成します。
今回は、Autifyで用意されている[CirckeCI用のサンプル](https://github.com/autifyhq/autify-example-integration-with-circleci)を参考にしました。

※APIの一覧は[こちら](https://autifyhq.github.io/autify-api/)。しかし、2021年11月現在、サイト内でのAPI実行はうまくいかないようです。Postmanなど別の方法でお試しください。

**Autifyのテストプランを実行する**

環境変数を使って、テスト実行用のPOSTメソッドを設定します。

```yaml:.circleci/config.yml
version: 2.1

jobs:
  publish-to-production:
    docker:
      - image: cimg/base:2020.01

    steps:
      - checkout

      - run:
          name: Run regression tests
          command: |
            # テストプラン実行
            response=$(\
              curl -XPOST -H "Authorization: Bearer ${AUTIFY_PERSONAL_ACCESS_TOKEN}" \
              https://app.autify.com/api/v1/schedules/${AUTIFY_TEST_PLAN_ID} \
            )
```

**テスト結果のIDを取得する**

jqコマンドを使って、レスポンスからテスト結果IDを取得します。

```yaml:.circleci/config.yml
            # テストプラン実行 ...

            # テスト結果ID取得
            test_plan_result_id=$(echo ${response} | jq -r .data.id)
```

**テスト結果URLをTeamsへ通知する**

[前述の手順](#3-1. Teamsのチャネルに受信Webhookを設定)で取得したWebhook URLを使って、POSTメソッドを設定します。

```yaml:.circleci/config.yml
            # テスト結果ID取得 ...

            # 結果URLのTeams通知
            response=$(\
              curl -X POST -H "Content-Type: application/json" \
              -d '{"title": "AutifyResult", "text": "https://app.autify.com/projects/'${AUTIFY_PROJECT_ID}'/results/'${test_plan_result_id}'"}' \
              <Webhook URL> \
            )
```

**トリガーを指定する**

ソースコードがGitHubのmainブランチへマージされたタイミングで実行するために、トリガーを指定します。

```yaml:.circleci/config.yml
workflows:
  version: 2
  commit-workflow:
    jobs:
      - publish-to-production:
          filters:
            branches:
              only: main
```

## 4. 雑感

やっていることは単純なのですが、Windowsでcurlコマンドを試しづらいことや、AutifyのAPI一覧からAPIを実行できないところに一番時間がかかりました…。

## 5. 参考
- [jqコマンドでjsonから必要なデータのみを取得する - Qiita](https://qiita.com/buntafujikawa/items/a769ebabbdd324ff0d6f)
- [bashでJSONに変数を埋め込むための3つの方法 | DevelopersIO](https://dev.classmethod.jp/articles/how-to-inject-variable-to-json-on-bash/)
- [いまさらだけどCircleCIに入門したので分かりやすくまとめてみた - Qiita](https://qiita.com/gold-kou/items/4c7e62434af455e977c2)
- [API連携 – Autify for Web Help Center](https://autify.zendesk.com/hc/ja/articles/900001637126-API%E9%80%A3%E6%90%BA)