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

2021 年 08 月 25 日

現在このブログと、私のメインブログの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 という、マスターにプッシュされるたびに起動されるワークフローを用意しています。

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


 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 サイトを構築

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

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


  - 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 します。


 - 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でブログを構築してみてください。

前の記事
堀 正岳 (Masatake E. Hori)
2011年アルファブロガー・アワード受賞。ScanSnapアンバサダー。ブログLifehacking.jp管理人。著書に「ライフハック大全」「知的生活の設計」「リストの魔法」(KADOKAWA)など多数。理学博士。

Categories

Tags