GitHub ActionsでSpringBootアプリをさくらVPSにSSHしてデプロイする

## 概要
- GitHub ActionsでさくらVPSにデプロイしようとしていろいろハマったのでその結果を残しておきます。
- GitHub ActionsからAWSとかAzureにデプロイは色々記事がありますが、それ以外のサーバーにログインしてごにょごにょしたいときはどうすればいいのかがあまり書かれていなかったので、似たようなことがしたい人の参考になればさいわいです。
- 間違っている点、こうすればもっと楽だよなどあればご指摘ください！

## 環境
- GitHub Actions実行環境：ubuntu-latest
- Java8
- SpringBoot
- さくらVPS CentOS Linux release 7.8.2003 (Core)

## この記事でやること
- GitHub Actionsでmasterブランチにマージされたら、さくらVPSにデプロイする

## この記事では書かないこと
- GitHub Actionsそのものについての解説は公式や書籍などをご参照ください。
- CIの設定は他の記事でもサンプルが多くあるのでそちらを参照ください。

## 手順
1. `/.github/workflows`配下にdeploy.ymlを用意する（名前はなんでもOK）
2. デプロイ用のシェルスクリプトを用意する
2. ローカルでGitHub ActionsがさくらVPSにアクセスするための秘密鍵・公開鍵のセットを作成する
3. GitHubのSecretsに作成した秘密鍵とknown_hostsを登録する
4. さくらVPSのOpenSSHのバージョンをアップデートする
5. さくらVPSのSSH設定を確認する
6. ローカルで作成した（GitHubに登録した）公開鍵をさくらVPSに登録する
7. masterブランチにプルリク出してマージする

## 1. `/.github/workflows`配下にdeploy.ymlを用意する（名前はなんでもOK）
- GitHub Actions用の設定ファイルを用意します。
- GitHub ActionsでSSHするために[Install SSH Key](https://github.com/marketplace/actions/install-ssh-key)を利用しました。
日本の方が作成されたアクションで、[こちらの本人が執筆された記事](https://qiita.com/shimataro999/items/b05a251c93fe6843cc16)を参考にしました。ありがとうございます。

```yaml:deploy.yml
name: sample-deploy
on:
  push:
    branches:
      - master

jobs:
  deploy:
    name: sample
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: install SSH key
        uses: shimataro/ssh-key-action@v2 # こちらのアクションがキモ
        with:
          key: ${{ secrets.SSH_KEY }} # 必須
          name: id_rsa # optional
          known_hosts: ${{ secrets.KNOWN_HOSTS }} # 必須
      - name: deploy
        run: bash deploy.sh

```
こちらをプロジェクトのルートディレクリ直下に`/.github/workflows`を作成して配置します。

```
Project Root
└── .github/
　└── workflows
    └── deploy.yml
```

## 2. デプロイ用のシェルスクリプトを用意する
- ご自身のプロジェクトに応じたデプロイ用のシェルスクリプトを用意します。今回私はDockerを利用していたので以下のようにしています。こちらもinstall SSH keyの作者様の記事を参考にしました。

```bash:deploy.sh
#!/bin/bash
# srcファイルをrsync over SSHで転送
rsync -acvz --delete ./src test@your.ip.addres:project/
# サービスを再起動
ssh test@your.ip.address "cd project/; docker-compose build; docker-compose down; docker-compose -f docker-compose.yml -f docker-compose-prod.yml up -d"
```

## 3. ローカルでGitHub ActionsがさくらVPSにアクセスするための秘密鍵・公開鍵のセットを作成する
```bash
# 認証鍵を生成する
ssh-keygen -t rsa -b 4096 -C "your@email"

# 作成した認証鍵を確認する
ls -la ~/.ssh/

# PEM形式に変換。OpenSSHのバージョンによってはPEM形式じゃないと駄目な場合があるらしい・・・
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa

# known_hostsを確認する。次でGitHubに登録します。
ssh-keyscan <server-hostname>
```

## 4. GitHubのSecretsに作成した秘密鍵とknown_hostsを登録する
- GitHub Actionsを利用したいリポジトリの「settings」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63564/96c9c43c-b9a0-ea5b-3dae-0245f9e81309.png)

- Secretsを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63564/f93656c9-b8ea-0483-853b-600223391358.png)

- New Secretを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63564/b10cbc72-93df-3f4c-2e35-ab0698c8db25.png)

- 作成しておいた認証鍵をそれぞれNameとValueを以下のように登録
    - 秘密鍵
        - Name:SSH_KEY
        - Value:~/.ssh/id_rsaの中身をコピペ
    - known_hosts
        - Name:KNOWN_HOSTS
        - Value:ssh-keyscanで出力された値をコピペ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63564/bd2f4789-fdfd-9675-15b6-25e33c6a265a.png)

## 5. さくらVPSのOpenSSHのバージョンをアップデートする
- こちらの記事を参考に進めました。（けっこう長いので以下のブログを参照してみてください）
- [CentOS7のOpenSSHのバージョンアップ](https://adan.jp.net/blog/programing/1741)

## 6. さくらVPSのSSH設定を確認する
- SSHの設定ファイル（`/etc/ssh/sshd_config`）で以下の設定になっているかを確認します。
- `PubkeyAuthentication yes`
    - 公開鍵認証がyesになっているかどうか
- `PasswordAuthentication no`
    - パスワード認証がnoになっているかどうか
- 設定を変更した場合は`sudo systemctl sshd restart`で反映します。

## 7. ローカルで作成した（GitHubに登録した）公開鍵をさくらVPSに登録する
- ローカルで下記を実施して、サーバーに公開鍵を登録します。

```
ssh-copy-id ${USER}@${target_host}
```

## 8. masterブランチにプルリク出してマージする
- これでGitHub Actions内からSSHする準備ができたので、実際に動かしてみます。
- masterブランチに適当にプルリクしてマージしてみてください。
- Actionsで確認してエラーになっていなければOKです。念の為、サーバーに反映されたか確認して完了です。

## 参考
- [「よく分かる公開鍵認証」～初心者でもよくわかる！VPSによるWebサーバー運用講座(2)](https://knowledge.sakura.ad.jp/3543/)
- [GitHub ActionsでSSHを使う](https://qiita.com/shimataro999/items/b05a251c93fe6843cc16)
- [CentOS7のOpenSSHのバージョンアップ](https://adan.jp.net/blog/programing/1741)