atlassian-cli はコミュニティによる独立したオープンソースプロジェクトです。Atlassian と提携・関連しておらず、Atlassian による承認、推奨、後援のいずれも受けておらず、Atlassian が提供する公式 CLI(acli)でもありません。製品名は互換性を示す目的でのみ使用しています。

CLI から見た Confluence 自動化

Confluence の自動化とは、Confluence の Web UI で繰り返し行っている作業、たとえばステータスページの更新、ドキュメントへのタグ付け、古いコンテンツのアーカイブ、レポートの作成を、人がクリックしなくても動くスクリプトに置き換えることです。その舞台はコマンドラインです。atlassian-cli を使えば、ひとつのバイナリから Confluence を操作できます。単なるバイナリなので、cron や systemd タイマー、CI ジョブ、git フックにそのまま組み込めます。

この記事では自動化に関わる作業に絞って解説します。定期更新、多数のページにまたがる一括操作、そしてデータからのレポートページ生成です。Jira の課題を Confluence のページに反映したい場合は、Jira から Confluence への同期で別のワークフローとして解説しています。あとから復元できるスペース全体のアーカイブが目的であれば、Confluence スペースのエクスポートとバックアップをご覧ください。ここでは、公開中のコンテンツを最新かつ整理された状態に保つことに集中します。

atlassian-cli はコミュニティによる独立したオープンソースプロジェクトです。Atlassian と提携・関連しておらず、Atlassian による承認、推奨、後援、保守のいずれも受けておらず、Atlassian が提供する公式 CLI(acli)でもありません。ベンダーによる公式サポートが必要であれば acli を使ってください。Jira、Confluence、Bitbucket、JSM を横断し、どの製品でも同じフラグで扱える無料の単一 Rust バイナリが欲しい場合は atlassian-cli を使ってください。

よくある Confluence の作業と、それを自動化するコマンドの対応表です。以下のコマンドはすべてコマンドリファレンスと照合済みです。

作業コマンド
ページの内容を更新するconfluence page update <id> --body report.html
多数のページにまとめてタグを付けるconfluence bulk add-labels --cql "..." --labels a,b
古くなったページを探すconfluence search cql "lastmodified < now('-180d')"
古いページを削除するconfluence bulk delete --cql "..." --dry-run
レポート用にページのデータを取得するconfluence bulk export --cql "..." --output data.json
ページの閲覧数を確認するconfluence analytics page-views <id> --from 2026-01-01

cron によるページの定期更新

atlassian-cli にスケジューラーは同梱されていませんし、その必要もありません。Unix にはすでに優れたスケジューラーがそろっています。Confluence のページを定期更新する仕組みは 3 つの部品でできています。ページ本文を HTML ファイルとして組み立てるスクリプト、それを公開する confluence page update コマンド、そしてスクリプトを一定間隔で実行する cron の設定です。

重要なのは、--body が受け取るのはインラインの文字列ではなくファイルパスだという点です。ファイルには Confluence のストレージ形式 HTML を入れます(<p><table><h2> のような通常のタグはそのまま使えます)。更新のステップは次のようになります。

# Publish new content to an existing page from a file
atlassian-cli confluence page update 12345 \
  --title "Team Status (auto-updated)" \
  --body ./status.html \
  --profile prod

更新のたびに新しいページバージョンが作成されるため、編集履歴はそのまま残り、想定外の結果になった場合は Confluence の UI からロールバックできます。ファイルを先に生成するには、必要なデータを取得して HTML をディスクに書き出します。ヒアドキュメントを使った最小限のビルダーは次のとおりです。

# build-status.sh -- regenerate the status page body
open_count=$(atlassian-cli jira issue search \
  --jql "project = DEV AND status != Done" \
  --format json --profile prod | jq '. | length')

cat > ./status.html <<HTML
<h2>Engineering status</h2>
<p>Open issues in DEV: <strong>${open_count}</strong></p>
<p>Last refreshed: $(date -u +"%Y-%m-%d %H:%M UTC")</p>
HTML

atlassian-cli confluence page update 12345 --body ./status.html --profile prod

あとはスケジュールを設定するだけです。平日の 06:00 にページを更新する crontab の行は次のようになります。

# crontab -e
0 6 * * 1-5  /home/ops/build-status.sh >> /var/log/confluence-status.log 2>&1

仕掛けはこれだけです。誰かが仕事を始める前にページが自動で更新され、ログファイルが監査証跡になります。cron のないサーバーでは、systemd タイマーやスケジュール実行の CI パイプラインでまったく同じスクリプトを動かせます。スクリプトは冪等に保ってください。同じデータからは何度実行しても同じページができるようにしておけば、実行が漏れても二重に走っても結果が壊れることはありません。set -euo pipefail の行も重要です。クエリが失敗した時点で実行が止まるため、中途半端なページを公開せずに済みます。

自動更新されるレポートページを作る

