GitHub Actions から VPS にSSH 接続して CI / CD 環境を構築する


この記事では、VPS にSSH 接続し、GitHub Actions で CI/CDを行うための環境を構築する方法を記事をまとめました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271708/3ffffba6-bb2d-a880-ba40-3a1dd9e292b4.png)

## はじめに

CI/CD ツール で VPS にSSH接続するためには**公開鍵認証**が行えるように環境構築する必要があります。 SSH 認証がうまくいかないと感じたら公開鍵認証ができるかどうかの確認をしてみてください。以下の記事の内容は、SSH 接続して、CI/ CD を行えるようにするための手順をまとめています。

環境については以下の通りです。
-  Client(PC) OS : Windows Pro
- Server(VPS) OS : Ubuntu 20.04
- CI/CD ツール: GitHub Actions
- VPS : Conoha VPS 

開発環境は Windows ですが、コマンド等の違いは特にありません。 

## Client サイド(PC)の環境構築
まず、SSH Key の秘密鍵と公開鍵を生成します。

```bash
ssh-keygen -t rsa -b 4096 -C "example@email.com"

# Enter file in which to save the key (/Users/<user>/.ssh/id_rsa): [Press enter]
#Enter passphrase (empty for no passphrase): [Type a passphrase]
# Enter same passphrase again: [Type passphrase again]
```

として、SSH で鍵を生成します。(Mac OS, Unix OS では `~/.ssh/id_rsa` に生成されます。)

## Server(VPS)サイドでの環境構築

続いて、 VPS での環境構築を行います。

VPS の管理画面より、VPS サーバーのコンソールを起動します。

まず、ユーザーの作成後、sudo が実行できるよう権限を与えます。

```bash
adduser conoha // User 名をconoha に設定した
usermod -aG sudo conoha

cd /home  
chmod 755 conoha // SSH の権限は 755 でないとしようできない
```
続いて、conoha アカウントでSSH 環境を設定します。

```bash
su conoha
mkdir ~/.ssh
chmod 700 .ssh  
```
この時、`scp` を使用して Client 側から VPS へ 公開鍵を渡します。

```bash
scp .ssh/id_rsa.pub conoha@<サーバーのIP アドレス>:.ssh
```
上記のコマンドを実行したのち、.ssh ディレクトリ内に `id_rsa.pub` が送付されていることを確認してください。`送信後、

```bash
cd ~/.ssh
mv id_rsa.pub authorized_keys 
chmod 600 authorized_keys
```

として、ファイル名変更後、ファイルの権限を制限します。

その後、 vi を使用して`/etc/ssh/sshd_config` ファイル内の次の変数の値を編集し、公開鍵でのログインしか許可しないようにします。

```bash
$ sudo vi /etc/ssh/sshd_config

PermitRootLogin no
PubkeyAuthentication yes 
PasswordAuthentication no
usePAM no 
```


編集後、SSH を再起動します。

```bash
sudo /etc/init.d/ssh restart
```

この時、Client 側から 

```bash 
ssh -i .ssh/id_rsa conoha@<IP アドレス>
 ```

としたとき、パスワードが要求されずにログインができたら成功です。

上記の通りに実行しても、もしうまくいかなかったら、`/home/conoha` のファイルの権限を 755 に変更し、SSH を再起動してみてください。

```bash
cd /home
chmod 755 conoha
cd conoha 
sudo /etc/init.d/ssh restart
```

## GitHub Actions の実装について

続いて、GitHub Actions の環境を構築します。

まず、GitHub Actions で管理しているリポジトリに移り、"Actions" ボタンをクリックします。

![2021-04-10 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271708/41516cc4-8497-9c02-ffce-f36f08657a12.png)

このページで、任意に作りたい Workflow を追加し、CI の設定を作成していきます。

今回のデプロイでは、ビルドやテストを行わず、main ブランチに push され次第 VPS へ
デプロイするように設定します。そこで、上記のページでは、`Simple workflow` の
`Set up this workflow` をクリックし、以下のYML ファイルを作成しました。

```.github/workflows/deploy.yml
name: CI
on:
  push:
    branches: [main]
  pull_request:
    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.SK }}
          host: ${{secrets.SSH_HOST}}
          username: ${{secrets.SSH_USERNAME}}
          port: ${{secrets.SSH_PORT}}
          script: |
            cd conoha-app
            git pull origin main     
```

デプロイ後、VPS を操作するために [appleboy/ssh-action](https://github.com/appleboy/ssh-action) を使用しました。

上記のファイルを作成後、セキュリティの観点から ファイルにVPS を接続するための設定がほかの人に見られるのは好ましくありません。とりわけ、鍵認証での接続において、SSH の Secret Key 情報が漏洩することはあってはならないことです。

そこで、人に見られたくない変数については各リポジトリにて、 `Setting` → `Secrets` へ移動後、`New repository secret` にて追加したいリポジトリを追加します。

![2021-04-10 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271708/67f94750-3b97-0f39-74d1-b11f955ee5ee.png)

ここで、New secret にて、`Name` で変数名を設定し、`Value` で呼ばれる値を設定します。

今回は次のように設定しました。

- SK:**（ローカル環境で設定した）SSH の 秘密キー**
- SSH_HOST: VPS の IPアドレス
- SSH_USERNAME: VPS で設定したユーザーネーム(今回は 'conoha' )
- SSH_PORT: SSH へ接続する PORT 番号（デフォルトは 22）

これで、GitHub Actions の設定は完了です。

この状態で、コード変更後、Github へ push して、VPS へデプロイができているかどうかの確認を行ってください。GitHub　Actions から VPS へ接続できて変更したコードが反映されていれば成功です。