Jiraは、Atlassian社が提供するプロジェクト管理・課題管理ツールです。
ソフトウェア開発におけるバグ管理やタスク管理、進捗管理などに広く利用されています。
MagicPodでは、GitHub ActionsなどのCIツール、およびJiraのREST APIと連携して、定期実行(一括実行)でテストが失敗した場合に、その内容を自動的にJiraの課題(チケット)として作成することが可能です。
本ページではその方法をご紹介します。
(今回の方法では、GitHub Actionsと連携する方法をご紹介します。GitHub Actionsとの連携が初めての方は、事前にこちらのページ(GitHub Actionsとの連携)をご参照ください。)
事前準備
GitHubにて、「対象リポジトリ」→「Settings」→「Secrets and variables (Actions)」→「Repository secrets」に以下内容を登録します。
- MAGICPOD_API_TOKEN
- JIRA_URL
- JIRA_EMAIL
- JIRA_API_TOKEN
- JIRA_PROJECT_KEY
「Repository secrets」それぞれの値の取得方法
-
MAGICPOD_API_TOKEN
MagicPodにログインし、こちらのページでAPIトークンをコピーしてください。
-
JIRA_URL
Jiraにログインし、ブラウザのアドレスバーを確認します。表示されているURLのうち、以下の部分をコピーしてください。
https://<your_site_name>.atlassian.net
<your_site_name>の部分には、Jira(Atlassian Cloud)を初めて作成した際に設定した「サイト名(サブドメイン)」 が入ります。
-
JIRA_EMAIL
JiraにログインしているAtlassianアカウントのメールアドレスを入力してください。
Jira上で、右上のプロフィールアイコンをクリックすると表示されます。
-
JIRA_API_TOKEN
Jiraにログインした状態で、こちらにアクセスし、APIトークンを作成してください。
または「アカウント設定」>「セキュリティ」>「APIトークンの作成と管理」からも上記リンクと同じ画面に遷移できます。
-
JIRA_PROJECT_KEY
Jiraプロジェクトキーとは、各プロジェクトに割り当てられている一意の識別子(英大文字の文字列)です。課題(チケット)を作成すると、チケットの左下に表示されます。
以下画像の場合、プロジェクトキーは「KAN」となります。
GitHub Actions における設定ファイル例
以下には、ブラウザテストの場合における設定ファイルの一例を記載します。モバイルアプリテスト用の設定ファイルを作成されたい場合は、GitHub Actionsとの連携のヘルプページを参考に適宜変更してください。
シェルスクリプトの作成例
SHファイルでは、jq コマンドを使用しているため、あらかじめお使いのCI環境でjq コマンドが使用可能であることをご確認ください。(macos-latestでは標準搭載ですが、Linux環境では別途インストールが必要な場合があります。)
SHファイル (run_magicpod_batch_with_jira_on_failure.sh)
#!/bin/bash -e
# -e オプションで、コマンドがエラーになった行で処理を終了させる
# ただし、MagicPodの一括実行はテスト失敗時に非ゼロの終了コードを返すため、
# その箇所のみ set +e で一時的にエラー終了を無効化し、終了コードを手動で処理する
OS=mac # OSを指定、WindowsやLinuxの場合は要変更
FILENAME=magicpod-api-client # 任意のファイル名
curl -L "https://app.magicpod.com/api/v1.0/magicpod-clients/api/${OS}/latest/" -H "Authorization: Token ${MAGICPOD_API_TOKEN}" --output ${FILENAME}.zip
unzip -q ${FILENAME}.zip
# MagicPodで使う各種環境変数を設定
export MAGICPOD_ORGANIZATION=<MagicPod組織名>
export MAGICPOD_PROJECT=<MagicPodプロジェクト名>
# 一括実行設定番号を指定し、magicpod-api-client経由でテストを一括実行
set +e # テスト失敗時も終了コードを取得するため、一時的にエラー終了を無効化
TEST_SETTING_NUMBER=<一括実行設定番号>
./magicpod-api-client batch-run -S ${TEST_SETTING_NUMBER}
EXIT_CODE=$?
set -e # エラー終了を再度有効化
echo ""
echo "=== テスト結果 ==="
# テストが成功した場合はプロセスを終了、失敗した場合はJiraにチケットを作成
if [ ${EXIT_CODE} -ne 0 ]; then
echo "テストが成功しなかったため、Jira Issueを作成します。 (exit code: ${EXIT_CODE})"
echo ""
echo "=== 失敗したテストのJira Issue作成 ==="
# 最新の一括実行番号を取得
LATEST_BATCH_RUN_INFO=$(curl -s -X GET \
"https://app.magicpod.com/api/v1.0/${MAGICPOD_ORGANIZATION}/${MAGICPOD_PROJECT}/batch-runs/?count=1&max_batch_run_number=50000" \
-H "accept: application/json" \
-H "Authorization: Token ${MAGICPOD_API_TOKEN}")
LATEST_BATCH_RUN_NUMBER=$(echo "${LATEST_BATCH_RUN_INFO}" | jq -r '.batch_runs[0].batch_run_number // empty')
if [ -z "${LATEST_BATCH_RUN_NUMBER}" ]; then
echo "エラー: 一括実行番号を取得できませんでした"
exit 1
fi
echo "一括実行番号: ${LATEST_BATCH_RUN_NUMBER}"
# 一括実行番号に対応する実行結果の詳細を取得
BATCH_RUN_DETAILS=$(curl -s -X GET \
"https://app.magicpod.com/api/v1.0/${MAGICPOD_ORGANIZATION}/${MAGICPOD_PROJECT}/batch-run/${LATEST_BATCH_RUN_NUMBER}/" \
-H "accept: application/json" \
-H "Authorization: Token ${MAGICPOD_API_TOKEN}")
# 失敗したテストケース番号を取得
FAILED_TESTS=$(echo "${BATCH_RUN_DETAILS}" | jq -r '
.test_cases.details[].results[] |
select(.status == "failed" or .status == "unresolved") |
.test_case.number
' | sort -u)
if [ -z "${FAILED_TESTS}" ]; then
echo "失敗したテストが見つかりませんでした"
exit 0
fi
echo "=== 失敗テスト検出 ==="
# 失敗した各テストに対してJira REST API経由でJira Issueを作成
for TEST_NUM in ${FAILED_TESTS}; do
echo "テストケース #${TEST_NUM} のIssue作成中..."
RESULT_URL="https://app.magicpod.com/${MAGICPOD_ORGANIZATION}/${MAGICPOD_PROJECT}/batch-run/${LATEST_BATCH_RUN_NUMBER}/"
set +e # 一時的にエラー終了を無効化
JIRA_RESPONSE=$(curl -s -L -w "\n%{http_code}" -X POST "${JIRA_URL}/rest/api/3/issue" \
-u "${JIRA_EMAIL}:${JIRA_API_TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"fields\": {
\"project\": {\"key\": \"${JIRA_PROJECT_KEY}\"},
\"summary\": \"[MagicPod] テスト失敗: #${TEST_NUM}\",
\"description\": {
\"type\": \"doc\",
\"version\": 1,
\"content\": [
{
\"type\": \"paragraph\",
\"content\": [
{
\"type\": \"text\",
\"text\": \"一括実行 #${LATEST_BATCH_RUN_NUMBER} におけるテストケース #${TEST_NUM} が失敗しました。\"
}
]
},
{
\"type\": \"paragraph\",
\"content\": [
{
\"type\": \"text\",
\"text\": \"結果URL: \",
\"marks\": [{\"type\": \"strong\"}]
},
{
\"type\": \"text\",
\"text\": \"${RESULT_URL}\",
\"marks\": [{
\"type\": \"link\",
\"attrs\": {\"href\": \"${RESULT_URL}\"}
}]
}
]
}
]
},
\"issuetype\": {\"name\": \"タスク\"},
\"labels\": [\"magicpod\", \"test-failure\"]
}
}")
set -e # エラー終了を再度有効化
HTTP_CODE=$(echo "${JIRA_RESPONSE}" | tail -n1)
RESPONSE_BODY=$(echo "${JIRA_RESPONSE}" | sed '$d')
if [ "${HTTP_CODE}" = "201" ]; then
ISSUE_KEY=$(echo "${RESPONSE_BODY}" | jq -r '.key // empty')
echo "✓ Issue作成成功: ${ISSUE_KEY}"
else
echo "✗ Issue作成失敗 (HTTP ${HTTP_CODE})"
fi
done
echo ""
echo "=== 完了 ==="
echo "Jira Issueを作成しました。"
exit 0
else
echo "✓ テストは成功しました。"
exit 0
fi
実行設定ファイル(YMLファイル)の作成例
YMLファイル
# Pushした時にこのワークフローを実行する
on: [push]
# 手動実行する場合は、上の「on: [push]」をコメントアウトし、
# 下の「on: workflow_dispatch」のコメントを外してください
# on: workflow_dispatch
jobs:
# job名(任意のjob名)
magic_pod_job:
# virtual machineの形式を指定
runs-on: macos-latest # 今回はmacを指定
# job内のステップ
steps:
# ステップ1(チェックアウト)
- name: Checkout
uses: actions/checkout@v3 # actionsのバージョンは最新を指定
# ステップ2(MagicPodで一括実行後、失敗したテストがある場合はJiraに課題を作成)
- name: Batch run test (create Jira issue if failed)
# Repository secretsに登録した値を参照
env:
MAGICPOD_API_TOKEN: ${{ secrets.MAGICPOD_API_TOKEN }}
JIRA_URL: ${{ secrets.JIRA_URL }}
JIRA_EMAIL: ${{ secrets.JIRA_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
JIRA_PROJECT_KEY: ${{ secrets.JIRA_PROJECT_KEY }}
# 作成したシェルスクリプトのファイル名を指定
run: |
bash run_magicpod_batch_with_jira_on_failure.sh
上記設定ファイル例を実行することで、以下の内容を含んだ課題(チケット)を作成することが可能です。
- 失敗したテスト結果画面へ遷移できるURLを記載
- 課題タイプを「タスク」に指定
- ラベルに「magicpod」「test-failure」を追加
上記設定例で指定している課題タイプやラベルの他に、優先度、担当者なども指定することが可能です。
# 優先度を指定する場合
\"priority\": {\"name\": \"High\"}
# 担当者を指定する場合
\"assignee\": {\"id\": \"<account_id>\"}その他詳細な設定につきましては、Jira REST APIの公式ドキュメントをご参照ください。