GitHub Actions で ConoHa WING にデプロイしてみた

# はじめに

[GitHub Actions](https://github.com/features/actions) を使って GitHub から [ConoHa WING](https://www.conoha.jp/wing/) にデプロイしたいなと思って試してみたのでその忘備録です。誰かの役に立てばうれしいな。

**この記事のリメイクを Zenn にて公開しました。そちらも併せてお読みいただければと思います。**
**[ConoHa WING に GitHub Actions でデプロイしよう！](https://zenn.dev/su8ru/articles/deploy-to-conoha-wing)**

# 概要

今回の流れは
1. ローカルからGitHubにpush
2. GitHub Actions が検知して CI が走る
3. ConoHa WING に`lftp`でデプロイ
という感じでいけるんじゃないかなと。
ConoHa WING は rsync が使えないようなので lftp を使うことにします。

> **2020.12.19 注**
> 現在では ConoHa WING でも **rsync が使用可能** となっています。
> :point_right: [ConoHa WING に GitHub Actions でデプロイしよう！](https://zenn.dev/su8ru/articles/deploy-to-conoha-wing)

ConoHa WING 視点では
- [ConoHa Wing で自動デプロイして快適に WordPress テーマを更新しよう！ - Qiita](https://qiita.com/ezaki/items/9f22b48e3ad83d226160) (@ezaki さん)
GitHub Actions 視点では
- [GitHub Actions で快適なデプロイを実現する(rsync・laravel) | 自主的20%るぅる](https://www.agent-grow.com/self20percent/2019/09/24/github-actions-rsync/) 
を参考にしています。

# ではいってみよー！

## まずは完成形を
動けばいいって人はこれをコピペして`env:`のところをいじってあげれば動くはず。(あと秘密鍵登録もね)

```yml:deploy.yml
name: Deploy to ConoHa WING

on:
  push:
    branches: 
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v1
      - name: install lftp
        run: sudo apt-get update && sudo apt-get install -y lftp
      - name: prepare .ssh dir
        run: mkdir -p .ssh && chmod 700 .ssh
      - name: ssh key generate
        run: echo "$SSH_PRIVATE_KEY" > .ssh/id_rsa && chmod 600 .ssh/id_rsa
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      - name: deploy with lftp
        run: lftp -e "set net:max-retries 1; set sftp:connect-program \"ssh -a -x -p $SSH_PORT -i .ssh/id_rsa -o StrictHostKeyChecking=no\"; connect sftp://$SSH_USER:@$SSH_HOST; mirror -eR -x .git -x .ssh ./ $SSH_DIR; quit"
        env:
          SSH_PORT: 8022
          SSH_USER: c5949433
          SSH_HOST: www51.conoha.ne.jp
          SSH_DIR:  ~/public_html/deploy-test.conohawing.com/blog/wp-content/themes/deploy-test
```

## 初学者なりに解説！
### workflowの名前   
```yml
name: Deploy to ConoHa WING
```  
これは自分でわかりやすい名前を入れればいいと思います。一覧に出てくるので、workflowがたくさんあるときはしっかりと付けたほうがいいかも。
![Imgur](https://i.imgur.com/Ff0F1RP.png)

### トリガー  
```yml
on:
  push:
    branches: 
      - master
```
- `push:` : pushされたとき
- `branches:` : ブランチ指定
- `- master` : masterブランチ

最後が箇条書きなことから分かる通り、ブランチはたくさん指定できます。
トリガーにはいろいろ種類があるのでたくさん試してみると楽しそう。

### 実際にするお仕事
```yml
jobs:
  deploy:
    runs-on: ubuntu-latest
```
`jobs:` : ここからが実際にするお仕事の記述になります。
`deploy:` : 好きなidをつけることができます。これもわかり易い名前でOK。
`runs-on: ubuntu-latest` : ここではUbuntuを指定しています。Linuxが一番安いので基本的にはUbuntuでいいんじゃないかなと。WindowsとmacOSもあるようです。

そして本題の仕事内容です。

```yml
    steps:
      - uses: actions/checkout@v1
      - name: install lftp
        run: sudo apt-get update && sudo apt-get install -y lftp
      - name: prepare .ssh dir
        run: mkdir -p .ssh && chmod 700 .ssh
      - name: ssh key generate
        run: echo "$SSH_PRIVATE_KEY" > .ssh/id_rsa && chmod 600 .ssh/id_rsa
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      - name: deploy with lftp
        run: lftp -e "set net:max-retries 1; set sftp:connect-program \"ssh -a -x -p $SSH_PORT -i .ssh/id_rsa -o StrictHostKeyChecking=no\"; connect sftp://$SSH_USER:@$SSH_HOST; mirror -eR -x .git -x .ssh ./ $SSH_DIR; quit"
        env:
          SSH_PORT: 8022
          SSH_USER: c5949433
          SSH_HOST: www51.conoha.ne.jp
          SSH_DIR:  ~/public_html/deploy-test.conohawing.com/blog/wp-content/themes/deploy-test
```
なんかいっぱいありますね…１つずつ見ていきましょう。
`steps:` 以下に`uses:`あるいは`name:`と`run:`の組み合わせで記述していきます。
- `uses:` : workflowの再利用ができる。
- `name:` : ログに出てくる名前。わかりやすいものならなんでもよい。
- `run:` : 実行内容。ここに書いたコマンドが実際に動くみたい。

#### リポジトリをcheckout
```yml
      - uses: actions/checkout@v1
```
[`actions/checkout`](https://github.com/actions/checkout) というworkflowを再利用しています。他にもいろいろあるようです。

#### lftpをインストール
```yml
      - name: install lftp
        run: sudo apt-get update && sudo apt-get install -y lftp
```
先述したとおり、`rsync`が使えないので`lftp`をインストールしています。
参考サイトそのまんまなのですが、`sudo`が抜けてることに気づかなくてハマった。

#### .sshディレクトリを作る
```yml
      - name: prepare .ssh dir
        run: mkdir -p .ssh && chmod 700 .ssh
```
正直何も考えずにそのへんに秘密鍵を置いといてもいい気はしますが、一応ちゃんとディレクトリを作ります。

#### 秘密鍵の配置
```yml
      - name: ssh key generate
        run: echo "$SSH_PRIVATE_KEY" > .ssh/id_rsa && chmod 600 .ssh/id_rsa
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
```
`env:`は、環境変数の定義をするものです。ここでは`SSH_PRIVATE_KEY`に`${{ secrets.SSH_PRIVATE_KEY }}`を割り当てています。
リポジトリのSecretsに秘密鍵を登録するのを忘れずに！
![Imgur](https://i.imgur.com/Td3B9Jh.png)

#### lftpでdeploy
```yml
      - name: deploy with lftp
        run: lftp -e "set net:max-retries 1; set sftp:connect-program \"ssh -a -x -p $SSH_PORT -i .ssh/id_rsa -o StrictHostKeyChecking=no\"; connect sftp://$SSH_USER:@$SSH_HOST; mirror -eR -x .git -x .ssh ./ $SSH_DIR; quit"
        env:
          SSH_PORT: 8022
          SSH_USER: c5949433
          SSH_HOST: www51.conoha.ne.jp
          SSH_DIR:  ~/public_html/deploy-test.conohawing.com/blog/wp-content/themes/deploy-test
```
長いですね。細かい解説は[参考サイト](https://qiita.com/ezaki/items/9f22b48e3ad83d226160#rsync-%E3%81%A7-conoha-wing-%E3%81%B8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%8F)を見てもらうとして、コピペで環境変数だけ書き換えても動きます。
ポートとかユーザーとかはConoHaの管理画面から確認してください。

# できたー！！
実際に動くとこんな感じになります。実行中にログが流れるの楽しいｗ
![Imgur](https://i.imgur.com/oQ0tbVB.png)

今回はdeployしましたが、他にもbuildとかtestとかいろいろできるみたいです。
まだ情報が少ない感はありますが、ドキュメント見たりググったりしながら頑張ってみてください！