本文を固定のテキストではなく実データから組み立てた瞬間に、定期更新はレポートになります。手順はいつも同じです。--format json で取得し、JSON を HTML に整形し、公開します。atlassian-cli のすべてのコマンドが同じ --format フラグを解釈するため、データ源は Jira でも Bitbucket でも JSM でも、Confluence 自身でもかまいません。

たとえば、スペース内のページ数と、しばらく更新されていないページを示す週次のドキュメント健全性ページを作りたいとします。CQL 検索で件数を取得し、そのままページに流し込みます。

# Count pages in the space and stale ones separately
total=$(atlassian-cli confluence search cql \
  "space = DOCS AND type = page" --format json | jq '. | length')

stale=$(atlassian-cli confluence search cql \
  "space = DOCS AND type = page AND lastmodified < now('-180d')" \
  --format json | jq '. | length')

cat > ./docs-health.html <<HTML
<h2>Docs health report</h2>
<table>
  <tr><th>Metric</th><th>Value</th></tr>
  <tr><td>Total pages</td><td>${total}</td></tr>
  <tr><td>Stale (>180 days)</td><td>${stale}</td></tr>
</table>
HTML

atlassian-cli confluence page update 45678 --body ./docs-health.html --profile prod

レポートの元データには confluence bulk export が便利です。一致するすべてのページを 1 回の呼び出しで JSON または CSV に出力し、ページネーションも処理してくれます。

# Export a space to CSV for a spreadsheet pivot
atlassian-cli confluence bulk export \
  --cql "space = DOCS AND type = page" \
  --output docs-inventory.csv \
  --format csv

この CSV は、Confluence の表よりピボットテーブルを好む関係者がいれば、そのままスプレッドシートで開けます。ここでのエクスポートはレポートの入力です。あとから復元できる恒久的なアーカイブが必要な場合は、スペースのバックアップガイドで解説しています。すぐ使えるレポート用スクリプトは、スペースレポートのランブックに引数解析まで含めた本番版があります。

ラベルの一括付与と分類体系

大規模な Confluence インスタンスを検索可能に保つのはラベルですが、1 ページずつ付けていくのは骨が折れます。confluence bulk add-labels コマンドは、CQL クエリに一致するすべてのページに一度でタグを付けます。ほかの更新系コマンドと同じく、実行前に --dry-run で確認してください。

# Preview which pages would be labeled
atlassian-cli confluence bulk add-labels \
  --cql "space = DOCS AND type = page" \
  --labels reviewed,2026-q3 \
  --dry-run

# Apply for real once the match list looks right
atlassian-cli confluence bulk add-labels \
  --cql "space = DOCS AND type = page" \
  --labels reviewed,2026-q3

--labels フラグはカンマ区切りなので、複数のラベルを一度に付けられます。タグを付けたあとは、そのラベル自体が検索の手がかりになります。四半期レビューの対象を洗い出すのは検索 1 回で済みます。

atlassian-cli confluence search cql "label = reviewed AND label = '2026-q3'" --limit 50

すでに開いている単一のページには、page add-labelpage remove-label がページ ID とラベルを位置引数として受け取ります。

atlassian-cli confluence page add-label 12345 needs-review
atlassian-cli confluence page remove-label 12345 outdated

古いページを安全に整理する

古いページはたまり続け、誰も読まなくなったあとも検索結果を汚し続けます。整理の流れは、日付条件を入れた CQL クエリで対象を特定し、記録が必要ならアーカイブし、そのうえで削除する、というものです。いずれの場合も必ず先にプレビューします。CQL の lastmodified フィールドと now() 関数を組み合わせると、「N 日間更新されていない」という条件をきれいに表現できます。

# 1. See what qualifies as stale (read-only)
atlassian-cli confluence search cql \
  "space = OLD AND type = page AND lastmodified < now('-365d')" \
  --limit 100

# 2. Archive the same set to a file before deleting anything
atlassian-cli confluence bulk export \
  --cql "space = OLD AND type = page AND lastmodified < now('-365d')" \
  --output archive-before-delete.json --format json

# 3. Dry-run the delete to confirm the blast radius
atlassian-cli confluence bulk delete \
  --cql "space = OLD AND type = page AND lastmodified < now('-365d')" \
  --dry-run

# 4. Execute once you trust the list
atlassian-cli confluence bulk delete \
  --cql "space = OLD AND type = page AND lastmodified < now('-365d')"

--dry-run フラグは実際の削除とまったく同じ選択ロジックを実行し、削除の直前で止まるため、対象となるページを正確に確認できます。一括コマンドは --concurrency(既定値 4)も受け付けるので、レート制限のあるインスタンスで大きなバッチを抑えたいときに使えます。確認プロンプトとログ出力を備えたガードレール付きの完全版は、一括クリーンアップのランブックにあります。

分析で効果を測る

