🦔

VPSにローカルから自動デプロイしたメモ

2022/08/04に公開

環境

VPS

conoha VPSのDockerイメージを選択したやつ
Ubuntu 20.04.4 LTS \n \l

ローカル

mac Apple M1
MacOS Monterey 12.3.1

やりたいこと

ローカル開発環境のmacからgithubを経由して
新たに構築したconohaのVPSサーバーに自動的にデプロイしたい。

gitもgithubも使いたてで、自動じゃないデプロイもした事ないのになんか出来そう
と言うイメージだけで進めました。
実はデプロイと言う言葉もしっくりきてないレベル。おじさんは実装と言います。

検索してとっかかりを探す

まず、どう検索したらいいかもわからなかったけど自分のやりたいことは
CI/CDと言う概念に近いことが分かりました。今回はテストはしないけど。

CI/CDとは「Continuous Integration/Continuous Delivery」の略で、日本語では継続的インティグレーション/継続的デリバリーといいます。CI/CDは1つの技術を指すものでなく、ソフトウェアの変更を常にテストして自動で本番環境にリリース可能な状態にしておく、ソフトウェア開発の手法を意味します。CI/CDを取り入れると、バグを素早く発見したり、変更を自動でリリースしたりできるようになります。
https://codezine.jp/article/detail/11083

色々、ググったけどそんなの知ってるよね?みたいな前提の記事ばかりで絶望しかけたけど
以下の記事がわかりやすくて参考にさせて頂きました。今回の骨格となる記事。
https://kanaru.jp/blog/deploy-vps-with-github-actions

どうも、github actionsってやつで自動化できるらしいのでやってみる。

実際にやってみる

全体的な流れ

VPS側でgithub actions用のssh接続アカウントを作る

ローカルのmacからgithubにソースをpush

github actionsでpushを検知したら、自動でvpsにログインして
githubからgit pullして最新のソース取得したりコードを移動する
っていうコードをgithub actionsに書く。

github actions用のアカウントを作る

VPS側でgithub actions用のssh接続アカウントを作ります。

なぜ、わざわざ専用のアカウントを作るかと言うと私の環境では既存のssh接続アカウントの秘密鍵にパスフレーズを設定していてそれがgithub actionsで自動接続する際に影響を及ぼしたからです。

github actionsでsshで自動接続する → パスフレーズを求められる → permission denied

これを回避するためにgithub actions用のssh接続アカウントを作ります。

  • 公開鍵でパスフレーズ無しにしたい(自動実行のため)
  • rootにさせたくない(ユーザー変更できない様にしたい)

suの制限は色々やってみたんですがうまく反映できませんでした(謎)
しかし、ubuntuの場合sudo使わなければスーパーユーザにれないのでsudoグループに入れなければ良いのでは?と言う結論に達しました。

ubuntuで一般アカウントからスーパーユーザになるコマンド

sudo su -

https://www.bnote.net/kuro_box/debian_su.html

ユーザを追加
今回はgithubと言う名前にします。

# adduser github
Adding user `github' ...
Adding new group `github' (1001) ...
Adding new user `github' (1001) with group `github' ...
Creating home directory `/home/github' ...
Copying files from `/etc/skel' ...
New password: ※パスワード入力
Retype new password: ※パスワード再入力
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
        Full Name []: ※Enter
        Room Number []: ※Enter
        Work Phone []: ※Enter
        Home Phone []: ※Enter
        Other []: ※Enter
Is the information correct? [Y/n] y

このユーザに公開鍵を設定するために
一旦、パスワードログインを許可します。(後で元にもどす)

vi /etc/ssh/sshd_config

(ファイルの中身)
PasswordAuthentication no
    ↓
PasswordAuthentication yes

変更を反映

systemctl reload sshd

macで公開鍵を作る

sshディレクトリに移動

cd ~/.ssh

-tが暗号化方式、-bが作成する鍵のビット数を指定、-Cがコメント
コメントにメールアドレスを指定するのが推奨らしい。

ssh-keygen -t rsa -b 4096 -C "メールアドレス"

https://atmarkit.itmedia.co.jp/ait/articles/1908/02/news015.html

コマンドを打つと設定をどうするか聞かれる。

# ファイル名をどうしますか?
Enter file in which to save the key

# github actions専用のキーなので今回はこの名前をタイプ
# github-actions

Enter passphrase
Enter same passphrase again
# パスフレーズ決めてくれと言われるがenterキーを押して無視する

The key's randomart image is:
+---[RSA 4096]----+
|             o.  |
|             .o .|
|         .    ...|
|        o o    o.|
|        S= o ....|
|         +* =  ..|
|        +++=.O.. |
|       .oB++BE+. |
|       o=+B**+o++|
+----[SHA256]-----+

ls -al ~/.ssh

# 以下のファイルができている
github-actions   # 秘密鍵
github-actions.pub # 公開鍵

一旦、VPSの作成したgithubアカウントでログインしてsshディレクトリを作成する。
[]内は自身の環境に当て嵌める。[]は入力しない。

# mac側
ssh github@[VPSのIP] -p [ポート]

# VPS側
mkdir .ssh
chmod 700 .ssh

公開鍵をVPSにsshでアップロード
[]内は自身の環境に当て嵌める。[]は入力しない。

# mac側
scp -P [ポート] ~/.ssh/github-actions.pub github@[VPSのIP]:.ssh

VPS側でアップロードした公開鍵の名前を変更。
(authorized_keysと言う名前が公開鍵と認識されるから)

