Concourse CI を導入してみる(concourse web server の構築)
社内チームで扱うプロジェクトが増えたので、リリースタスクやテストの実行によるヘルスチェックを半自動化するために、CI環境を用意することにしました。
個人的にはあまりこの辺に興味がなくて(というかJenkinsに興味がなくて)全然触ってなかったのですが、この機会にConcourse CIを調べてみました。
やりたかったこと
実現したかったポイントとして、社内でサーバを管理するのが面倒なので、
- ビルドもインフラもコードで管理したい
- CIサーバとビルドサーバを分けて構築し、それぞれを簡単に変更したい
といった点を考えていました。特にハードウェアの制限からサーバの移行などを実施するときに簡単に実施できるようにしておきたいと思っていて、極力CIサーバにデータを保存させたくないと思っていました。
究極的には各メンバの開発PCとかに分散させて空いているところで特定のスクリプトを実行するようなシステムでもいいと思っていて、最悪自作しようかなと思っていました。(それはそれでおもしろそうですが。)
また、CIを管理するメンバとそうでないメンバがいたりしないようにしたいとも思っていました。
そこで、Concourse CIに目をつけました。
Concourse CI on Docker and Vagrant
Concourse CI の紹介記事などはいっぱいあるので、ここでは Concource CI の基本構造を仮想化して簡単にサーバを構築するための Provisioning を用意してみました。
Concourse Docker
Concourse 公式が用意している Docker Compose を利用します。
Docker engine と Docker compose がインストールされている環境であれば、このサーバを建てるのは README にある通りなので簡単ですが、MacOS や Windows Server 上でサーバを建てるにあたって、Docker daemon の起動にハードルがあったりするようなので、この Docker イメージをホストするための VM を Vagrant で準備することにしました。(実際 Mac だと Docker for Mac の起動は launchctl から実施できない)
Vagrantfile
まず、Box の選定ですが、Docker のホストイメージなので、boot2docker のように軽くて小さい、BargeOS を利用することにしました。
BargeOS は元々 Docker をホストすることを想定している Linxu イメージで、非常に小さくて軽量です。また、公式に Vagrant Box も公開されています。最初から Docker engine のインストールもされています。
あとは、Vagrantfile を書いていくだけです!
Concourse + Vagrant
まず手始めにググってみたところ、まさにコレという環境を作っている方が記事を投稿されていたので、そのまま参考にさせていただきました。
Vagrantfile の configuration はほとんどそのまま利用させていただきました。最初に自分も vagrant の file sync で実施してみたのですが、permission 問題があったので、面倒なので vdi の戦略もそのままいただきました。m( )m
あとは、基本的に Docker で構築するサービス部分を docker concourse の内容に置き換えていくだけでした。
最後に、Concourse の方と Vagrantfile の方でいくつか共通で設定をしたい内容があったので、それらを config として外だしして、vagrant up 実行時に適用する改修を行いました。そのアプローチは、下記の stackoverflow を参考にさせていただきました。
まとめ
実際は、Docker for Mac で concourse を建てて daemon 化の実験から始まって、Vagrant + ubuntu イメージで最初の VM 化を実施したりしていました。最初の戦略では、Box 自体を作成してその中に concourse 環境をパッケージするつもりでした。しかし、最終的な project のとおり、docker-compose と vagrant の provisioning で実施できるようになったので、取り回しが良くなってよかったと思います。(上記 Qiita 記事を投稿された akabe87 さんに感謝)