くりにっき

フルスタックキュアエンジニアです

Packer with mitamaeこぼれ話 #技術書典

Packer with mitamae のおまけというか付録みたいなやつ

sue445.hatenablog.com

副産物

sue445/vagrant-aws

vagrantvagrant-awsvagrant-serverspecがインストールされてるDockerイメージです

https://hub.docker.com/r/sue445/vagrant-aws/

github.com

CircleCI上でVagrantvagrant-awsを使おうとするとvagrant-awsのインストールにそこそこ時間がかかって*1つらかったので、Dockerイメージを自分で作りました。

https://github.com/sue445/dockerfile-vagrant-aws/blob/master/.circleci/config.yml を見てもらえれば分かると思いますが、Vagrantの最新版が出ると自動でDockerfileを更新してtag push&Dockerイメージの自動アップデートをするようにしています。

特定のミドルウェアのDockerイメージを自動更新したい場合に参考になるかと思います。

この辺の最新のバージョンを取得する部分だけ変えてやれば他のDockerfileリポジトリでも流用できるはず。*2

https://github.com/sue445/dockerfile-vagrant-aws/blob/1c73ea65415a649635d36d727519f8441445676e/.circleci/config.yml#L63-L66

packer-provisioner-serverspec

packerでserverspecを使うためのprovisionerです

github.com

https://github.com/unifio/packer-provisioner-serverspec をforkしてるだけなんですが、本家でバイナリを提供してなくて不便だったので自分でビルドしたバイナリをReleasesに置いています。

https://github.com/sue445/packer-provisioner-serverspec/releases

fork元とfork先でコードレベルでの差分はありません。

執筆中に気づいたのですが、Packerはgolang製のバイナリで実行環境に依存しないのがウリなのに、packer-provisioner-serverspecはserverspecを実行するために実行元にRubyがインストールされている必要があるのがイケてないんですよね。。。

provisioner内でDockerのコンテナを起動してその中でserverspecを実行すればまだマシになるとは思ってるのでそのうちなんとかしたいという思いはあります。(思いだけ)

Packer以外の事例だと https://www.npmjs.com/package/serverless-python-requirementsdockerizePip がDockerコンテナ内で pip install しているので同じようなことをやればいいはず。

書名がPacker with mitamaeなのにどうしてリポジトリ名がtechbookfest5-itamaeなのか?

github.com

最初はmitamaeじゃなくてItamaeでやろうとしてたのですが、やりたいこと的にmitamaeの方が筋が良さそうということに気づいて方向転換しています。

途中で方向転換したのがこのコミットです。

https://github.com/sue445/techbookfest5-itamae/commit/5307461804342b1e0af2fac7151da7aa95e06506

途中でリポジトリ名を変えるという手もあったのですが、リポジトリ名を変えた時にCircleCIの挙動がどうなる(再設定すれば勝手に同期してくれるのか、作り直しになるのか)か自信がなかったのでそのままにしてます。

書こうと思ってやめたこと

最初にサンプルプロジェクト( https://github.com/sue445/techbookfest5-itamae )を一通り作ってから執筆したのですが、サンプルプロジェクトにあって紙面にない要素があります

rubocop-itamae

github.com

せっかく自分が作ったものだし一応rubocopの静的チェックを入れてはいるのですが、実際に執筆しようとするとPackerでmitamaeを使うという本質から外れてしまうのでオミットしました。

執筆期間

  • サンプルプロジェクト作成:2週間
  • 執筆:4週間
  • レビュー:1ヶ月間

執筆自体は9月頭に終わっていて、技術書典までの残り1ヶ月間をレビューや当日の準備などにあてています

執筆用のリポジトリのコミット頻度はこんな感じです。

f:id:sue445:20181014170513p:plain

被チェック数

f:id:sue445:20181014170855p:plain

マイページの被チェック数を定期的に取得してスプレッドシートに送りつけてグラフ化してたのですが、技術書典の開催中も被チェック数が増えていて面白かったです。

f:id:sue445:20181014170915p:plain

*1:10分くらい

*2: 実際このリポジトリの設定も https://github.com/sue445/dockerfile-heroku-cli/blob/master/.circleci/config.yml をほぼ流用しています