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で使用します)と値を登録する。
今回は以下のように登録。
以下は入力サンプル。
******
21
ftps
/
example.com
hoge
******
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。