# VPS側
mv .ssh/github-actions.pub .ssh/authorized_keys

これで公開鍵の設置ができたのでパスワードログインを再びできない様にする
VPS側の作業。

vi /etc/ssh/sshd_config

(ファイルの中身)
PasswordAuthentication yes
    ↓
PasswordAuthentication no

変更を反映

systemctl reload sshd

macから秘密鍵を指定してログインできればおk

ssh github@[VPSのIP] -i ~/.ssh/github-actions -p [ポート]

これでパスフレーズなしのアカウントができた。

この章の参考記事

https://zenn.dev/tokiya_horikawa/articles/215637f23c8407

VPS側でgit pullできるようにする

https://codelikes.com/git-pull/

gitが使えるか確認
使えなかったらインストールしよう。

git --version
# git version 2.32.1 入ってた

githubのユーザ名とemailを設定して連携できるようにする。

git config --global user.name your-username
git config --global user.email your-email

正しく登録できたか確認

cat ~/.gitconfig

# 設定したユーザ名とemailを確認
[user]
	name = your-username
	email = your-email

git cloneするディレクトリを作成して移動

sudo mkdir /var/git/
cd /var/git/

sudo git clone https://github.com/[githubのユーザ名]/[リポジトリ名].git
# ユーザ名とパスワード(アクセストークン)を求められるので入力
Username for 'https://github.com': 
Password for 'https://github.com':

https://codelikes.com/git-clone/

githubでアクセストークンは、右上の自分のアイコンから
settings → develop settings → Personal access tokens
から色々やる。

cloneできたらssh接続ユーザーに所有を書き換える。
[]内は自身の環境に当て嵌める。[]は入力しない。

sudo chown -R [sshユーザ名] [リポジトリ名]
cd [リポジトリ名]

git pull
# ユーザ名とパスワード(アクセストークン)を求められるので入力
Username for 'https://github.com': 
Password for 'https://github.com': 
Already up to date.  // このように出力されればok

毎回入力するのが面倒なのでユーザ名とパスワードを省略できる設定をする。
[]内は自身の環境に当て嵌める。[]は入力しない。

git remote set-url origin https://[githubのユーザ名]:[githubのユアクセストークン]@github.com/[githubのユーザ名]/[リポジトリ名].git

git pullをしてユーザ名、パスワードを求められなくなればおk

github actionsの設定

githubのActionsタブからset up a workflow yourselfをクリック

以下の様にgit pullした/var/git/以下のリポジトリのディレクトリを
任意のプロジェクトディレクトリにコピーすると言う仕様にmain.ymlを書き換える。
ssh接続後にscript以下をVPS側で実行するイメージ。

name: CD
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install SSH Key for Deploy
        uses: appleboy/ssh-action@master
        with:
          key: ${{ secrets.SSH_KEY }}
          host: ${{ secrets.HOST_NAME }}
          username: ${{ secrets.SSH_USER }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            cd /var/git/[リポジトリ名]/
            git pull
            cp -r /var/git/[リポジトリ名]/build/* /var/www/[プロジェクト名]

これでコミットする。

${{ secrets.SSH_KEY }}などの変数を、githubに登録する。
settings → Secrets → Actions  → New repository secretの順にクリック

すると、入力欄が出てくる。
Dockerの.envファイルみたいに一気に羅列すると勘違いしたけど変数を一個ずつ登録するみたい。

それぞれを登録する。

key: ${{ secrets.SSH_KEY }}
→ SSH_KEY(秘密鍵)
host: ${{ secrets.HOST_NAME }}
→ HOST_NAME(VPSのIP)
username: ${{ secrets.SSH_USER }}
→ SSH_USER(sshの接続ユーザ)
port: ${{ secrets.SSH_PORT }}
→ SSH_PORT(ポート番号)

秘密鍵はmac側で以下のコマンドでコピーできる。

cd ~/.ssh
pbcopy < github-actions.pub

これでmacからpushすれば動く人は動くはず。

うまく行くまでにハマったこと

  • パスフレーズありのsshアカウントで動かないことに気づくのに時間がかかった。
  • 新規でパスフレーズ無しのユーザを作ったのにgithub側でSecretsユーザ情報を更新し忘れて実行できなかった。
  • ユーザ変えたのでVPS側のプロジェクトのディレクトリの所有者も変更しなければならないのを忘れてたのでディレクトリの権限がなくてエラー
  • gitのデフォルトブランチがmasterからmainになった歴史に気づかず動かなかった。

これらは以下の画像の通りするとデバッグログを確認できるのでそこから解決できるはず。

以上、参考まで。

追記

ローカルからpushして、github actionsタブでworkflowが成功しているにも関わらず
追加したファイルが反映していない現象を確認した。

VPSにログインして試しにgit pullすると以下のエラーが発生

Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched.

ブランチをmasterからmainに変更する作業でミスしていたようだ。
以下のコマンドを流して解決。

git branch -m master main
git fetch origin
git branch -u origin/main main

参考記事

https://kanaru.jp/blog/deploy-vps-with-github-actions
https://qiita.com/0622okakyo/items/5295b7b13daf3c35b3e1

Gitのデフォルトブランチをmasterからmainに変更する方法
https://qiita.com/fk_chang/items/a4839a595fef9a2c3724

githubのデフォルトブランチを変更
https://parashuto.com/rriver/tools/change-git-default-branch-name

gitアップデート
https://loumo.jp/archives/23149

https://dev.classmethod.jp/articles/how-to-change-github-repos-default-branch-name/

Discussion