どのページが実際に読まれているかを示せると、自動化の効果を説明しやすくなります。confluence analytics コマンドはターミナルを離れずに閲覧数を取得できるため、閲覧数をそのままレポートページに組み込んだり、アーカイブ対象の判断材料にしたりできます。

# Views for one page since a start date
atlassian-cli confluence analytics page-views 12345 --from 2026-01-01

# Rolled-up stats for an entire space
atlassian-cli confluence analytics space-stats DOCS --format json

--format json を通せば、これらは先ほどのレポート生成の流れにそのまま入力できます。ページが自分の閲覧数を掲載することも、ドキュメント健全性レポートがアクセスの多い未レビューのページを目立たせることもできます。人気があり、かつ古いという組み合わせこそ、優先して手を入れる価値のあるコンテンツです。分析は自動化そのものの効果検証にも役立ちます。整理を実行したあと 1 週間の閲覧データを見れば、アーカイブしたページが本当に不要だったのか、まだ必要としていた人がいたのかがわかります。

夜間実行の自動化スクリプト

ここまでの要素をまとめた 1 本のスクリプトを示します。ステータスページを更新し、新しいドキュメントにタグを付け、整理をドライランし、インベントリをエクスポートします。cron に登録する実際の夜間ジョブは、このような形になります。

#!/bin/bash
# confluence-nightly.sh -- refresh, tag, audit
set -euo pipefail

PROFILE="prod"
SPACE="DOCS"

# 1. Rebuild and publish the status page
total=$(atlassian-cli confluence search cql \
  "space = $SPACE AND type = page" --format json --profile "$PROFILE" | jq '. | length')
printf '<h2>Docs status</h2><p>Pages: %s</p><p>Updated: %s</p>' \
  "$total" "$(date -u +%F)" > ./status.html
atlassian-cli confluence page update 45678 --body ./status.html --profile "$PROFILE"

# 2. Tag anything created in the last day for review
atlassian-cli confluence bulk add-labels --profile "$PROFILE" \
  --cql "space = $SPACE AND created >= now('-1d')" \
  --labels new,needs-review

# 3. Preview stale pages (never auto-delete unattended)
atlassian-cli confluence bulk delete --profile "$PROFILE" \
  --cql "space = $SPACE AND lastmodified < now('-365d')" \
  --dry-run

# 4. Snapshot the inventory for the record
atlassian-cli confluence bulk export --profile "$PROFILE" \
  --cql "space = $SPACE AND type = page" \
  --output "inventory-$(date -u +%F).json" --format json

echo "Nightly Confluence run complete."

手順 3 を意図的にドライランのままにしている点に注目してください。公開とタグ付けは無人で実行しても安全ですが、削除はレビューを挟むべき操作です。夜間ジョブがログに候補を出しておけば、担当者が業務時間中に本当の整理を承認できます。

atlassian-cli を試す

Jira、Confluence、Bitbucket、JSM に対応した MIT ライセンスの無料バイナリがひとつ。インストールすれば、数分で最初の Confluence ジョブをスクリプト化できます。

atlassian-cli をインストール

よくある質問

コマンドラインから Confluence のページ更新をスケジュール実行できますか?

atlassian-cli にスケジューラーは内蔵されていませんが、単一のバイナリなので cron、systemd タイマー、CI のいずれでも問題なく動作します。ページ本文を HTML ファイルとして生成し直すスクリプトを書き、atlassian-cli confluence page update <id> --body report.html を実行して公開します。そのスクリプトを cron に登録すれば(たとえば毎週月曜 06:00 なら 0 6 * * 1)、ページは自動的に更新されます。

Confluence のページにラベルを一括で追加するにはどうすればよいですか?

atlassian-cli confluence bulk add-labels に CQL クエリとカンマ区切りのラベル一覧を渡します。たとえば atlassian-cli confluence bulk add-labels --cql "space = DOCS AND type = page" --labels reviewed,2026-q3 --dry-run のように指定します。まず --dry-run を付けて一致するページを確認し、フラグを外して適用します。ラベルは検索しやすい Confluence の分類体系を支える基盤です。

古い Confluence のページを安全に一括削除する方法はありますか?

はい。lastmodified で絞り込んだ CQL クエリでページを選び、削除する前に必ず --dry-run で内容を確認します。たとえば atlassian-cli confluence bulk delete --cql "space = OLD AND lastmodified < now('-365d')" --dry-run は、何も削除せずに一致したページを一覧表示します。一覧を確認したうえで、--dry-run を外して再実行します。アーカイブが必要な場合は、先に同じクエリでエクスポートしておきます。

atlassian-cli で Confluence のレポートページを自動生成できますか?

はい。任意の atlassian-cli コマンドを --format json で実行してデータを取得し、スクリプトや jq で Confluence のストレージ形式 HTML に変換してファイルに書き出し、atlassian-cli confluence page update <id> --body report.html で公開します。全体をスケジュール実行するスクリプトにまとめれば、Web UI に触れることなく自動更新されるダッシュボードページが手に入ります。

関連リソース