
Jira Service Managementのサンドボックス環境と本番環境の自動化ルールのチェックツールを作成してみた
たかやまです。
業務でJira Service Management(JSM)の自動化ルールを使ってアラート対応を自動化しています。
現在の環境ではJSMのサンドボックス環境で自動化ルールを検証してから本番に手動で反映する運用をしています。ただ、ルールの数が増えてくると「サンドボックスで変更したけど本番に反映し忘れた」「本番だけ直接修正してサンドボックスと乖離した」といったことが起きがちでした。
現時点(2026/03)ではAtlassian公式にサンドボックスの変更を本番環境にプロモーションする機能はクローズドベータとして検証されているものの、一般公開としてはまだ利用できない状態です。
Atlassianコミュニティでも同様の質問が寄せられていますが、現状は「手動で1つずつ確認する」が回答のようです。
とはいえ、手動で確認するのは正直しんどいのでAPI上で自動化ルールを参照する機能はありそうだったので、CLIツール jsm-compare を作ってみました。
今回はこのツールの紹介をしたいと思います。
クイックスタート
すぐ試したい方は以下のコマンドで実行できます。
前提条件
- Python 3.10以上の環境
- Jira管理者権限を持つユーザーのトークン
# 環境変数で認証情報を設定
export JIRA_USER="your-email@example.com"
export JIRA_API_TOKEN="ATATT3x..."
# uvxで即実行(インストール不要)
uvx jsm-compare rules --domain your-domain
--domain your-domain を指定すると、your-domain-sandbox.atlassian.net(ソース)と your-domain.atlassian.net(ターゲット)が自動展開されます。
jsm-compareの概要
jsm-compareは、2つのJira Cloud環境の自動化ルールを比較するPython製CLIツールです。
内部ではAtlassian公式の Automation REST API を使用しています。
オプション
一部オプションを紹介します。
--filter オプションを使うとルール名の前方一致でフィルタリングできます。
jsm-compare rules --domain your-domain --filter '[MyProject]'
--mask オプションを使うと、Webhook URLやAPIキーなどのセンシティブ値を ***MASKED*** に置換して表示します。
チームでの共有やログ保存時に活用できます。
jsm-compare rules --domain your-domain --section components --mask
--ignore-env(デフォルト有効)は、カスタムフィールドID(customfield_NNNNN → customfield_*)やAtlassian URL、workspaceId、schemaIdなど環境固有の値を自動的に正規化します。
環境間で必ず異なる値によるノイズを除去して、コアロジックの設定差分だけを検出できます。
無効にする場合は --no-ignore-env を指定します。
# 環境固有の値の正規化を無効にする(全差分を表示)
jsm-compare rules --domain your-domain --no-ignore-env
ほかオプションについては以下のドキュメントを参照してください。
セクション指定
--section オプションで特定のセクションだけ比較できます。
# ルール名と状態のみ確認(API呼び出し最小)
jsm-compare rules --domain your-domain --section rules-overview
# トリガー定義のみ比較
jsm-compare rules --domain your-domain --section triggers
# 条件・アクションのみ比較
jsm-compare rules --domain your-domain --section components
各セクションの比較対象は以下のとおりです。
| セクション | 比較内容 | API呼び出し |
|---|---|---|
rules-overview |
ルール名、state(ENABLED/DISABLED)、description | サマリーAPIのみ |
triggers |
トリガーtype、スケジュール設定、JQL条件 | 各ルールの詳細APIを取得 |
components |
条件・アクション設定(If/Then/Else構造) | 各ルールの詳細APIを取得 |
やってみる
事前準備
Jira Cloud APIトークンが必要です。APIトークンの取得にはJira管理者権限が必要です。
トークン取得は以下のブログを参考に取得してください。
取得したトークンを環境変数で設定します。
export JIRA_USER="your-email@example.com"
export JIRA_API_TOKEN="ATATT3x..."
uvxを使えばインストール不要で即実行できます。
uvx jsm-compare rules --domain your-domain
グローバルインストールする場合は uv tool install jsm-compare または pip install jsm-compare でインストールできます。
基本的な比較
--domain オプションにドメインプレフィックスを指定して実行します。
jsm-compare rules --domain your-domain
--domain your-domain は内部で以下のように展開されます。
- ソース(サンドボックス):
your-domain-sandbox.atlassian.net - ターゲット(本番):
your-domain.atlassian.net
カスタムホスト名の場合は --source と --target で直接指定できます。
jsm-compare rules \
--source my-sandbox.atlassian.net \
--target my-prod.atlassian.net
実行すると、以下のような出力が得られます。
JSM Automation Rules Comparison
Source: your-domain-sandbox.atlassian.net
Target: your-domain.atlassian.net
Ignore env-specific: ON (customfield IDs, domain URLs, workspaceId, schemaId)
────────────────── Section 1: Rules Overview ──────────────────
[INFO] Only in source:
[MyProject]テストルール 20260324 [DISABLED]
[MATCH] [MyProject]インシデント回復通知 20260401
[MATCH] [MyProject]顧客コメント通知 20260401
[DIFF] [MyProject]インシデント起票ルール 20260330
description: "Webhook通知先: 管理者A" -> "Webhook通知先: 管理者B"
────────────────── Section 2: Triggers ─────────────────────
All 2 triggers match.
────────────────── Section 3: Components ───────────────────
[MATCH] [MyProject]インシデント回復通知 20260401
[DIFF] [MyProject]インシデント起票ルール 20260330
children[0].value.operations[1].value: "通知先チャンネルA" -> "通知先チャンネルB"
Summary: 4 match, 2 diff, 1 source-only
Differences found.
出力の見方は以下のとおりです。
| タグ | 意味 |
|---|---|
[MATCH] |
ソースとターゲットで一致 |
[DIFF] |
差分あり。コンパクト形式(path: old -> new)で差分内容を表示 |
[INFO] |
片方の環境にのみ存在するルール |
他にもオプションがありますので、以下のドキュメントを参照してください。
最後に
JSMの自動化ルールをサンドボックスと本番環境で比較するCLIツール jsm-compare を作成しました。
自動化ルールの設定ドリフトは、ルール数が増えるほど発生しやすくなります。
定期的にこのツールで差分チェックすることで、反映漏れや意図しない乖離を早期に検出できます。
JSMの自動化ルールを複数環境で運用している方の参考になれば幸いです。
また、スペースでも同様の差分管理の課題があるので、こちらのツールを今後対応させていきたいと思います。
以上、たかやま(@nyan_kotaroo)でした。








