---
title: "Github ActionsでConoha WINGにrsyncを使ってデプロイする"
generator: "Hugo Version: 0.164.0"
urlPrev: "https://mehori.com/blog/2020/05/hugo-theme-4/index.md"
urlNext: "https://mehori.com/blog/2022/03/initial-commit/index.md"
---

Github ActionsでConoha WINGにrsyncを使ってデプロイする


![](https://mehori.com/blog/2021/08/conoha-rsync/conoha-rsync.jpg)





現在このブログと、私のメインブログの[Lifehacking.jp](https://mehori.com/blog/2021/08/conoha-rsync/https://lifehacking.jp)はHugoサイトとして構築しています。

具体的には、ブログのデータはすべてGithubのリポジトリで管理しており、ローカルのリポジトリでおこなった編集がGithubにプッシュされた時点で、Github ActionsのスクリプトによってHugoをつかってサイトが構築され、レンタルサーバーに変更が送信されるという仕組みです。

Github ActionsをつかってHugoサイトを構築する方法についてはすでにさまざまなサイトで紹介されていますが、1. Github Actionsを使って、2. Hugo のサイトを、3. Conoha WINGにrsyncを使って同期するという場合の設定例にもニーズはあると思いますので自分のワークフローを紹介します。

## rsyncで同期するワークフロー

私の場合、リポジトリの `.github/workflows/` の下に `main.yml` という、マスターにプッシュされるたびに起動されるワークフローを用意しています。

ちょっと長いですが内容は以下のとおりです。

```yaml
 name: Build & Deploy

 on:
  push:
    branches: [ master ]
 jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 60

    steps:
    - uses: actions/checkout@v2
      with:
        fetch-depth: 0

    - name: Hugo Setup
      uses: peaceiris/actions-hugo@v2
      with:
        hugo-version: '0.87.0'

    - name: Hugo Build
      run: hugo

    - name: prepare .ssh dir
      run: mkdir -p .ssh && chmod 700 .ssh

    - name: ssh key generate
      run: echo "$WING_SSH_KEY" > .ssh/id_rsa && chmod 600 .ssh/id_rsa
      env:
        WING_SSH_KEY: ${{ secrets.WING_SSH_KEY }}

    - name: deploy to Conoha WING with rsync
      run: rsync -rlptgoD -O --delete --exclude ".git/" --exclude ".ssh/" -e "ssh -i .ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${WING_SSH_PORT}" ./public/ ${WING_SSH_USER}@${WING_SSH_HOST}:${WING_SSH_DIR}
      env:
        WING_SSH_PORT: ${{ secrets.WING_SSH_PORT }}
        WING_SSH_USER: ${{ secrets.WING_SSH_USER }}
        WING_SSH_HOST: ${{ secrets.WING_SSH_HOST }}
        WING_SSH_DIR:  ~/public_html/blog_folder/
```

## Github Actions で Hugo サイトを構築

部分部分に分けて見てみましょう。最初の数行は、`Master` に `push` があると起動すること、Ubuntu の環境をセットアップするようにしてあります。

次に `actions/checkout` を使ってリポジトリをチェックアウトして、Hugo でサイト構築をする準備をしています。

```yml

  - name: Hugo Setup
    uses: peaceiris/actions-hugo@v2
    with:
      hugo-version: '0.87.0'

  - name: Hugo Build
      run: hugo

```

次に、Shohei Ueda氏の `actions-hugo` を使ってHugoをセットアップし、サイトのビルドを行います。手元でインストールしたHugoでテストしたいのでHugoのバージョンは決め打ちでやっていますがlatestにしてもいいでしょう。

## ssh をつかって Conoha Wing サーバーに接続して rsync をかける

これで仮想環境内の `public` フォルダ内にサイトが構築されましたので、その内容をレンタルサーバーにむけて `rsync` します。

```yml

 - name: prepare .ssh dir
  run: mkdir -p .ssh && chmod 700 .ssh

 - name: ssh key generate
  run: echo "$WING_SSH_KEY" > .ssh/id_rsa && chmod 600 .ssh/id_rsa
  env:
    WING_SSH_KEY: ${{ secrets.WING_SSH_KEY }}

 - name: deploy to Conoha WING with rsync
  run: rsync -rlptgoD -O --delete --exclude ".git/" --exclude ".ssh/" -e "ssh -i .ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${WING_SSH_PORT}" ./public/ ${WING_SSH_USER}@${WING_SSH_HOST}:${WING_SSH_DIR}
  env:
    WING_SSH_PORT: ${{ secrets.WING_SSH_PORT }}
    WING_SSH_USER: ${{ secrets.WING_SSH_USER }}
    WING_SSH_HOST: ${{ secrets.WING_SSH_HOST }}
    WING_SSH_DIR:  ~/public_html/blog_folder/

```

この部分の前半ではConoha WINGのサーバーに接続するためにsshを設定しています。ここで事前準備が必要になりますが、Conoha WING側で設定した公開鍵をGithubの `secrets.WING_SSH_KEY` に設定しておき、ワークフローのなかで呼び出しています。

次にいよいよ `rsync` を実行します。ここでも事前準備として、Conoha WING側のサーバーのアドレス、ユーザー名、ポート番号を Github の secrets で定義しておき、`env` から呼び出しています。

あとは `.git` ディレクトリと、`.ssh` ディレクトリを除外して、`public` フォルダを指定されたフォルダに同期させています。Conoha WING の場合は、ブログを複数持っている場合に `public_html` の下のディレクトリで区別していますので、`~/public_html/blog_folder/` を設定しています。

`rsync` のオプションはよくあるものですが、` --delete` で同期元には存在しないファイルは Conoha WING 側から削除するようにします。参照されていないゴミファイルがどんどんと増えてしまってもいけませんので。

## 中規模なブログならば無料枠で十分に更新が可能

Github Actionsは利用時間が長いと課金されますが、このワークフローだと私の2000記事、数百MBのブログでも一回のデプロイに数分ですみます。私の場合、月に500回以上更新しても無料枠は越えませんので、Netlify などを使うよりもコストパフォーマンスが良いことになります。

知っている人にはそれほど難しくない内容だと思いますが、初めてやってみるというひとには参考になると思います。ぜひこれを応用してHugoでブログを構築してみてください。



