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

Bitbucket に空いた gh 型の穴

GitHub の gh を使ったことがあると、Bitbucket に移ったときに大きな喪失感があります。gh pr creategh pr listgh pr merge と打つのが体に染みついているのに、Bitbucket ではその反射が空振りします。開発者からよく挙がる要望は短く具体的で、gh のような Bitbucket CLI が欲しい、しかし期待どおりに動くものが見つからない、というものです。

結論から言うと、gh を 1 対 1 で再現する Atlassian 提供のコマンドはありませんが、atlassian-cli を使えば同じ gh 風のワークフローを今すぐ実現できます。MIT ライセンスの独立した Rust バイナリで、Bitbucket Cloud の REST API と通信するため、プルリクエストの一覧表示、作成、レビュー、マージがすべてターミナルから行えます。ブラウザのタブを開く必要は一切ありません。この記事では、すでに慣れている gh prgh repo の各コマンドを atlassian-cli の対応するコマンドに対応づけ、手になじむようにエイリアスを設定する方法を紹介します。

acli との違い

atlassian-cli はコミュニティによる独立したオープンソースプロジェクトです。Atlassian と提携・関連しておらず、Atlassian による承認、推奨、後援、保守のいずれも受けていません。Atlassian が提供する公式 CLI(acli)ではありません。ベンダーによる一次サポートが必要な場合は公式の acli を使ってください。Jira、Confluence、Bitbucket、Jira Service Management を gh のような使い心地で 1 つの無料の Rust バイナリから扱いたい場合は atlassian-cli が向いています。

Bitbucket の CLI を検索すると両方のツールが出てくるため、この違いは重要です。Atlassian の acli はベンダーがサポートする選択肢で、正式なサポート保証が必要な場合はこちらが適しています。atlassian-cli は、gh の使い心地を気に入っていて、その操作感を Atlassian のスタック全体に 1 つのバイナリで広げたい人のためのコミュニティ製の選択肢です。この記事の残りは 2 つ目の道について書いています。

gh から atlassian-cli へのコマンド対応表

対応表は次のとおりです。どのコマンドも、atlassian-cli auth login で一度認証を済ませていることを前提としています(認証ガイドを参照)。bb エイリアスは bitbucket の組み込みの短縮形なので、atlassian-cli bb pr listatlassian-cli bitbucket pr list は同じ意味になります。

GitHub の gh atlassian-cli の対応コマンド
gh pr list bb pr list <repo> --state OPEN
gh pr view 123 bb pr get <repo> 123
gh pr create bb pr create <repo> --title ... --source ... --destination main
gh pr review --approve bb pr approve <repo> 123
gh pr comment bb pr comment <repo> 123 --text ...
gh pr merge 123 bb pr merge <repo> 123 --strategy merge_commit
gh repo list bb repo list
gh repo view bb repo get <repo>
gh repo create bb repo create <slug> --name ... --private

構造上の違いが 1 つあります。gh はローカルの git リモートからリポジトリを推測しますが、atlassian-cli は --workspace とリポジトリスラッグを明示的に求めます。これはスクリプトから扱いやすくするための意図的なトレードオフで、後述のエイリアスを使えば手で入力する場面はほとんどなくなります。

最初の gh 風 PR ワークフロー

定番の流れをたどってみます。ブランチを作り、プッシュし、PR を作成し、レビューを受けてマージするという流れです。ワークスペースは myteam、リポジトリスラッグは api-service とします。

プルリクエストを作成する

ブランチは通常どおり git でプッシュし、PR は CLI から作成します。これが gh pr create に直接対応します。

# Push your feature branch the normal way
git push -u origin feature/new-endpoint

# Open the PR against main
atlassian-cli bitbucket --workspace myteam pr create api-service \
  --title "Add /v2/orders endpoint" \
  --source feature/new-endpoint \
  --destination main

オープンな PR の一覧表示と確認

gh pr listgh pr view に相当します。どのコマンドにも --format json を付ければ jq にパイプできます。

# List open PRs (gh pr list)
atlassian-cli bb --workspace myteam pr list api-service --state OPEN --limit 5

# Inspect one PR by id (gh pr view 123)
atlassian-cli bb --workspace myteam pr get api-service 123

# Pull just the titles and authors with jq
atlassian-cli bb --workspace myteam pr list api-service --state OPEN \
  --format json | jq '.[] | {id, title}'

レビュー、コメント、マージ

承認、コメント、マージで一連の流れが完成します。マージ戦略には merge_commit のように Bitbucket が用意している値をそのまま指定できます。

# Approve the PR (gh pr review --approve)
atlassian-cli bb --workspace myteam pr approve api-service 123

# Leave a review comment (gh pr comment)
atlassian-cli bb --workspace myteam pr comment api-service 123 \
  --text "Ship it once CI is green."

# Merge it (gh pr merge 123)
atlassian-cli bb --workspace myteam pr merge api-service 123 --strategy merge_commit

作成からマージまで、gh 風の流れはこれで一通りです。Bitbucket をブラウザで開く必要は一度もありません。この流れをスケジュール実行や CI から動かす場合は、Bitbucket PR 自動化ランブックにそのまま応用できるスクリプトがあります。

エイリアスとラッパーで gh に近づける

素のコマンドで面倒なのは繰り返しです。行ごとに --workspace myteam とリポジトリスラッグを書く必要があります。gh は git リモートを読むことでこれを回避しています。現在の git リポジトリからスラッグを推測し、ワークスペースを補う小さなシェル関数を用意すれば、ほぼ同じところまで持っていけます。.zshrc.bashrc に次を追加してください。

# gh-style Bitbucket wrapper: PR verb first, repo slug from the git remote
export BB_WORKSPACE="myteam"

