CricleCIにHugoのビルドをさせる
July 13, 2016
Hugoでビルド結果ををS3にあげるのがだるいので、CircleCIにやらせることにします。
この記事ではS3へのアップロードまでを書きます。
S3で静的サイトをホストする方法や独自ドメインでアクセスさせる方法はここでは書きません。 (ググればいろいろ出てきます)
前提知識
Hugoでブログ記事をビルドする方法
Githubレポジトリを準備
ブログ用のレポジトリを作ります。
編集履歴自体を世に公開したくなかったので、今回はprivateで作りました。
利用するthemeをsubmoduleとして追加
利用するテーマをthemes
以下にsubmoduleとして追加します。
単純にgit cloneしただけだと、CircleCI上でpullしたときに中身が空になりビルドが出来ません。
もしhugo-cactus-themeを使うのであれば、
$ cd themes
$ git add submodule https://github.com/digitalcraftsman/hugo-cactus-theme
です。
S3アップロード用のアクセスキーを発行
AWSの管理コンソールで、CircleCIでブログをビルドするためのIAMユーザを作成し、アクセスキーIDとシークレットアクセスキーを生成します。
生成時の画面以外ではアクセスキーを取得できないなるので、タブを開きっぱなしにするか、ダウンロードしておきます。
ポリシーの作成
ブログ用のS3バケットに対して以下の権限を持ったポリシーを作成します。
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:DeleteObject"
]
awscli
のsync
による同期時に、同期元に存在しないファイルを削除するためにDeleteObject
権限を
つけています。
Resource
には、バケット自身とバケット内のリソース全てを指定します。
Resource: [
"arn:aws:s3:::ブログ用バケット",
"arn:aws:s3:::ブログ用バケット/*"
]
CircleCIにプロジェクトを追加
CircleCIの画面上からブログ用のレポジトリをプロジェクトに追加します。
circle.ymlを作成
レポジトリのルート直下にcircle.ymlを作成して、以下のように記述します。
machine:
timezone: Asia/Tokyo
checkout:
post:
- git submodule update --init
dependencies:
pre:
- go get -v github.com/spf13/hugo
- pip install awscli
test:
override:
- hugo
deployment:
master:
branch: master
commands:
- aws s3 sync public/ s3://バケット名/ --delete
テーマをsubmoduleで管理しているので、チェックアウトの後処理でsubmodule udpate --init
を実施します。
hugo
コマンドによるビルドはtest
コマンドとしています。デプロイの一部として扱う事もできますが、test
の設定が
ないとCircleCI上ではNO TESTS
としてエラー扱いになってしまいます。
S3へのアップロード自体は出来るのですが、CircleCIの結果一覧で赤くなるのは気分が良くないのでtest
でビルドするようにしています。
master
ブランチの時だけ、awscli
のsync
コマンドを使ってビルド結果が出力されるpublic
以下をブログ用のバケットに同期させます。
AWSの権限設定
Project Settings -> AWS Perissionsに、作成したIAMユーザのアクセスキーを設定します。
ビルド
ここまでやったら、記事がなくても一旦pushしてみましょう。 設定に問題がなければ、S3上のバケットにビルド結果がアップロードされているはずです。