Hero img
git actionsでVPSにデプロイ

github actionsを利用して、VPSサーバーに自動的にデプロイできるようにした。

git pushをするだけでnextjsのプロジェクトファイルをVPSに自動デプロイするように設定を行いました。


目次

  • VPSサーバーとホスティングサービス
  • git Actions
  • VPSに自動デプロイ
  • スクリプトファイル
  • スクリプトファイルの作成
  • git Actionsを使う
  • git sshの設定
  • ssh keyを設定する
  • テスト
  • まとめ

VPSサーバーとホスティングサービス

ホスティングサービスを利用すれば基本git pushとするだけでデプロイが可能な場合がほとんどですが、VPSの場合は手動でデプロイをするしかなかった。これが本当に煩わしかった。
sshでファイルを送る方法もあるがそれはそれで...
そのため、今回git actionsを利用して自動でデプロイできるように設定しました。

git Actions

gitで pushアクションがあった場合等操作がトリガーとなり、自動的に他のタスクを実行することができます。
git hubマーケットに色々なものがあるので眺めて見たら新しい発見があるかもしれません。
今回はssh-actionというものを使い、sshを使用し、VPS上のスクリプトを実行させます。

VPSに自動デプロイ

VPSデプロイするという手段にビルド済のファイルを送るという手段があります。

  1. 1.scpでファイルを送る
  2. 2.ftpでファイルを送る
    しかしこの方法は転送ファイルが多くなるため、ちょっと嫌だなと感じます。
    そこで別の方法とはVPS上でgit pullをしてビルドするという方法があります。
    今回ここではgit pushを実行したらVPSサーバーがgit pullで更新し、ビルドするところを自動化させます。

スクリプトファイル

まずVPS上にコマンドを叩けばビルド、デプロイまで実行してくれるようなスクリプトを作成します。
VPS上でデプロイするまでに必要なコマンドは

  1. 1.ディレクトリの移動
  2. 2.最新のリポジトリのダウンロード
  3. 3.ビルド
  4. 4.ファイル読み込みのためサービスのリロード フレームワーク等によって異なりますが主にこの4工程があります。

スクリプトファイルの作成

# ディレクトリ移動
cd /var/www/deploydirectory/nextjsweb

# Gitリポジトリを最新の状態に更新
git reset --hard origin/main
# もしくは、git pull 

# 依存関係のインストール
npm install

# Next.jsプロジェクトのビルド
npm run build

# pm2 リロード
pm2 reload test-nextjs-web

私の場合こんな感じで、スクリプトを実行させると自動でソースコードのダウンロード、ビルド、pm2リロードをしてくれます。
あとはこのスクリプトをgit push時に実行させるだけです。

git Actionsを使う

git actionsで先ほど作ったスクリプトを実行させるタスクを作成します。 git actionsを使うために必要な物はymlファイル一つだけです。

gitactions-yml-path

以下参考ください。

name: ssh command
on:
  push:
    branches:
      - main
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - id: ssh
        uses: invi5H/ssh-action@v1
        with:
          SSH_HOST: ${{ secrets.SSH_HOST }}
          SSH_PORT: ${{ secrets.SSH_PORT }}
          SSH_USER: ${{ secrets.SSH_USER }}
          SSH_KEY: ${{ secrets.SSH_KEY }}
      - run: ssh ${{ steps.ssh.outputs.SERVER }} /home/demouser/build.sh

簡単に解説しますと、

#以下はmainのブラインチがpushされた場合という意味になります。
#この設定により他のブランチ(develop)等がpushされても次のjobsの処理は実行されません。
on:
  push:
    branches:
      - main

以下が実際に実行されるコード

# ssh-action@v1というものを使用して、ssh接続し、 build.shのスクリプトを実行させています。
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - id: ssh
        uses: invi5H/ssh-action@v1
        with:
          SSH_HOST: ${{ secrets.SSH_HOST }}
          SSH_PORT: ${{ secrets.SSH_PORT }}
          SSH_USER: ${{ secrets.SSH_USER }}
          SSH_KEY: ${{ secrets.SSH_KEY }}
      - run: ssh ${{ steps.ssh.outputs.SERVER }} /home/demouser/build.sh

SSHの接続情報は次のように actionsに定義しています。 上記のコードをそのまま使用するのであれば, 次の名前で4つ作成し適切な値を入力してください。

  • SSH_HOST
  • SSH_KEY
  • SSH_PORT
  • SSH_USER

SSH_KEY

ssh_keyについてkeyの作り方を参考ください。
そして、VPS上にはauthorized_keysの中に以下のようにssh-edで始まる文字を追加します。

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx id@host
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy hoge@hoge

git hubのSSH_KEYにはもう片方ファイルの値をコピペで入力します。

-----BEGIN OPENSSH PRIVATE KEY-----
b3XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END OPENSSH PRIVATE KEY-----

git sshの設定

git pullでid pwを要求される問題を解決する必要があります。
git pullを実行する時毎回ユーザー名とパスワードを聞かれてしまいます。
ここのようにアカウントとパスワードを回避する方法があるのですが、今回はssh keyによる認証を行う事によりアカウントとパスワードの要求を回避することにしました。

ssh keyによる回避

ssh keyを一度作れば、今後聞かれ事は無くなります。
一点注意事項としては、ssh keyを作ってしまったら他の端末で pullリクエスト等が通ら無くなります。 そのため端末ごとに設定をする手間が増えます。ご注意ください。

ssh keyを設定する

keyの作り方を参考しssh keyを作成してください。
作成後は適切なフォルダー内に移動させます。

  1. 1.id_ed25519は.sshフォルダー内に移動してください。
# Almalinux
mv ided25519 ~/.ssh/
  1. 2.もう片方.pubのファイルの中身をgithub sshに記入します。
    github-ssh-settingにアクセスして、ssh-edで始まるファイルをコピペしてください。 gitactions-ssh-gen1 gitactions-ssh-gen2

テスト

設定ができたらテストをします。

ssh -T [email protected]
# 正常に接続ができたらこれが返って来ます。
# Hi USER! You've successfully authenticated, but GitHub does not provide shell access.

まとめ

これで煩わし作業無くgit pushをするだけで更新が可能になりました。
実運用する場合はこのgit actions用のみのアカウントを作成した方が良いと思います。

関連記事

コメント

コメントを書く

質問や、間違いがありましたら、お気軽にどうぞ

※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください