1111文字
6分
編集

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

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

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

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

shell
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フィールドが、ブランチ名に相当するので形式を覚えておく。

json
[
  {
    "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 のみを取得できる。

shell
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 を無効化できる。

shell
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 を削除するワークフローを次のように作成できる。

yml
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 プラン以上が必要になる。

編集