
Bitbucketの新機能 アクセストークンを使って操作を自動化してみた
こんにちは、みみぞうです。
ナビタイムジャパンで『システムや開発環境、チームの改善』を担当しています。
今回は、『Bitbucketのアクセストークンを使って操作を自動化した話』について、具体的には『プルリクエストの自動作成方法』を紹介します。
はじめに
本稿は以下の方をターゲットにしています。
また、記事内のBitbucketはBitbucket Cloud Premiumのことを指します。
アクセストークンとは
アクセストークンは、Bitbucket Cloud REST APIやGitコマンドを利用するために必要な認証情報です。ユーザーではなくbotやCIによる利用が想定されています。
アトラシアン サポートでは以下のように説明されています。
アクセス トークンは、リポジトリ、プロジェクト、またはワークスペースにリンクされており、タスクのスクリプト化や、ツール (CI /CD ツールなど) と Bitbucket Cloud の統合に使用できます。アクセス トークンは、制限された権限を持つ単一のアプリで使用するために設計されているので、2 段階認証 (2SV、2 要素認証または 2FA とも呼ばれる) は不要です。
アトラシアン サポートのブログによると、2023年1月30~2月6日に追加された機能となっております。
⚠️注意
2023年2月9日時点では ロールアウト ラベルが適用されているため、サイトによっては使用できない可能性があります。
アクセストークンの種類
アクセストークンは3種類あり、それぞれ有効範囲が異なります。
たとえば、リポジトリアクセストークンは、対象のリポジトリに対してのみ操作が可能になります。他のリポジトリに対しては操作できません。

アプリパスワードではなくアクセストークンを使う理由
プルリクエストを自動作成するだけであれば、アクセストークンを使わなくても、アプリパスワードで実現できます。ただ、アプリパスワードを利用する方法には2つの問題がありました。
ユーザーが操作したように見えてしまう
アプリパスワードはBitbucketの個人アカウントに紐づきます。そのため、あるユーザーの個人アカウントを利用して操作を自動化した場合、それらの記録は『あるユーザー』が操作したように見えてしまいます。

CIやbotによって自動で操作されたプルリクエストは、ユーザーが操作したように見えてほしくない...という期待がありました。
個人アカウントになりすましができてしまう
アプリパスワードは個人のアカウントと紐づいているため、それを利用するとなりすましができてしまいます。アトラシアン サポートのページでも、アプリパスワードを共有すべきでない旨が警告されています。
アプリ パスワードは個人のアカウントの資格情報と結びつけられているため、共有しないでください。アプリ パスワードを共有すると、そのパスワードが Bitbucket API を使用して実行する権限を持つあらゆる操作に対して、直接的な認証済みのアクセス権を提供することになります。
リポジトリアクセストークンのように、個人アカウントと紐づかず、対象範囲が限られていれば、万が一の場合も被害を最小限にとどめることができます。
アクセストークンを使って操作を自動化する
ここから本題に入ります。操作を自動化する具体的な例として、『プルリクエストを自動生成する』 ユースケースをご紹介します。リリース作業のオペレーションで、プルリクエストを作成しているチームなどでの利用を想定しています。
アクセストークンを作成する
ここから本題に入ります。
まずはアクセストークンを作成します。先ほどご紹介した3種類のうち、今回はどのプランでも利用可能なリポジトリアクセストークンを対象とします。リポジトリの設定画面から Access tokens → Create Repository Access Token を選びます。

名前とScopes(権限)の設定ダイアログが表示されます。適当な名前を入力し、Pull requests → Write をチェックします。そして Create から作成します。

すると、作成したアクセストークンが表示されます。ここでしか参照できませんので、コピーしておきます。

本稿では触れませんが、上から3番目のコマンド例にもある通り、git clone や git pull などのコマンドにも利用できます。
ブランチを作成する
対象のリポジトリにプルリクエストのマージ元となるブランチを作成します。以下のようにブランチを作成し、変更点をpushします。
$ git clone git@bitbucket.org:xxxxxxxxx/access-token-test.git
$ cd access-token-test
$ git checkout -b test-for-access-token
$ echo hogehoge >> README.md
$ git add .
$ git commit -m "Test for access token"
$ git push
コミットグラフはこのようになっています。

アクセストークンを使ってプルリクエストを作成する
プルリクエストの作成には Bitbucket Cloud REST API を使用します。
POST /2.0/repositories/{workspace}/{repo_slug}/pullrequests
POSTするJSONファイルを作成し、プルリクエストのタイトルとマージ元のブランチ名を指定します。
// data.json
{
"title": "プルリクてすとです",
"source": {
"branch": {
"name": "test-for-access-token"
}
}
}
curlコマンドを使ってリクエストします。
curl https://api.bitbucket.org/2.0/repositories/xxxxxxxxx/access-token-test/pullrequests \
-H 'Authorization: Bearer <アクセストークン>' \
-X POST \
-H 'Content-Type: application/json' \
-d @data.json
成功すると以下のようなプルリクエストが追加されます。

一目見て、ユーザーアカウントではなくbotだと分かりますね。
まとめ
Bitbucketの新しい機能であるアクセストークンを使って、プルリクエストの作成を自動化する方法を紹介しました。結果として、アプリパスワードを利用していたときに発生していた2つの問題を解消できました。
プルリクエストの作成者が個人アカウントになってしまう
個人アカウントになりすましができてしまう
今回紹介したユースケース以外にも、アクセストークンには様々な可能性があります。
プロジェクトアクセストークンを使うことで、複数リポジトリの管理コストを削減
プルリクエスト作成以外のBitbucket Cloud REST APIを使って、様々な操作を自動化
git clone、git pushなどのコマンドを自動化
Bitbucketで自動化したいアイデアをお持ちの方は、アクセストークンを使えば実現できるかもしれません。その際に、本記事が少しでもお役に立てれば嬉しく思います。
最後までお読みいただきありがとうございました!