ヘッドレスCMS × Static Site GeneratorでJamstackなサイトをFTPを使ってデプロイする

前回：[ヘッドレスCMS × Static Site GeneratorでJamstackな爆速表示サイトを作ってみるチュートリアル](https://qiita.com/ohnaka0410/items/c2f6d7c90330c1d97c69)
前回からの続きです。

前回は、GithubとNetlifyを連携させて、microCMSで更新があった際に、Netlify上でビルドし、デプロイする流れで作成しました。
ただ、**FTP**などでアップロードするケースも未だに多々ありますので、今回は**microCMS**で更新があった際に**Github Actions**でビルドし、**FTP**で公開サーバにアップロードする手順を記載していきます。
※設定やソースコードは前回のものをベースに進めます。

## 今回作るもの
![plantuml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242655/bdd196a2-43bd-d04c-9b2a-af8ab1b9d597.png)
1. コンテンツ管理者がmicroCMS上でコンテンツ更新を行う。
2. microCMSがGithubへWebhookを送信する。
3. GithubがWebhookを受信し、Github Actionsで静的HTMLを生成する。
4. Github Actionsで公開サーバへ資産をFTPでWebサーバへデプロイする。

## 事前準備
- コンテンツ公開用のサーバへFTP接続可能にしておく。<br>さくらレンタルサーバーを利用する際は、Githubサーバ(**海外**)からのアクセスを許可しておくこと！！
- Github > Developer settings > Personal access tokens から repo に権限を付与した`Github Token`を作成しておく。

## 作り方
### Step.1 Github Actionsの設定
#### Step.1-1 環境変数の設定
他の人に知られたらまずい、サーバ接続情報をリポジトリ > Setings > Secretsで設定します。
※今回はFTP接続情報
![github.com_ohnaka0410_Jamstack-Sample_settings_secrets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242655/851cacb4-d210-e683-7881-2cb3cefbff55.png)

#### Step.1-2 Github Actionsの定義の作成
以下のようなワークフローを作成し、リポジトリにPUSHします。

```yaml:.github/workflows/main.yml
on: repository_dispatch
name: Publish Website
jobs:
  FTP-Deploy-Action:
    # ubuntu環境にmasterブランチをチェックアウト
    name: FTP-Deploy-Action
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master

    # ビルド用NodeJS12.xをセットアップ
    - name: Use Node.js 12.x
      uses: actions/setup-node@v1.4.1
      with:
        node-version: '12.x'

    # ビルド環境の構築+ビルド
    - name: Build Project
      run: |
        npm install
        npm run generate

    - name: List output files
      run: ls dist/

    # FTPアップロード
    - name: FTP-Deploy-Action
      uses: SamKirkland/FTP-Deploy-Action@2.0.0
      env:
        # FTPサーバー名
        FTP_SERVER: ${{ secrets.FTP_SERVER }}
        # FTPアカウントのユーザー名
        FTP_USERNAME: ${{ secrets.FTP_USERNAME }}
        # FTPアカウントのパスワード
        FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
        # どのディレクトリのデータをアップロードするか
        LOCAL_DIR: dist/
        # リモートのどのディレクトリにアップロードするか
        REMOTE_DIR: ${{ secrets.FTP_REMOTE_DIR }}
        ARGS: --delete # ★
```
実験する場合はまずは、**★の行をコメントアウト**することをオススメします。
設定をミスってるとサーバの意図しないファイルが吹っ飛ぶ場合もあるので。。。:innocent:

※`SamKirkland/FTP-Deploy-Action@3.0.0`を使おうとしましたが、distディレクトリが同期できなかったため泣く泣く2.0.0を利用。。。
　（./をまるっとFTP転送してみると、Actions内で作成されるnode_moduleやdistがなかった:thinking:）

### Step.2 microCMS側
#### Step.2-1 Webhookの設定
microCMSのAPI設定>Webhook からGithubActionsの設定を行います。
![jamstack-demo.microcms.io_apis_gorilla_settings_webhook (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242655/f87c009c-5ced-bd44-1ae2-50d4b5038446.png)

### Step.3 動作確認
microCMSでなにかコンテンツを公開すると、Github Actionsが実行され、指定されたFTPサーバにファイルがアップロードされます。
![github.com_ohnaka0410_Jamstack-Sample_actions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242655/745609d1-ffe8-b72a-2601-b094abb3ac9f.png)

実行したActionsの詳細なログも確認できます。
![github.com_ohnaka0410_Jamstack-Sample_runs_533466317_check_suite_focus=true.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242655/8d07324d-9b2f-b734-1618-40315d05c0d1.png)


## おわりに
- Github Actionsはnpmみたいに他の人が公開しているテンプレートを使えるので、よくあるworkflowなら楽に作成できる。
- 資産デプロイは多少時間がかかるため、資産削除→デプロイの流れで実施する場合は、何かしらの工夫をしないとサイトが見れなくなるダウンタイムが発生する。