Github ActionsでConoha WINGにrsyncを使ってデプロイする
Hugoサイトをあっという間にデプロイできる
現在このブログと、私のメインブログの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 サイトを構築
部分部分に分けて見てみましょう。最初の数行は、Master
に push
があると起動すること、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でブログを構築してみてください。