サーバーはsshでrsyncできればどこでも良いが、シンフリーサーバーを使った。
フリーじゃなくても使い勝手よさそうなので、必要なら有料版使おうと思う。
プロジェクトの用意
以下のコマンドでSSGのサイトがout/へ出力されるようにしておく。
npm run build
デプロイサーバーのsshキーを登録する
リポジトリ > Settings > Secrets and Variables > Actions のSecretsタブからNew repository secret でssh秘密鍵を登録する。
ここでは「DEPLOY_SERVER_KEY」として登録した。
GitHub Actionsの設定ファイルでは以下で参照できる。
${{ secrets.DEPLOY_SERVER_KEY }}
デプロイサーバーの情報を登録する
リポジトリ > Settings > Secrets and Variables > Actions のVariablesタブからNew repository variable でssh接続に使う情報を登録する
ここでは以下を登録した。
KEY名 | 内容 |
---|---|
DEPLOY_DIR | デプロイ先ディレクトリ |
DEPLOY_HOST_NAME | デプロイ先のホスト名 |
DEPLOY_HOST_USER_NAME | SSHのユーザー名 |
DEPLOY_SSH_PORT | SSHのポート |
GitHub Actionsの設定ファイルでは以下のように参照できる。
${{ vars.DEPLOY_SSH_PORT }}
GitHub Actionsの設定
以下へ設定ファイルを書く。
.github/workflows/cicd.yml
こんな感じ。
name: ci/cd on: push: branches: [ main ] pull_request: branches: [ main ] jobs: ci: runs-on: ubuntu-latest strategy: matrix: node-version: [20.x] steps: # 実行環境にソースコードを取り込む - uses: actions/checkout@v4 # 実行環境に対してNode.jsのセットアップをする - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: # Node.jsのバージョンを指定 node-version: ${{ matrix.node-version }} # プロジェクトの依存関係をインストール - name: Install dependencies run: npm install # lint実行 - name: Lint code run: npm run lint # prettier実行 - name: format code run: npm run fmt cd: runs-on: ubuntu-latest strategy: matrix: node-version: [20.x] steps: # 実行環境にソースコードを取り込む - uses: actions/checkout@v4 # 実行環境に対してNode.jsのセットアップをする - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: # Node.jsのバージョンを指定 node-version: ${{ matrix.node-version }} # プロジェクトの依存関係をインストール - name: Install dependencies run: npm install # ビルド - name: Build code run: npm run build # sshキーを配置 - name: ssh key generate run: echo "$SSH_PRIVATE_KEY" > key && chmod 600 key env: SSH_PRIVATE_KEY: ${{ secrets.DEPLOY_SERVER_KEY }} - name: deploy run: rsync -auzr -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p ${{ vars.DEPLOY_SSH_PORT }}" --delete ./out/* ${{ vars.DEPLOY_HOST_USER_NAME }}@${{ vars.DEPLOY_HOST_NAME }}:${{ vars.DEPLOY_DIR }}
まとめと参考ページ
ちょっと手間取ったがやはり楽になる。