PRが閉じられたら自動的にNetlifyのDeployを削除する
Deploy に紐づけられているブランチ名を確認する
デプロイ手法(公式の GitHub 連携機能を利用するか、Netlify CLI や Netlify API を利用するかなど)によって、Deploy に紐づけられるブランチ名の形式が異なるため、まずはその確認を行う。
次のコマンドを実行すると、サイトに紐づけられた最新の Deploy 最大 100 件を取得できる。
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 のみを取得できる。
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 を無効化できる。
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 プラン以上が必要になる。