1111 文字
6 分

PRが閉じられたら自動的にNetlifyのDeployを削除する

Deploy に紐づけられているブランチ名を確認する#

デプロイ手法(公式の GitHub 連携機能を利用するか、Netlify CLI や Netlify API を利用するかなど)によって、Deploy に紐づけられるブランチ名の形式が異なるため、まずはその確認を行う。

次のコマンドを実行すると、サイトに紐づけられた最新の Deploy 最大 100 件を取得できる。

Terminal window
curl -s -X GET \
-H "Authorization: Bearer $NETLIFY_TOKEN" \
"https://api.netlify.com/api/v1/sites/$SITE_ID/deploys"

$NETLIFY_TOKENには、Netlify の Personal Access Token を指定する。

$SITE_IDには、Netlify のサイト ID を指定する。Netlify で対応したいサイトの「Site configuration」を開き、Site information の中にある「Site ID」がそれに該当する。自身が定義したサイト名ではないので注意。

コマンドを実行すると、次のようなレスポンスが得られる。ここにあるbranchフィールドが、ブランチ名に相当するので形式を覚えておく。

[
{
"id": "6780b5257d6fc6786f803ba8",
"site_id": "d098883f-e010-44ac-a441-00b7fc5b6bda",
"build_id": null,
"state": "ready",
"name": "my-site",
"url": "http://my-site.netlify.app",
"ssl_url": "https://my-site.netlify.app",
"admin_url": "https://app.netlify.com/sites/my-site",
"deploy_url": "http://deploy-preview-1189--my-site.netlify.app",
"deploy_ssl_url": "https://deploy-preview-1189--my-site.netlify.app",
// ...
"branch": "deploy-preview-1189",
"links": {
"permalink": "https://6780b5257d6fc6786f803ba8--my-site.netlify.app",
"alias": "https://deploy-preview-1189--my-site.netlify.app",
"branch": null
}
// ...
}
// ...
]

次のように branch クエリパラメータに、取得したブランチ名を指定すると、そのブランチに紐づけられた Deploy のみを取得できる。

Terminal window
curl -s -X GET \
-H "Authorization: Bearer $NETLIFY_TOKEN" \
-d branch=$BRANCH_NAME \
"https://api.netlify.com/api/v1/sites/$SITE_ID/deploys" |

Preview deploy と Alias deploy#

Pull Request に紐づいた Deploy には、少なくとも次の 2 種類がある。この分類は公式のドキュメントによるものではなく、Netlify Support Forums の記述を元にしているため正確でない可能性がある。

  • Preview deploy
  • Alias deploy

それぞれ次のような形式になっている。Alias deploy の形式は、Deploy 手法によるが、特殊なことをしていなければ PR 毎に一意な URL が生成される。

  • Preview deploy:hash値--site-name.netlify.app
  • Alias deploy:deploy-preview-PR番号--site-name.netlify.app

Preview deploy は、Pull Request で push などで Deploy が要求される度に新しい Deploy が作成され、異なる URL が生成される。

Preview deploy が行われる度に、Alias deploy へのエイリアスが貼られる。

Alias deploy を削除する#

Netlify API や Netlify CLI を見ても、Alias deploy を削除するためのエンドポイントやコマンドは見当たらない。

Alias deploy には、Pull Request の全ての Preview deploy がエイリアスとして紐づいているため、最新の Preview deploy を削除しても、Alias deploy は 1 つ前の Preview deploy にフォールバックし存続する。

Alias deploy を無効化するには、Pull Request に紐づいた全ての Preview deploy を削除する必要がある。

次のように、ブランチに紐づけられた全ての Deploy を取得した後に、それぞれを削除することで Alias deploy を無効化できる。

Terminal window
curl -s -X GET \
-H "Authorization: Bearer $NETLIFY_TOKEN" \
-d branch=$BRANCH_NAME \
"https://api.netlify.com/api/v1/sites/$SITE_ID/deploys" | \
jq -r '.[].id' | \
while read -r deploy_id; do
echo "Deleting deploy ID: $deploy_id"
curl -s -X DELETE \
-H "Authorization: Bearer $NETLIFY_TOKEN" \
"https://api.netlify.com/api/v1/sites/$SITE_ID/deploys/$deploy_id"
done

これはブランチに紐づいた Deploy が 100 件を超えることはないという前提で書いている。超えるケースを考慮するのであれば、ページネーションを考慮する必要がある。

ref: https://open-api.netlify.com/#tag/deploy/operation/listSiteDeploys

Pull Request に紐づけられた Netlify Deploy を削除する GitHub Actions#

ここまでの内容を GitHub Actions に組み込んで、Pull Request が閉じられた際に自動的に Netlify Deploy を削除するワークフローを次のように作成できる。

name: Delete Netlify Deploy Preview
on:
pull_request:
types:
- closed
env:
NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }}
# Netlify上のSite IDを記載する
SITE_ID: ""
jobs:
delete_netlify_deploy:
runs-on: ubuntu-latest
steps:
- name: Get branch name
id: branch
# ここのnameの形式は、NetlifyへのDeploy手法によって異なる可能性があるため、適宜変更する
run: |
echo "name=deploy-preview-${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
- name: Fetch and delete deploys from Netlify
shell: bash
env:
BRANCH_NAME: ${{ steps.branch.outputs.name }}
run: |
curl -s -X GET \
-H "Authorization: Bearer $NETLIFY_TOKEN" \
-d branch=$BRANCH_NAME \
"https://api.netlify.com/api/v1/sites/$SITE_ID/deploys" | \
jq -r '.[].id' | \
while read -r deploy_id; do
echo "Deleting deploy ID: $deploy_id"
curl -s -X DELETE \
-H "Authorization: Bearer $NETLIFY_TOKEN" \
"https://api.netlify.com/api/v1/sites/$SITE_ID/deploys/$deploy_id"
done

GitHub Actions ではjqがプリインストールされているため、JSON の整形が非常に行いやすい。

Netlify の機能で自動削除する。90 日未満では Enterprise プラン以上が必要#

Netlify では、そもそも 90 日以上経過した Deploy を自動的に削除する機能が提供されている。

https://docs.netlify.com/site-deploys/manage-deploys/#automatic-deploy-deletion

ただし、この日数をコントロールしたい場合は、Enterprise プラン以上が必要になる。

PRが閉じられたら自動的にNetlifyのDeployを削除する
https://blog.ohirunewani.com/posts/netlify-automatically-remove-deploy-preview-when-prs-are-merged/
作者
hrdtbs
公開日
2025-01-11
ライセンス
CC BY-NC-SA 4.0