React.js + Github Actions でVPSにデプロイする、なんちゃってCI/CDを作ってみた

CI/CDとしてGithub ActionsでビルドしてVPSにReactの出力ファイルをデプロイする方法を探してるとGithubpageとか色々でてくるのですが、なかなかうまい具合にハマる記事が見つからなかったのでいろいろな情報をまとめつつようやく一つの形に落ち着いた。覚書としてこちらに記載しようと思う。
CICDを作るためのymlは結局この形に落ち着いた。

name: CI

on: push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: setup-node
        uses: actions/setup-node@v3
        with:
          node-version: "20"
          cache: npm
      - name: install dependencies
        run: npm i
        shell: bash
      - name: build
        run: npm ci && npm run build
        shell: bash
        env:
          CI: false
      - name: Copy folder content recursively to vps
        uses: garygrossgarten/github-action-scp@release
        with:
          local: build
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SERVER_USERNAME }}
          password: ${{ secrets.SERVER_PASSWORD }}
          remote: ${{ secrets.PROJECT_PATH }}

Pushをトリガーに動く。Jobsは最初複数書いてたのだが、並列処理してくれているので、1つにまとめた。複数書く場合はフロントエンドとバックエンドのビルドが必要なときとか、そういうのでよさそう。
調べたらでてくるようなよくあるコードがほとんどだが問題は後半。
VPSにデプロイする方法を2つ見つけました。

1.ごにょごにょしてSSH接続、ymlでVPSに飛んで「プル」する(つまりリモートリポジトリの操作と設定が必要)
2.単にファイルをSSHで接続したあとに該当のパスまで移動して転送するだけ(VPS内でのリポジトリ設定は不要)

今回はReactでSPAを作る単純なやり方で、Next.jsを使うわけではないので2を採用した。Githubから秘密鍵や公開鍵でSSH認証する方法はそこら中にあると思うので調べてください←
.envだと.gitignoreで受け付けれないしセキュリティ上も危ないので、Githubから該当リポジトリの設定→セキュリティ→Secrets and Variables→Actions→Repository Secretsに変数を登録してsecretsを作るのがいい。というか、UIが2024年7月時点で、去年の記事と比較しても変わっていたため、どこにいれるのか探すの面倒だった。
また、ここは大事なところなのですが、ymlはタブでのインデントは受け付けてくれず、インデントする場合は半角スペースにしたほうがいいようです。これ知らなくてずっとハマってました。

Reactで色々設定してたら画面が真っ白になりましたが、それはよくあるやつで、package.jsonに "homepage": "."; 追加することで治りましたが、Actions経由でデプロイすると(Actionsだけに限らない話ですが)キャッシュが強く残る場合もあるので、スーパーリロードすることをおすすめします。これに気づかず時間費やしてた人がいるんですよ、私です←

本格的なCI/CDではないと思いますが、新しくGithub ActionsでCICDやってみたいという人の練習や参考になれば幸いです。


この記事が気に入ったらサポートをしてみませんか?