はじめに

すでにGitHub上にJekyllのコード自体が存在して、ローカルでjekyll buildで _siteに出力されることを確認している

S3上のコンテンツをCloudFrontを使用し配信している。

参照:独自ドメインを使用してS3上の静的ウェブサイトをRoute53を使用し公開する

手順

Code PipelineとCode Buildでパイプラインを作る

パイプラインを作成するを選択

1.パイプラインの設定を選択する

ここではパイプライン名を設定します (このパイプライン名は変えられなくなるので注意)

次にを選択

2.ソースステージを追加する

ソースプロバイダーGitHub(バージョン2)を選択する

GitHub(バージョン1)は非推奨の為、使用しない

GitHubに接続するを選択

接続を作成する

接続名(任意)を入力する

auth認証にて接続する

新しいアプリをインストールするを選択

すべてのリポジトリでもよいが、必要以上に権限は不要かと考え、対象のリポジトリのみとする

Installを選択

パスワード入力後、先ほどの画面にて接続を選択

対象リポジトリとブランチを入力

次にを選択

3.ビルドステージを追加する

プロバイダーを構築するはAWS CodeBuildを選択

プロジェクトを作成するを選択

プロジェクトの設定

プロジェクト名(任意)を入力する

環境を以下のように設定する

Buildspec、バッチの設定、ログからオプショナルの部分のチェックを外す

※ログの出力が必要になった際は、再度設定する

CodePipeLineに進むを選択

戻ると作成したプロジェクトが自動で入力されている

次にを選択

4.デプロイステージを追加する

以下のように設定する

デプロイする前にファイルを抽出するのチェックを忘れるとZIPファイルとして出力されてしまう為、注意

次にを選択

作成内容の確認を行い、パイプラインを作成するを選択

buildspec.ymlを作成する

CodeBuildでどのような処理をするか指示するファイル(buildspec.yml)を作成し、リポジトリのルートディレクトリに保存する

version: 0.2

phases:
  pre_build:
    commands:
      - export LC_ALL="en_US.utf8"
      - bundle install
  build:
    commands:
      - bundle exec jekyll build

artifacts:
  base-directory: '_site'
  files:
    - '**/*'

リポジトリへコミット&プッシュ後、問題なくデプロイされたことを確認した。

おわりに

build、deployは完全に自動化できたが、CloudFrontのキャッシュクリアが必用であることを忘れていた。

S3の更新イベントを使用してLambdakから動作させることが可能そうなのでまた、別の機会に対応する

参考

実は、ローカルのbundlerが古いことにより、エラーが発生した。ローカルのbundlerを最新にし、Gemfile.lockをupdateすることにより解決

bundlerの最新時、入力コマンド

bundle update --bundler

デフォルトで使用しているコンピュータがbuild.general1.largeの為、このままだと、Codebuildでbuildのたび、1分/0.02$料金が発生する。build.general1.smallであれば1月あたり100分まで無料の為、こちらに変更する

CodeBuildの環境を編集するより、追加設定を選択。コンピューティングの欄を3 GB メモリ、2 vCPUに設定