Hiroto's diary

プログラミング関連を書くかも

hugoでブログを生成してTravis CIでデプロイする

最近新しく鉄道関連用のブログをGitHub Pagesに作った。

このブログの本文は全てMarkdownで書いていて、GithubにpushしたらTravis CIで自動的にサイトを生成してデプロイするようになっている。

サイトを作った時のメモ適当に。

GitHubリポジトリを作る

自分はリポジトリ名をblogにして作ったので、ここではリポジトリ名をblogで説明します。

hugoでサイトを作る

公式のドキュメントを読んでhugoをインストールする。テーマなどもドキュメントを読めば大体書いてあるのでインストールしておく。

テスト用に記事を作ってhugo serverで確認しておくと便利。

ここで一回commitをしておく

git add .
git commit -m "First commit"
git push origin master

gh-pagesブランチを切る

先に切っておかないと不便なのでブランチを切って適当なコミットをする

git symbolic-ref HEAD refs/heads/gh-pages
rm .git/index
git clean -fdx
echo "blog" > README.md
git add .
git commit -m "First commit"
git push origin gh-pages

Travis CIの設定をする

.travis.ymlを書いて自動デプロイするようにする。

GitHubトークンを取得する

curlトークンを取得する。USERは置き換えてください。出てきたトークンはメモしておく。

curl -X POST -u USER -H "Content-Type: application/json" -d "{\"scopes\":[\"public_repo\"],\"note\":\"token for pushing from travis\"}" https://api.github.com/authorizations

暗号化してTravisCIに渡すために、RubyGemsからtravisをインストールする

gem install travis

暗号化をする。USERGithubのユーザー名、REPOリポジトリ名、TOKENは先ほど取得したトークンに置き換えてください。

travis encrypt -r USER/REPO GH_TOKEN=TOKEN

実行して出てきた結果は保存しておく。

デプロイするシェルスクリプトを書く

.travis.ymlに一行ずつ書いてると骨が折れるので単一のファイルにまとめて書く。

${USER}/${REPO}は置き換えてください。

script/deploy.sh

#!/bin/bash

set -eu

# hugo関係のファイルを置く場所。
HUGO_DIR=./hugo
echo "HUGO_DIR : ${HUGO_DIR}"

# hugoのバイナリファイル
HUGO_BIN="${HUGO_DIR}/hugo"
echo "HUGO_BIN : ${HUGO_BIN}"

# サイトを生成するディレクトリ
DIST_DIR=./public
echo "DIST_DIR : ${DIST_DIR}"

# hugoのファイルがなかったらダウンロード
if [ ! -e "${HUGO_DIR}" ];then
  echo "Download hugo bin"

  HUGO_PACKAGE=hugo.tgz
  echo "HUGO_PACKAGE : ${HUGO_PACKAGE}"

  echo "Create '${HUGO_DIR}'"
  mkdir ${HUGO_DIR}

  cd ${HUGO_DIR}
  wget -O ${HUGO_PACKAGE} https://github.com/spf13/hugo/releases/download/v0.16/hugo_0.16_linux-64bit.tgz
  tar -xvf ${HUGO_PACKAGE}
  cd ..
fi

# DIST_DIRが無かったらGitHubからclone
if [ ! -d "${DIST_DIR}" ];then
  echo "Clone via GitHub"
  echo "Clone to '${DIST_DIR}'"
  git clone https://${GH_TOKEN}@github.com/${USER}/${REPO} ${DIST_DIR} --depth 1 --branch gh-pages > /dev/null 2>&1
fi

# サイトを生成
echo "Compile site"
${HUGO_BIN}

# 変更があったらcommit
cd ${DIST_DIR}
git add .
d=`date +"%Y/%m/%d %k:%M:%S"`
git diff --cached --exit-code --quiet || git commit -m "Update blog at ${d}"

# GitHubにpush
echo "Push to GitHub"
git push origin gh-pages > /dev/null 2>&1
echo "Successfully deployed."

.travis.ymlを書く

以下のは最低限。必要な場合は自分で追加してください。

language : bash

script :
  - bash ./script/deploy.sh

env:
  global:
    secure: "travis encryptで出てきた値"

適当にコミットしてテストする

適当なファイルに空行を入れるなりしてTravis CIを走らせる。

設定を変更

デフォルトの設定だとURLが長くなったりサマリーが省略されなかったりで不便なので色々設定する。