【Mac】GithubにPushしたらエックスサーバーにデプロイする手順(GitHub Actions)

githubのmasterブランチにPushしたらエックスサーバーにデプロイする方法です。
もくじ
前提
VSCodeでgithubにPushできる環境であることと、エックスサーバーにSSH接続できる環境であることです。
- githubにアカウントを持っている
- githubにpushできる
- エックスサーバーにSSH接続できる
手順
- 自分のパソコンからエックスサーバーにSSH接続する
- githubにキーペアを登録する
- githubにworkflowsを登録する
- rcyncのコマンドを書く
1. 自分のパソコンからエックスサーバーにSSH接続する
自分のパソコンからエックスサーバーにSSH接続しておきます。接続の方法は記事を参考にしてください。
~/.ssh/known_hosts
が作成されたことを確認してください。
2. githubにキーペアを登録する
githubにキーペアを登録します。登録するのは秘密鍵、公開鍵、KNOWN_HOSTSの3つです。
リポジトリの画面から Settings > Secrets と進み、「New Secrets」のボタンを押します。

SSH_KEY(秘密鍵)の登録
秘密鍵はエックスサーバーにSSH接続したときに作成した~/.ssh/id_xserver_rsa
です。テキストファイルで開いて中身をコピーして「Secrets」に登録します。
名前は「SSH_KEY」で保存します。
SSH_KEY_PUBLIC(公開鍵)の登録
エックスサーバーのサーバーパネルの「SSH設定」の「公開鍵登録・更新」画面を開きます。

「登録済み公開鍵を表示」のリンクを押して表示された公開鍵をコピーします。
Githubの「Secrets」に「SSH_KEY_PUBLIC」という名前で保存します。
KNOWN_HOSTSの登録
エックスサーバーにSSH接続したときに作成された「known_hosts」のファイルをテキストエディタで開きます。
[sv0000.xserver.jp...]
というサーバー名から始まる行をコピーして、「Secrets」に「KNOWN_HOSTS」という名前で保存します。
3. githubにworkflowsを登録する
GitHub Actionsを使って、Pushされたらrcynsを実行する…という処理を行います。
/.github/workflows/deploy.yml
を作成します。
deploy.yml
に下記のコードを書いて保存します。
on:
push:
branches:
- master
name: Deploy
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Install SSH key
uses: shimataro/ssh-key-action@v1
with:
private-key: ${{ secrets.SSH_KEY }}
public-key: ${{ secrets.SSH_KEY_PUBLIC }}
name: id_xserver_rsa
known-hosts: ${{ secrets.KNOWN_HOSTS }}
- name: run deploy script
run: bash deploy.sh
次の手順で作成するdeploy.shをフォルダに入れる場合は
run: bash ./script/deploy.sh
のように書いてください。
(shimataro/ssh-key-action@v2
という新しいバージョンもあるんですがちょっとうまく使えてないので勉強中です)
4. rcyncのコマンドを書く
デプロイしたいファイルと同じ階層にdeploy.sh
を作成します。
私は./script/deploy.sh
に作成しています。その場合は手順3のworkflowsを修正してください。
deploy.shにrcyncのコマンドを書きます。
#テックブログ
rsync --delete -auvz -e "ssh -p 10022 -i ~/.ssh/id_xserver_rsa" --exclude-from=exclude.txt -rlpt ./ user@sv0000.xserver.jp:domain.com/public_html
最初にテストする時は--dry-run
をつけるとテストできます。
exclude.txt
に除外ファイルを書いています。
--exclude-from=exclude.txt
もしもフォルダに入れる場合は./script/exclude.txt
というように書いてください。ルートからのパスになります。
rcyncのスラッシュの有無の違い
実は、rcyncのスラッシュの有無には大きな違いがあります。
rsync /dir/a /dir/b
rsync /dir/a /dir/b/
#結果
/dir/b/a/
コピー元にスラッシュをつけなかった場合は、ディレクトリ本体がディレクトリごとコピーされます。
rsync /dir/a/ /dir/b
rsync /dir/a/ /dir/b/
#結果
/dir/b/aの中身
コピー元にスラッシュがついていた場合は、ディレクトリの中身がコピーされますので、bの中にaディレクトリは作成されません。
これでGithubのmasterブランチにPushしたらエックスサーバーにデプロイされるようになりました。