Bitbucket Pipelines の「Step exceeded processing limits and has timed out」
ステップが2時間ほど止まったあと失敗し、ビルドのログの横にこのメッセージが出ます。Atlassian の記事(Bitbucket pipeline build fails with error "Step exceeded processing limits")が挙げる原因は1つです:そのビルドで使えるワークスペース・リポジトリ・デプロイメントの変数の名前と値を全部つなげた長さが、12万文字(120,000)を超えている。同じ原因で、パイプラインが待ち行列に残ったまま終わらないこともあります。記事は原因を、コマンドではなく変数の側に置いています。
「Exceeded build time limit」とは別のもの
どちらのメッセージも2時間で出ることがあります。「Exceeded build time limit of 120 minutes」は、ステップのコマンドが max-time より長く動いたという意味です。こちらは変数の大きさの話です。合計が12万文字より短いのにこのメッセージが出るなら、Atlassian はビルドの URL を添えてサポートに問い合わせるよう書いています。
変数のある場所
- ワークスペースの変数:Workspace settings、Pipelines、Workspace variables。ワークスペースの全部のリポジトリで使えるので、そこでの全部のビルドの合計に入ります。
- リポジトリの変数:リポジトリの Repository settings、Pipelines、Repository variables。
- デプロイメントの変数:リポジトリの Repository settings、Pipelines、Deployments に、環境ごとに1つずつ。
deployment: productionのあるステップには、ほかの2つの段に加えてその環境の変数が入ります。そのため、試験のステップは通るのにデプロイのステップだけが超える、ということが起きます。
保護された(secured)変数の値は、これらの画面に出ません。Bitbucket の API も空で返します(Pipelines の API の説明:“If the variable is secured, this will be empty.”)。その値は自分で知っていて、長さを足す必要があります。
スクリプトで足す
この Python 3 のスクリプトは、何も入れずに動きます。Bitbucket の API から3つの段を読み、デプロイメントの無いステップの合計と、デプロイメントの環境ごとの合計を出します。保護された変数の値は0として数え、その名前を出すので、何を足せばよいかが分かります。スコープ read:pipeline:bitbucket の API トークンを作ります。ログインには Atlassian アカウントのメールアドレスとトークンを使います(Atlassian の Using API tokens)。
import base64, json, os, sys
from urllib.parse import quote
from urllib.request import (
Request, urlopen)
API = "https://api.bitbucket.org/2.0"
ws, repo = sys.argv[1], sys.argv[2]
who = os.environ["BB_EMAIL"] + ":"
who += os.environ["BB_TOKEN"]
auth = "Basic " + base64.b64encode(
who.encode()).decode()
head = {"Authorization": auth}
def values(path):
url = API + path
while url:
req = Request(url, headers=head)
res = urlopen(req)
page = json.load(res)
yield from page["values"]
url = page.get("next")
def size(path, at):
n = 0
for v in values(path):
k = v["key"]
n += len(k)
n += len(v.get("value") or "")
if v.get("secured"):
print(at, "secured:", k)
return n
r = f"/repositories/{ws}/{repo}"
base = size(
f"/workspaces/{ws}"
"/pipelines-config/variables",
"workspace")
base += size(
r + "/pipelines_config/variables",
"repository")
print("no deployment:", base)
for e in values(r + "/environments"):
at = e.get("name", e["uuid"])
u = quote(e["uuid"])
n = size(
r + "/deployments_config"
f"/environments/{u}/variables",
at)
print(at + ":", base + n)
vars.py という名前で保存し、リポジトリの住所に出ているワークスペースとリポジトリを付けて動かします:
export BB_EMAIL=you@example.com export BB_TOKEN=... python3 vars.py my-workspace my-repo
Atlassian の記事のとおり、3つの段の変数を全部足します。ワークスペースの変数と同じ名前のリポジトリの変数も、両方数えます。このスクリプトは、Bitbucket の API の説明どおりに答える手元のサーバー(next のリンクで続くページ・波かっこ付きの環境の UUID・空で返る保護された値)に対して動かし、思ったとおりの合計が出ました。本物のワークスペースでは動かしていません。
合計を短くする
Atlassian の直し方は、変数を消すか、とても長い値を短くして、合計を12万文字より短くすることです。最初に見るのは、ファイルを丸ごと入れた値です。証明書・キーストア・鍵ファイルを base64 にしたものなどがそうです。base64 は元のファイルより3分の1長くなるので、30 KB のファイル1つで4万文字になります。そのうえで:
- もうどのビルドも使っていない変数を消します。先にワークスペースの変数から。ワークスペースの全部のリポジトリで数えられるからです。
- ファイルはステップがダウンロードできる場所に置き、変数には短い認証情報だけを入れます。
- AWS・GCP・Vault なら、Bitbucket Pipelines は OpenID Connect でログインでき、Bitbucket に認証情報を置かずに済みます(Atlassian の Integrate Pipelines with resource servers using OIDC)。
この場合にもっと分かるエラーを出してほしいという要望は、まだ開いたままです:BCLOUD-20105(2020年4月に作成・「Gathering Interest」)。
IntelliJ IDEA で失敗したステップを見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを、ステップと一緒に IDE のツールウィンドウに並べます。Bitbucket がステップを自分で終わらせたときは、Bitbucket が示した理由を見せ、続けてそのとき動いていたコマンドとその最後の行を見せます。変数を短くしただけなら、push する新しいコミットがありません。Pro なら Run again で、同じコミットを IDE からもう一度ビルドできます。一覧・ステップ・ログは無料。実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、Python は Python Software Foundation の商標、AWS は Amazon.com, Inc. またはその関連会社の商標、Google Cloud は Google LLC の商標、Vault は HashiCorp の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:「Exceeded build time limit of 120 minutes」 · 「No space left on device」 · 「No online runner available」 · 「We couldn't clone the repository」 · サブモジュールを取ってこない · 「command not found」 · 「unexpected system error」 · キャッシュが効かない · push したのに Pipelines が動かない · 「Container 'Build' exceeded memory limit.」 · 「Container 'docker' exceeded memory limit.」 · 次のステップにアーティファクトが無い · 前は通ったビルドが今は落ちる · Build setup に時間がかかる · ビルド時間を使い切った · 「Permission denied to update branch」 · 「You have reached your pull rate limit」(Docker Hub) · 「There is an error in your bitbucket-pipelines.yml」 · 「This pipeline was paused」(デプロイ) · IntelliJ IDEA の Bitbucket Pipelines 用プラグインの比較 · English