0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Actions × Tosca Cloud × Slack で E2E テスト結果を自動通知する

0
Last updated at Posted at 2026-05-27

はじめに

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(後述)

image.png


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"
  }
}

テストスイートの決定ロジック:

  1. workflow_dispatch で手動指定された場合 → 指定スイートを使用
  2. PR に test:スイート名 ラベルがあればそれを使用
  3. 変更ファイルのパターンに一致するスイートを使用
  4. いずれも該当しなければ default_suite を使用

Step 3: Slack Workflow Builder の設定

3-1. ワークフローの作成

  1. Slack の Workflow Builder を開く
  2. 「ワークフローを作成」 をクリック
  3. 開始方法として 「Webhookから開始」 を選択
  4. 以下の変数(キー名)を定義する
変数名(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 の「変数を挿入」で選択します。

image.png

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の例

image.png

受信する 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

image.png


Tips

Slack Workflow Builder の変数 ID について

Workflow Builder の「Webhookから開始」で変数を定義すると、Slack は内部的に Ft09S7SMNA85__XXXXXXXXXXXXXXXXXXXXXXXX のような不透明な ID を生成します。
ワークフローの設定画面ではわかりやすい変数名(repo, actor など)が表示されますが、ワークフローのエクスポートファイルにはこの内部 ID が記録されています。

ワークフローを再作成すると ID が変わるため、必ずエクスポートでバックアップを取ってください。

Tosca Cloud の実行は非同期

POST /playlistRuns を叩いただけではテストは完了しません。
staterunningrunning 以外に変化するまでポーリングが必要です。
タイムアウトはテストスイートの想定実行時間に合わせて 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.numberpull_request イベント以外では空になります。
workflow_dispatch での手動実行時は空文字になるため、|| '' でフォールバックしています。


まとめ

コンポーネント 役割
GitHub Actions テストのトリガー、Tosca API 呼び出し、結果集約
Tosca Cloud API E2E テストの実行・結果取得(JUnit 形式)
Okta OAuth Tosca Cloud への認証トークン発行
Slack Workflow Builder 通知メッセージのフォーマット管理・配信

この構成により、PR 作成のたびに自動で E2E テストが実行され、結果が Slack に届くようになります。
テストスイートの切り替えも PR ラベルや変更ファイルに基づいて自動化できるため、メンテナンスコストも低く抑えられます。


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?