Platform API を使用したビルドとリリース
最終更新日 2023年04月03日(月)
Table of Contents
この記事では、Platform API の build
リソースを使用してソースコードをビルドし、Heroku プラットフォームのアプリで実行できる slug を作成する方法について説明します。
ビルドリソースは、対話型の Git ベースのデプロイフローを補完するものですが、非対話型の継続的インテグレーション設定向けに最適化されています。ビルドリソースを使用して得られる出力は、Platform API の slug エンドポイントとリリースエンドポイントを使用してダウンロード、操作、再使用、移動できる slug およびリリースです。
ビルドリソースと、slug リソースおよびリリースリソースを組み合わせることによって、開発者は、ソースコードが (Heroku ではない) リポジトリにプッシュされ、ビルドリソースによって slug にビルドされ、プラットフォーム上の 1 つ以上のアプリにデプロイされるフローを構築できます。
ビルドリソースは、Platform API のその他の要素と共に api.heroku.com
から入手できます。
ビルドの作成
Build API で使用するためにソースの tar 書庫をアップロードする場所が必要な場合は、この後のソースエンドポイントを参照してください。
ソース tar 書庫からのビルド作成はシンプルです。
$ curl -n -X POST https://api.heroku.com/apps/example-app/builds \
-d '{"source_blob":{"url":"https://github.com/heroku/node-js-sample/archive/master.tar.gz", "version": "cb6999d361a0244753cf89813207ad53ad906a14"}}' \
-H 'Accept: application/vnd.heroku+json; version=3' \
-H "Content-Type: application/json"
{
"created_at": "2014-04-23T02:47:04+00:00",
"id": "01234567-89ab-cdef-0123-456789abcdef",
"source_blob": {
"url": "https://github.com/heroku/node-js-sample/archive/cb6999d361a0244753cf89813207ad53ad906a14.tar.gz",
"version": "cb6999d361a0244753cf89813207ad53ad906a14"
},
"slug": {
"id": null
},
"status": "pending",
"updated_at": "2014-04-23T02:47:11+00:00",
"user": {
"email": "username@example.com",
"id": "01234567-89ab-cdef-0123-456789abcdef"
}
}
これにより、Git を使用してソースコードが Heroku にプッシュされたかのように、Heroku はソース tar 書庫を取得して解凍し、ビルドを開始します。ビルドが正常に完了した場合、結果の slug は新しいリリースでアプリに自動的にデプロイされます。
何らかの理由で、特定のアプリにすぐにリリースされない slug を作成したい場合は、ビルドを処理する別のアプリを作成した後、slug を実行するアプリ上で、生成された slug を使用してリリースを作成することを現時点では推奨しています。
上記の例では、オプションの version
パラメータを渡します。これは、ソースのどのバージョンがこのビルドの元になったかを追跡するために使用するメタデータの断片です。たとえば、Git でバージョン管理されたソースコードからビルドを作成している場合、version
パラメータに使用する値としてはコミットハッシュが適しています。version パラメータは必須ではなく、ソースコードをダウンロードおよびビルドするときに使用されません。使用されるメタデータの単なる断片であり、必要に応じて、どのソースコードバージョンからどの slug がビルドされたかを追跡するために使用できます。
ビルドの一覧表示
特定のアプリのビルドを一覧表示できます。
$ curl -n https://api.heroku.com/apps/example-app/builds \
-H 'Accept: application/vnd.heroku+json; version=3'
[
{
"created_at": "2014-04-23T02:47:04+00:00",
"id": "01234567-89ab-cdef-0123-456789abcdef",
"source_blob": {
"url": "https://github.com/heroku/node-js-sample/archive/cb6999d361a0244753cf89813207ad53ad906a14.tar.gz",
"version": "cb6999d361a0244753cf89813207ad53ad906a14"
},
"slug": {
"id": "01234567-89ab-cdef-0123-456789abcdef"
},
"status": "succeeded",
"updated_at": "2014-04-23T02:47:11+00:00",
"user": {
"email": "username@example.com",
"id": "01234567-89ab-cdef-0123-456789abcdef"
}
},
...
]
上記のサンプル出力は、1 つの完了したビルドを示しています。slug ID が出力に含まれることに注意してください。この slug ID を使用して、同じアプリまたは Heroku 上の他のアプリで新しいリリースを作成できます。たとえば、slug リソースを使用して、ビルドをデバッグするための slug をダウンロードすることもできます。
アプリの Heroku リポジトリに Git プッシュすることによって作成されたものを含め、すべてのビルドをビルド一覧に表示できます。何らかの理由で失敗したビルドも追跡されます。 ビルドのステータスを取得するには、status
プロパティを確認します。値は pending
、successful
、failed
のいずれかです。
ビルド出力
特定のビルドの出力を取得することもできます。
$ curl -n -X POST https://api.heroku.com/apps/example-app/builds \
-d '{"source_blob":{"url":"https://github.com/heroku/node-js-sample/archive/master.tar.gz", "version": "cb6999d361a0244753cf89813207ad53ad906a14"}}' \
-H 'Accept: application/vnd.heroku+json; version=3' \
-H "Content-Type: application/json"
{
"created_at": "2014-07-25T21:46:02+00:00",
"id": "4dff04cd-08ae-4a73-b4c1-12b84170a30f",
"output_stream_url": "https://build-output.heroku.com/streams/1b/1be0f203-4d00-4948-9c7f-769067c99843/logs/cc/cce90488-d545-4cc8-a5f2-de10f0802d5d.log",
"slug": {
"id": null
},
"source_blob": {
"url": "https://github.com/heroku/node-js-sample/archive/cb6999d361a0244753cf89813207ad53ad906a14.tar.gz",
"version": "cb6999d361a0244753cf89813207ad53ad906a14",
"version_description": null
},
"status": "pending",
"updated_at": "2014-07-25T21:46:02+00:00",
"user": {
"email": "username@example.com",
"id": "01234567-89ab-cdef-0123-456789abcdef"
}
}
output_stream_url
の URL に対して GET
リクエストを実行します。
$ curl "https://build-output.heroku.com/streams/1b/1be0f203-4d00-4948-9c7f-769067c99843"
-----> Node.js app detected
-----> Requested node range: 0.10.x
...
output_stream_url
URL は、既存のビルドを GET
する場合にも使用できます。
ビルド出力はチャンク化されたエンコーディングを介して送信され、ビルドが完了すると接続は閉じられます。特定のビルドに対してデータが送信された後にクライアントが接続する場合、データはビルドの最初からバッファリングされます。ビルドの進行中、またビルドの完了後いつでも、出力をストリーミングできます (後者の場合、すべての出力がすぐに送信されます)。
ソースエンドポイント
Build API では、入力ソースの tar 書庫がダウンロードできる必要があります。Heroku では利便性のために、tar 書庫のアップロードを受け入れ、アップロードされた tar 書庫の URL を有効期限付きで提供するソースエンドポイントを提供しています。ソースエンドポイントは、パブリックダウンロードで提供されないソースコードを Build API で使用したい場合に使用してください。
ソースの作成
最初の API 呼び出しは、PUT
および GET
URL を作成します。PUT
URL を使用してソースの tar.gz
ファイルをアップロードし、ビルドの作成時に GET
URL を Build API に渡します。どちらの URL も有効期限は 1 時間です。
$ curl -n -X POST https://api.heroku.com/apps/example-app/sources \
-H 'Accept: application/vnd.heroku+json; version=3' \
{
"source_blob": {
"get_url":"https://s3-external-1.amazonaws.com/herokusources/...",
"put_url":"https://s3-external-1.amazonaws.com/herokusources/..."
}
}
source_blob:put_url
を使用したデータのアップロード
次に、前の手順で受け取った source_blob:put_url
に、ソースの tar 書庫を HTTP PUT
でアップロードします。
$ curl "https://s3-external-1.amazonaws.com/herokusources/..." \
-X PUT -H 'Content-Type:' --data-binary @source.tgz
...
注: curl
を使用するときは、Content-Type ヘッダーの送信を避けるために -H 'Content-type:'
を設定することが重要です。
source_blob:get_url
を使用したビルドの作成
最後に、最初の API 呼び出しの source_blob:get_url
を使用して、新しいビルドを作成します。
curl -n -X POST https://api.heroku.com/apps/example-app/builds \
-d '{"source_blob":{"url":"https://s3-external-1.amazonaws.com/herokusources/...", "version": "cb6999d361a0244753cf89813207ad53ad906a14"}}' \
-H 'Accept: application/vnd.heroku+json; version=3' \
-H "Content-Type: application/json"
{
"created_at": "2014-04-23T02:47:04+00:00",
"id": "01234567-89ab-cdef-0123-456789abcdef",
"source_blob": {
"url": "https://s3-external-1.amazonaws.com/herokusources/...",
"version": "cb6999d361a0244753cf89813207ad53ad906a14"
},
"slug": {
"id": null
},
"status": "pending",
"updated_at": "2014-04-23T02:47:11+00:00",
"user": {
"email": "username@example.com",
"id": "01234567-89ab-cdef-0123-456789abcdef"
}
}