メニュー

GitHub Actionsを使ってmicroCMS × Next.js(SSG)データをFTPSでアップロードする

GitHub ActionsからデプロイしたmicroCMS × Next.js(SSG)データをアップロードするとき、プロトコルはSFTPではなくFTPSを使いたいと思ったとき、「FTP-Deploy-Action」を使用すると実装できた。

今回使用したバージョンは「FTP-Deploy-Action@4.3.2」。@より後ろはバージョンタグ。

Repository secretsへの登録

Repository secretsにFTPSの接続情報と、microCMSのシークレットキーを登録する。

該当リポジトリへと移動しSettingsページを開いたあと、続いて「Secrets>Actions」を開く。
右上の「New repository secret」を押して、シークレットキーの名前(workflowで使用します)と値を登録する。

今回は以下のように登録。

以下は入力サンプル。

FTP_PASSWORD

******

FTP_PORT

21

FTP_PROTOCOL

ftps

FTP_REMOTE_ROOT

/

FTP_SERVER

example.com

FTP_USERNAME

hoge

MICROCMS_API_KEY

******

MICROCMS_SERVICE_ID

test-blog

Environment secretsについて

「Environment secrets」を使っても動くようだが、自分の環境からだとなぜかキーを読み込めなかった。

実際はRepository secretsとEnvironment secretsを使い分けられると使い勝手がよくなりそう。
ちなみに、Repository secretsとEnvironment secretsは一度登録すると以前の値は見えないので注意。

workflowの準備

workflowはインデントを合わさないとシンタックスエラーになる。

name: Deploy CI

on:
  push:
    branches: [ main ]
  repository_dispatch:
    branches: [ master ]
    types: [ update_post ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        node-version: [18.x]
      
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm ci
      - name: Build 
        env:
          MICROCMS_API_KEY: ${{ secrets.MICROCMS_API_KEY }}
          MICROCMS_SERVICE_ID: ${{ secrets.MICROCMS_SERVICE_ID }}
        run: npm run build --if-present
      - name: Deploy FTP
        uses: SamKirkland/FTP-Deploy-Action@4.3.2
        with:
          server: ${{ secrets.FTP_SERVER }}
          username: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}
          protocol: ${{ secrets.FTP_PROTOCOL }}
          port: ${{ secrets.FTP_PORT }}
          server-dir: ${{ secrets.FTP_REMOTE_ROOT }}
          local-dir: ./out/

matrixを使ってnodeバージョンを指定した変数を用意する。
Repository secretsに登録したシークレットキーはsecretsから呼び出せる。

repository_dispatchで登録したトリガーはこの後「microCMSのWebhookに登録」で使用する。

microCMSのWebhookに登録

microCMSの内容を更新したら、デプロイしサーバーにアップロードするためWebhookを使用する。

更新するタイミングはいくつか設定できるが、Githubアカウントの無料枠だとGitHub Actionsは2000分/月しか動かせないので、更新ボタン用のサービスを用意した。
※同サービスにAPIを追加する事も可能だが、microCMSの無料枠だとAPIの上限が3つのため、そこは仕様に合わせて調整。

トリガー用のサービスなのでAPIスキーマそのものは何でもいい。
Webhook側は、値を変更しなくても公開ボタンを押すだけでトリガーが動くように設定。

microCMSのサービスごとの管理画面に入ったあと、API設定ページに移動し、Webhookを選択。
追加ボタンを押したら「GitHub Actions」を選択し、使用するリポジトリとその他情報を登録する。

イベントトリガー名には、先ほどrepository_dispatchで登録したトリガー「update_post」を登録。

GitHubトークンの準備

Webhookに登録するGitHubトークンを準備。

Fine-grained personal access tokensを使った方法

プロフィールのSettingsを開いたあと「Developer settings」ページへ移動。
「Personal access tokens>Fine-grained personal access tokens」を開いて「Generator new token」を選択する。

ExpirationはCustomを指定しても、最大で1年間まで。
例えば2022/12/08に発行する場合、最大で2023/12/08まで有効なGitHubトークンになる。

Repository accessではセキュリティ強化のため、可能な限りはOnly select repositoriesから個別にリポジトリを選択すること。
なお、リポジトリは複数指定することも可能。

PermissionsはRepository permissionsからContentsを「Access: Read and write」に、Metadataを「Access: Read-only」に設定すれば、Webhookからのトリガーに反応してデプロイ&アップロードの処理が走るはず。
Fine-grained tokensは設定が細かいため、上手くいかなければ適宜権限を調整すること。

Tokens (classic)を使った方法

プロフィールのSettingsを開いたあと「Developer settings」ページへ移動。
「Personal access tokens>Tokens (classic)」を開いて「Generator new token」を選択する。

その都度キーを更新するのが大変なのでExpirationは「No expiration」を選択して無期限にする。
Select scopesは、今回の場合だとrepoだけを許可していれば充分。

一番下の「Generate token」を押した後に出てくる「ghp_<トークン>」をコピーし、microCMSのWebhookへと貼り付ける。

通知タイミングの設定

「コンテンツの公開時・更新時」項目にある「コンテンツ編集画面による操作」だけを許可していればOK。