GIthubActionsでpushごとにデプロイする

<h2>前書き</h2>
Lightsailに載せているGithubのプロジェクトをデプロイする際にpushしたタイミングで自動的に展開できるようにGithubActionsを利用しました。

<h2>事前準備</h2>
SSHで接続できるユーザの作成とプロジェクトをcloneしておきます。<br>
また、鍵関係は<a href="https://qiita.com/dioh09/items/f5cc69954c2df84833c0">以前の記事</a>で取得した内容を利用することを想定して記載していきます。

<h2>GithubActions</h2>
GithubのリポジトリでActionsから設定していきます。
<h3>公開鍵の設定</h3>
接続するユーザの公開鍵をリポジトリに設定します。<br>
Github上のリポジトリ画面から「settings」→「deploy keys」から「add new key」と進み、
フォームのkey欄に公開鍵の内容を張り付けて「Add Key」で保存します。

![new_key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314585/49b75a9b-3a14-45cc-dc2f-a6ecc522a698.png)

<h3>その他設定</h3>
その他、デプロイに必要な情報もGithubの管理とすることで秘匿でき入力の手間などが省略できます。<br>
「Secrets」の「Actions」から<br>
こちらも同様に名前と内容を入力して保存していきます。

:::note warn
内容を後から再表示することができないため、誤字などは注意しましょう。
:::

![new_secrets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314585/e6e96d1b-e44c-8737-e28a-12ac0a7e98ed.png)

以下のように設定しました。設定した環境変数は後ほど参照します。

| 名称 | 概要 | 
|-----------|------------|
| SVR_IP | デプロイしたサーバのIPアドレス|
| SSH_PORT| SSHに使用するポート番号 |
| DEPLOY_USER| SSH接続に使用するユーザ名 |
| DEPLOY_PRIVATE_KEY| 暗号鍵の内容 |
| SVR_DIR | デプロイしたプロジェクトのサーバ上のパス |


<h3>ワークフローの追加</h3>
<a href="https://docs.github.com/ja/actions/quickstart">ドキュメント</a>を参考に
Github上から「Actions」の「New Workflow」と進むと実行するワークフローをテンプレートから選択できます。<br>
今回は一から書いていくので最上部に表示されている「set up a workflow yourself」を選択します。

![workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2314585/d0f7aa38-cbab-b1ac-bfb2-b46f7f1632bb.png)

ワークフローを書き込むことができますが、一旦そのまま「start commit」で空のファイルだけ作成します。この時にファイル名も入力できます。<br>
コミットすると以下の場所のディレクトリにymlファイルが作成されます。

```
リポジトリ
├──.git
├──.github
│   └──workflows
│      └──xxx.yml
└──...
```

<h3>ワークフロー</h3>
今回は以下のようにしました。

```
name: CI

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SVR_IP }}
          username: ${{ secrets.DEPLOY_USER }}
          port: ${{ secrets.SSH_PORT }}
          key: ${{ secrets.DEPLOY_PRIVATE_KEY }}
          script: |
            cd ${{ secrets.SVR_DIR }}
            git pull
```

各部分でそれぞれの挙動を設定できます。

https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions

```
on:
  push:
    branches:
      - main
```

ここでmainのブランチにpushされた際にワークフローが動きます。branchesで監視する対象を指定できます。
jobs以下に実際の内容を設定していきます。今回の例では `build`という名前のジョブを作成しています。 各ジョブはjobs-onで実行環境を指定できます。
具体的な内容は以下の部分になります。

```
steps:
  - name: Deploy
    uses: appleboy/ssh-action@master
    with:
      host: ${{ secrets.SVR_IP }}
      username: ${{ secrets.DEPLOY_USER }}
      port: ${{ secrets.SSH_PORT }}
      key: ${{ secrets.DEPLOY_PRIVATE_KEY }}
      script: |
        cd ${{ secrets.SVR_DIR }}
        git pull
```

usesで別のワークフローを再利用することができます。今回はSSH接続を行うものを指定しています。

https://github.com/appleboy/ssh-action

また、それ以降で実際に使用するパラメータを設定しています。先述の環境変数を読み込むことで内容を秘匿しながら利用できます。

| 名称 | 概要 | 
|-----------|------------|
| host | 接続先 |
| username| 接続するユーザ名 |
| port| SSH接続に使用するポート |
| key| 暗号鍵の内容 |

最後の`script`が実際に接続した後のコマンドです。今回は移動してpullするだけですが、コンパイルなどをさせるのもありかもしれません。

<h3>コミットする</h3>
ワークフローを保存してコミットするとGithub上のActionsの画面でワークフローの結果を確認できます。

<h2>まとめ</h2>
<a href="https://qiita.com/dioh09/items/f5cc69954c2df84833c0">前回の記事</a>と合わせてLightsail上の環境でGithubActionsを利用してデプロイする方法をまとめました。<br>
Lightsailで鍵関係を作成してSSHさせるだけなので非常に手軽に試すことができます。<br>
他にもGithubActionsで自動化できるフローは多いので、積極的にワークフローを作成していきたいですね。

<h2>参考文献</h2>
https://docs.github.com/ja/actions/quickstart<br>
https://github.com/appleboy/ssh-action<br>
https://qiita.com/azusanakano/items/8dc1d7e384b00239d4d9<br>
https://zenn.dev/hashito/articles/7c292f966c0b59<br>
https://hsmtweb.com/tool-service/github-actions.html<br>
https://qiita.com/HeRo/items/935d5e268208d411ab5a