CircleCIとは?
一言でいうとコマンド記憶装置です。
類似のシステムでcapistranoというものがあり、私のスクール時代の課題では、下記のコマンドをbundle exec cap deploy productionという1つのコマンドでまとめて実行していました。
CircleCIはそのコマンドもなく、クリックで当初設定したコマンド集を動かすシステムになっています。
つまり、いちいちコマンド忘れて調べたり、タイプミスに悩まされたりすることがなくなるという装置です。
# 本番環境でgithubからpullして、
git pull origin master
# mysqlをrestart->migrateして、
sudo service mysqld restart
rake db:migrate RAILS_ENV=production
# scss,画像をそれぞれcss,バイナリ表示にコンパイルして、
rails assets:precompile RAILS_ENV=production
# ユニコーン(railsアプリを動かしているもの)のプロセスをkillして、
kill xxxxx(masterのプロセスID)
# ユニコーンを立ち上げる
RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
メリット
一言でいうと、capistranoの上位互換で、ヒューマンエラーがなくなり、コマンドの検索が不要になるため業務効率が上がります。
どういうこと?(長いのでお急ぎの方まとめをご参照ください)
え?capistranoで十分では?となりそうなぐらいすごいのですが、CircleCIのメリットはデプロイ以外のコマンドもさらに実行できるところにあります。(自分が把握したところだと主にdocker,jenkins,terraform(環境構築のコマンド集)の実行をしていました)
おそらくこの記事をご覧になっている方は初学者の方が多いと思うのでもう少し噛み砕いて説明すると、仕事としてwebアプリケーションを作るのには、最低3つ同じものを動かす必要があります。
1.自分のパソコンで動かしながら作成するためのローカル環境(基本的に仕事(それも自社で提供している会社に限る)でなければ1しか使いません。)
2.お客様に提供する本番(プロダクト)環境
3.お客様に提供する際に万が一エラーが起きては困るので、本番と全く同じ状態のもので、リリースして本当に大丈夫か実験を行うステージング環境
1についてはnpm(ダウンロード用のソフト。hombrewみたいなもの)のバージョンが人によって違ったり、bashが本番環境だけど手元はzshを使っていたりといろいろ違ってくるので、dockerでバージョン管理されたものが手元で動くなら自分で必要なものをダウンロードして環境構築してもらえばいいのですが、2と3はどうでしょうか。
たしかに最悪動けばいいので、最初に作った人(Aさんとします)が情報通でダウンロード用に使うnpmを最新版(非安定バージョン。今ならver6.14)を使って、2だけを作ったとしましょう。
その後何らかの原因(転職など)でAさんがプロジェクトから離れた場合、ステージング環境は後続の人(Bさんとします)が作ることになります。
そのときに安定志向のBさんは安定版のnpm(今ならver6.10)を使って3を環境構築したとしましょう
さてここで読者の皆さんに質問です。dockerでバージョン管理しているから3で動けば2でエラーは起きないのでしょうか。
答えはNoです。環境構築用のソフトのバージョンが異なると動作用のコマンドが変わっていたり、ソフト同士の互換性が切られていたりするからです。
そのためあとから運用保守するようにAさんが手順書をエクセルなどで作っていたとしても、手順通り行かなかったり、docker以外のソフト同士の互換性がなくなっていたりして、ステージング環境が本来の役割を果たすことができなくなってしまいます。
このようなことを防ぐべく、現場ではエクセルでまとめたりしてすべてのバージョンをだれがやっても同じように作れるようにしたあと作業が行われています。
あれ?CircleCIは使っていない?と思った方はご安心ください。
確かにエクセルですべての手順書を作ってはいますが、それはログインIDが含むコマンドなど作業する人によって変わってきてしまうコマンドが主です。
CircleCIには作業する人に依存しない部分の殆どのコマンドを任せています。
そのおかげで現場では環境構築でヒューマンエラーが起きることがなくなり、コードを調べ直す時間がなくなるため業務の効率化を行うことができるのです。
そして今回の例でAさんがCircleCIを使っていれば、2のコマンド集を作り終えたと同時に3も終わったことになります。
このように同じ環境を作る、ないしは製品のバージョン更新をするために以前使ったコマンドをもう一度呼び出す際に楽で、ミスの予防に一役買ってくれるのがCircleCIというものです。
まとめ
CircleCIとは...
・コマンド記憶装置
・ほぼすべてのコマンドを使うことができます
・違う人が同じ環境を作成するのに適している
・ミスがなくなり、業務効率が上がる
・ローカル開発(リリースしない)なら正直必要ない。
ようなものです。
余談
筆者は技術アピールのためにポートフォリオにCircleCIを入れようとしていました。
最終的には入れる前に今の会社に内定をいただけたため使わなかったのですが、今の自分が昔の自分を見て「CircleCIが使えます( ・´ー・`)ドヤ」という顔で来たと考えたとき、なんでこんなかんたんなもの使えるだけでこんなイキってるんだろうと思ってたなと思います。
なので就活のアピール材料にしたいのであれば、CircleCIを使えることがすごいのではなく、CircleCIを使いたくなるポートフォリオ(ないしは製品)を作っているというのがすごいのだという認識を持たれると良いと思います。