はじめに
CI/CD パイプラインに E2E テストを組み込む際、「テストが終わったかどうか」をいちいち確認しに行くのはひと手間かかり面倒です。
本記事では、過去に質問のあったGitHub Actions から Tosca Cloud の API を叩いてテストを実行し、結果を Slack に自動通知する構成を紹介します。
対象読者:
- Tosca Cloud を使っている QA / DevOps エンジニア
- GitHub Actions で CI/CD を構築している方
全体構成
GitHub Actions
├─► Tosca Cloud API ← テスト実行・結果取得
└─► Slack Workflow Builder Webhook ← 結果通知
Slack への通知は Incoming Webhook ではなく Workflow Builder の「Webhookから開始」 を使用しています。
前提条件
| 項目 | 内容 |
|---|---|
| Tosca Cloud | 有効なユーザー権限、Playlist(実行リスト)作成済み |
| 認証 | Okta による OAuth 2.0 (Client Credentials) |
| GitHub | Actions 有効、Secrets 設定済み |
| Slack | Workflow Builder が使えるプラン |
Step 1: GitHub Secrets の設定
GitHub リポジトリの Settings > Secrets and variables > Actions に以下を登録します。
| Secret 名 | 内容 |
|---|---|
OKTA_DOMAIN |
Okta テナントの URL(例: https://your-org.okta.com) |
OKTA_CLIENT_ID |
Okta アプリのクライアント ID |
OKTA_CLIENT_SECRET |
Okta アプリのクライアントシークレット |
OKTA_SCOPE |
スコープ(例: tta) |
TOSCA_CLOUD_TENANT |
Tosca Cloud テナント URL (例: https://your-org.my.tricentis.com) |
WORKSPACE_ID |
Tosca Cloud のワークスペース ID |
SLACK_WORKFLOW_WEBHOOK_URL |
Slack Workflow Builder の Webhook URL(後述) |
Step 2: テスト設定ファイルの作成
.github/test-config.json にテストスイートの設定を記述します。
PR ラベルやファイル変更に応じて、実行する Playlist を切り替えられます。
{
"default_suite": "Sample",
"test_suites": {
"Sample": {
"playlist_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"timeout": 900
},
"demo-cloud-agent": {
"playlist_id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"timeout": 600
}
},
"file_triggers": {
"src/checkout": "demo-cloud-agent",
"src/sample": "Sample"
}
}
テストスイートの決定ロジック:
-
workflow_dispatchで手動指定された場合 → 指定スイートを使用 - PR に
test:スイート名ラベルがあればそれを使用 - 変更ファイルのパターンに一致するスイートを使用
- いずれも該当しなければ
default_suiteを使用
Step 3: Slack Workflow Builder の設定
3-1. ワークフローの作成
- Slack の Workflow Builder を開く
- 「ワークフローを作成」 をクリック
- 開始方法として 「Webhookから開始」 を選択
- 以下の変数(キー名)を定義する
| 変数名(JSONキー) | 表示ラベル |
|---|---|
repo |
リポジトリ |
pr_number |
PR番号 |
actor |
実行者 |
job_status |
ジョブステータス |
playlist_state |
Tosca実行ステータス |
tests |
テスト数 |
failures |
失敗数 |
errors |
エラー数 |
run_url |
詳細URL |
⚠️ 重要: Slack は各変数に対して内部 ID(例:
Ft09S7SMNA85__89bb6900...)を自動生成します。
この ID はワークフローを作り直すと変わるため、Webhook URL と変数マッピングは別途メモしておいてください。
3-2. メッセージステップの設定
「次に、これらのことを行う」に 「メッセージを送信」 ステップを追加し、以下のようなメッセージを構成します。
*Tosca Cloud E2E 結果*
リポジトリ: {{repo}}
PR: {{pr_number}}
実行者: {{actor}}
ジョブステータス: {{job_status}}
Tosca実行ステータス: {{playlist_state}}
テスト数: {{tests}}
失敗: {{failures}}
エラー: {{errors}}
詳細: {{run_url}}
各 {{変数名}} の部分は、Workflow Builder の「変数を挿入」で選択します。
3-3. Webhook URL の取得
ワークフローを公開すると Webhook URL が発行されます。
この URL を GitHub Secrets の SLACK_WORKFLOW_WEBHOOK_URL に登録します。
全変数を定義してワークフローを**公開(Publish)**すると、はじめて Webhook URL が発行されます。
変数を定義しただけでは Slack はデータ型を確定できていません。実際に JSON を POST してはじめて変数が「アクティブ」になります。
curl -X POST "https://hooks.slack.com/triggers/xxx/yyy/zzz" \
-H "Content-Type: application/json" \
-d '{
"repo": "your-org/your-repo",
"pr_number": "42",
"actor": "your-name",
"job_status": "success",
"playlist_state": "succeeded",
"tests": "15",
"failures": "0",
"errors": "0",
"run_url": "https://github.com/..."
}'
メッセージステップの「変数を挿入」に各変数が選択肢として現れるようになります。
Step 4: GitHub Actions ワークフローの作成
.github/workflows/<your_pipeline_name>.yml を作成します。
トリガーの設定
on:
pull_request:
branches: [main, develop]
workflow_dispatch:
inputs:
test_suite:
description: '実行するテストスイート'
required: false
default: 'auto'
type: choice
options:
- auto
- demo-cloud-agent
- Sample
pull_request で自動実行しつつ、workflow_dispatch で手動実行も可能にします。
Tosca Cloud API 連携のポイント
Tosca Cloud の Playlist 実行は非同期です。そのため以下のフローになります。
1. POST /playlistRuns ← 実行開始(run_id を取得)
2. GET /playlistRuns/{run_id} ← 状態をポーリング(15〜30秒間隔)
3. GET /playlistRuns/{run_id}/junit ← 完了後に JUnit 形式で結果取得
OAuth トークン取得(Okta):
resp = requests.post(
f"{okta_domain}/oauth2/default/v1/token",
auth=HTTPBasicAuth(client_id, client_secret),
data={"grant_type": "client_credentials", "scope": scope},
)
token = resp.json()["access_token"]
Playlist 実行開始:
run_resp = requests.post(
f"{tenant}/{workspace}/_playlists/api/v2/playlistRuns",
json={"playlistId": playlist_id, "private": False},
headers={"Authorization": f"Bearer {token}"},
)
run_id = run_resp.json()["id"]
結果のポーリング:
while time.time() < timeout_at:
info = requests.get(f"{playlist_url}/{run_id}", headers=headers).json()
state = info["state"]
if started and state != "running":
break
time.sleep(15 if not started else 30)
JUnit 結果のパース:
junit_resp = requests.get(f"{playlist_url}/{run_id}/junit", headers=headers)
root = ET.fromstring(junit_resp.text)
tests = int(root.attrib.get("tests", 0))
failures = int(root.attrib.get("failures", 0))
errors = int(root.attrib.get("errors", 0))
Slack Webhook への通知
slackapi/slack-github-action アクションを使い、webhook-type: webhook-trigger で
Workflow Builder の Webhook を呼び出します。
- name: Notify Slack workflow
if: always() # テスト失敗時も必ず通知
uses: slackapi/slack-github-action@v3.0.3
with:
webhook: ${{ secrets.SLACK_WORKFLOW_WEBHOOK_URL }}
webhook-type: webhook-trigger
payload: |
repo: "${{ github.repository }}"
pr_number: "${{ github.event.pull_request.number || '' }}"
actor: "${{ github.actor }}"
job_status: "${{ job.status }}"
playlist_state: "${{ steps.run-tosca.outputs.state }}"
tests: "${{ steps.run-tosca.outputs.tests }}"
failures: "${{ steps.run-tosca.outputs.failures }}"
errors: "${{ steps.run-tosca.outputs.errors }}"
run_url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
if: always()を付けることで、テストが失敗した場合でも Slack に通知が届きます。
JUnit レポートのアップロード
- name: Upload Tosca JUnit report
if: always()
uses: actions/upload-artifact@v7.0.1
with:
name: tosca-junit-report-${{ steps.run-tosca.outputs.test_suite }}
path: tosca-results.xml
Actions の Artifacts として JUnit レポートも保存しておくと、後から詳細を確認できます。
GithubActionsの例
受信する Slack 通知の例
Tosca Cloud E2E 結果
リポジトリ: your-org/your-repo
PR: 42
実行者: your-github-handle
ジョブステータス: failure
Tosca実行ステータス: failed
テスト数: 15
失敗: 2
エラー: 0
詳細: https://github.com/your-org/your-repo/actions/runs/123456789
Tips
Slack Workflow Builder の変数 ID について
Workflow Builder の「Webhookから開始」で変数を定義すると、Slack は内部的に Ft09S7SMNA85__XXXXXXXXXXXXXXXXXXXXXXXX のような不透明な ID を生成します。
ワークフローの設定画面ではわかりやすい変数名(repo, actor など)が表示されますが、ワークフローのエクスポートファイルにはこの内部 ID が記録されています。
→ ワークフローを再作成すると ID が変わるため、必ずエクスポートでバックアップを取ってください。
Tosca Cloud の実行は非同期
POST /playlistRuns を叩いただけではテストは完了しません。
state が running → running 以外に変化するまでポーリングが必要です。
タイムアウトはテストスイートの想定実行時間に合わせて timeout を設定してください。
webhook-type: webhook-trigger の指定を忘れずに
slackapi/slack-github-action はデフォルトでは通常の Incoming Webhook として動作します。
Workflow Builder の Webhook を使う場合は webhook-type: webhook-trigger を明示的に指定しないと動作しません。
PR 番号は pull_request イベント時のみ
github.event.pull_request.number は pull_request イベント以外では空になります。
workflow_dispatch での手動実行時は空文字になるため、|| '' でフォールバックしています。
まとめ
| コンポーネント | 役割 |
|---|---|
| GitHub Actions | テストのトリガー、Tosca API 呼び出し、結果集約 |
| Tosca Cloud API | E2E テストの実行・結果取得(JUnit 形式) |
| Okta OAuth | Tosca Cloud への認証トークン発行 |
| Slack Workflow Builder | 通知メッセージのフォーマット管理・配信 |
この構成により、PR 作成のたびに自動で E2E テストが実行され、結果が Slack に届くようになります。
テストスイートの切り替えも PR ラベルや変更ファイルに基づいて自動化できるため、メンテナンスコストも低く抑えられます。