bbpr() {
  # First argument is the PR verb (list, get, create, approve, merge, ...)
  local verb="$1"; shift
  # Extract the repo slug from the origin remote URL
  local slug
  slug=$(git remote get-url origin 2>/dev/null \
    | sed -E 's#.*[/:]([^/]+/)?([^/]+?)(\.git)?$#\2#')
  atlassian-cli bitbucket --workspace "$BB_WORKSPACE" pr "$verb" "$slug" "$@"
}

このラッパーは実際の CLI の並び順に従います。最初に PR の動詞を受け取り、次に git リモートから導いたリポジトリスラッグを差し込み、残りのフラグはそのまま渡します。したがって bbpr create --title "..." --source feature/x --destination mainatlassian-cli bitbucket --workspace myteam pr create api-service --title "..." --source feature/x --destination main に展開されます。要点は、短いラッパーによって atlassian-cli bitbucket --workspace myteam pr list api-service がリポジトリの中で bbpr list になることです。これこそ多くの人が求めている gh の操作感です。

atlassian-cli は --format json できれいな JSON を出力するため、gh のまわりで使われている工夫はそのまま移植できます。PR の一覧を fzf にパイプして対話的に選んだり、jq に渡して出力を整形したり、CI の通知スクリプトに流し込んだりできます。出力形式はコマンドリファレンスにすべて記載されています。tablejsoncsvyamlquietmarkdown が使えます。

gh と正直に違う点

gh 風のワークフローは gh のクローンではありません。後で驚かないよう、違いをはっきりさせておきます。

どれもターミナル中心のワークフローにとって致命的なものではありません。API 駆動のツールである以上、避けられないコストであり、多くの Bitbucket ユーザーにとっては差し引きで明らかにプラスになります。

リポジトリ、ブランチ、パイプラインへ広げる

gh で身についた操作感はプルリクエストの外にも広がります。リポジトリ管理とブランチ管理はきれいに対応づけられますし、Bitbucket Pipelines にいたっては gh が標準ではまったくカバーしていない領域です。

# Repos: list, inspect, create (gh repo list / view / create)
atlassian-cli bb --workspace myteam repo list --limit 10
atlassian-cli bb --workspace myteam repo get api-service
atlassian-cli bb --workspace myteam repo create newrepo --name "New Repo" --private

# Branches: list, create, protect
atlassian-cli bb --workspace myteam branch list api-service
atlassian-cli bb --workspace myteam branch create api-service feature/new --from main
atlassian-cli bb --workspace myteam branch protect api-service \
  --pattern "main" --kind restrict_merges --approvals 2

# Pipelines: trigger a build straight from the terminal
atlassian-cli bb --workspace myteam pipeline trigger api-service --ref-name main

古いブランチやリポジトリを一括で整理する用途には、ドライランで安全に確認できる一括操作コマンドが用意されています(たとえば bb --workspace myteam bulk delete-branches api-service --dry-run)。詳しい手順はブランチ整理ランブックを、コマンドの全体像は Bitbucket CLI ハブを参照してください。

gh 風の Bitbucket ワークフローを手に入れる

Bitbucket、Jira、Confluence、JSM に対応した、MIT ライセンスの無料の Rust バイナリが 1 つ。独立したオープンソースです。

atlassian-cli を試す

よくある質問

GitHub の gh のような Bitbucket CLI はありますか。

Bitbucket 向けに gh をそのまま再現する Atlassian 提供のコマンドはありませんが、atlassian-cli で同じ gh 風のワークフローが使えます。gh pr listgh pr viewgh pr creategh pr reviewgh pr mergeatlassian-cli bitbucket pr の list、get、create、approve、merge に対応づけます。Bitbucket Cloud の REST API と通信する Rust バイナリなので、プルリクエスト、リポジトリ、ブランチ、パイプラインをすべてターミナルから扱えます。

ターミナルから Bitbucket のプルリクエストを作成してマージできますか。

はい。atlassian-cli bitbucket pr create <repo> --title "..." --source <branch> --destination main で PR を作成し、atlassian-cli bitbucket pr approve <repo> <id> で承認し、atlassian-cli bitbucket pr merge <repo> <id> --strategy merge_commit でマージします。bb エイリアスは、どのコマンドでも bitbucket の短い置き換えとして使えます。

atlassian-cli は gh pr checkout のように動作しますか。

厳密には異なります。atlassian-cli は API クライアントであり git のラッパーではないため、gh pr checkout のように作業コピーへブランチをチェックアウトすることはしません。ローカルでのブランチの取得と切り替えには通常どおり git を使い、gh が API 経由で扱っているサーバー側の操作、つまりプルリクエストの一覧表示、作成、レビュー、コメント、マージに atlassian-cli を使います。

atlassian-cli は Atlassian が提供する公式の acli と同じものですか。

いいえ。atlassian-cli は MIT ライセンスの、コミュニティによる独立したオープンソースプロジェクトです。Atlassian と提携・関連しておらず、Atlassian による承認、推奨、後援、保守のいずれも受けていません。Atlassian が提供する公式 CLI(acli)でもありません。ベンダーによる一次サポートが必要な場合は公式の acli を使ってください。Jira、Confluence、Bitbucket、Jira Service Management を gh のような使い心地で 1 つの無料の Rust バイナリから扱いたい場合は atlassian-cli が向いています。

atlassian-cli をもっと gh に近づけるにはどうすればよいですか。

まず組み込みの bb エイリアスから始め、次にワークスペースとリポジトリスラッグを補う小さなシェル関数を追加します。そうすればコマンド全体を書かずに bbpr create --title "..." と入力できます。atlassian-cli は標準入力を読み取り --format json で出力できるため、gh をラップするのと同じように jqfzf につなげられます。

関連リソース