VPSにローカルから自動デプロイしたメモ
環境
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
色々、ググったけどそんなの知ってるよね?みたいな前提の記事ばかりで絶望しかけたけど
以下の記事がわかりやすくて参考にさせて頂きました。今回の骨格となる記事。
どうも、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 -
ユーザを追加
今回は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 "メールアドレス"
コマンドを打つと設定をどうするか聞かれる。
# ファイル名をどうしますか?
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 [ポート]
これでパスフレーズなしのアカウントができた。
この章の参考記事
VPS側で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':
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
参考記事
Gitのデフォルトブランチをmasterからmainに変更する方法
githubのデフォルトブランチを変更
gitアップデート
Discussion