• 株式会社リッチメディア
  • ビューティー・サロン事業部 開発グループ リーダー
  • 黒田 裕己

すべて無料!クラウドなし! Dockerで離れたエンジニア同士を繋ぐ仕組み

今回のソリューション:【Docker/ドッカー】

働き方のスタイルが多様化した現代社会においては、職種を問わずリモートで働く会社員も増えてきた。特にチーム開発を行うエンジニアにとってその場合に課題になるのは、各々の手元で書き上げたソースコードをどのように集め、ステージング及び本番環境に乗せていくかということだ。

この課題解決のためには、一般的にはクラウドサーバーの活用が考えられる。しかし創業期のスタートアップ企業では、そのコストも気になるところだ。

そこで参考にしたいのが、株式会社リッチメディアでヘアスタイルスナップサービス「HAIR(ヘアー)」のサーバーサイドの開発を1人で手かげてきた、新卒2年目の黒田 裕己さんの事例だ。黒田さんは遠隔地で働くインターン生とのチーム開発体制を「クラウドなし」で構築するために、Docker+Jenkins+Slackのチャットオペレーションを組み上げた。そのソリューションに至った背景と活用法を聞いた。

インターン時代からサービス開発のサーバーサイドを1人で担う

2014年に新卒で入社して、今2年目になります。ヘアスタイルスナップを共有するWEBサービス「HAIR(ヘアー)」のサーバーサイドの開発をしています。立ち上がったのは2014年の5月15日ですが、学生時代からずっとインターンとして開発に参加していました。むしろ後半戦は、ほぼひとりで開発していたイメージです。入社してからも、基本的にはずっと1人でした(笑)。

もともと学生時代にパズドラ、Facebook、twitterなどが流行って、それが技術に興味を持ったきっかけです。いろいろな企業でインターンをさせて頂きながら技術を身につけて、それを評価して頂いて大手ゲームプラットフォーム企業に内定を頂きました。そこでまた時間ができたのでインターンしようと思い、出会ったのがリッチメディアです。

そのインターンで一緒に働いていたメンバーがとても熱くて、仕事のやり甲斐も感じられて。これからのエンジニアは本当に、技術だけではなくてもっとビジネスサイドに寄っていく必要があると思っています。設計も開発もわかった上で、マーケティングのことも、営業の人の気持ちも、運用のことも全てわかった上でサービスを作っていくことが大事になると考え、それが学べる環境はこちらだ、と思ってリッチメディアへの入社を決めました。

ようやくチーム化 リモートインターンで、学生2人が開発に参加

ずっとHAIRのサーバーサイドを1人でやってきたんですが、2ヶ月ほど前にやっとチーム化されたんです。金沢にいる内定者の大学生2人に、リモートインターンという形で参加してもらうことになりました。開発の途中から人が入ってくるってなかなか難しいことなんですよね。それまでは全部、自分仕様にカスタマイズした環境の中で開発していたので。それをどうやって離れたところにいる2人に共有していこうかという課題がありました。

最初は手探りで情報共有や開発の体制を模索していましたね。そして大きな課題として出てきたのが、ステージング環境へのデプロイです。インターンの2人がどんどん開発をしてくれて、すごいスピードでコミットして回してきてくれて、大量のマージが僕のところに来るようになりました。ステージング環境にデプロイする権限があるのが僕だけだったので、毎回毎回デプロイしていて、その工数が非常に大きくなってきてしまったんです。

僕もずっと席にいるわけではないので、コミットしたあとインターンの2人がステージングに上がるのを「待っている」時間ができてしまっていたんですよね。もしその2人が社員だったらいろいろなことをどんどん進めていけばいいんですが、インターンなのである程度こちら側で権限や業務を設定する必要がありました。こういった課題を解決するために考えたのが、Docker+Jenkins+Slackを使ったチャットオペレーションの仕組みです。

インフラサイドのGitHub? DockerのEcosystemに魅せられて

この仕組みの中心にあるのがDockerなんですが、使い方が2つあります。1つはHAIRのサーバーサイドのAPIや、ウェブメディアの開発環境としてのDockerです。もう1つはこのチャットオペレーション上でJenkinsとSlackを連携しているHubotの役割ですね。

Docker自体は半年ほど前から使っています。Dockerの Ecosystemが好きなんです。世界中の人がDockerのコンテナイメージを作って、それをシェアしあって、継承しながらまた新しいものを作る。これまでは、ソースコードだったらGitHubでお互いにレビューしあうというのはあっても、インフラでそのような機能があるものってなかったんですよ。

Dockerファイルだと、単純なテキストファイルの共有化によって今まで一生懸命、職人が手で作っていたものが誰でも作れちゃう仕組みっていうのが、本当に良くできています。

「すべて無料!」Docker+Jenkins+Slackのチャットオペレーションを構築

Dockerが繋ぐチャットオペレーションシステムを構築する前提として、「無料」だというのが大きなキーワードでした。弊社は基本的に、お金のかかるものはあまり使わないので(笑)。リソースが限られている中でどうやって、開発体制を作るか。具体的に言うと、どうやってリモートのインターン生に、ステージング環境へのデプロイができるようにするか。頭の中にあった断片的なツールの知識を繋げていって、これとこれとこれでこうやったら解決するんじゃないか、と考えた結果生まれたのがDocker+Jenkins+Slackを使ったチャットオペレーションです。

もともとデプロイにはJenkinsを使っていたんです。大企業だったらそこでインターンの2人がJenkinsでデプロイできるように、JenkinsをAWSのような共通で使えるサーバーに上げればいい。でもそのためのサーバーコストがかけられないので、もともと開発環境として使っていたDockerにしか上げられなかったんです。

仕組みとしては、まずは各自のローカル環境で開発したものをBitBucketが受けて、ステージングに上げる時にSlackでコマンドを打つ。そうするとDockerのコンテナで動いているJenkinsに指示がいってステージング環境に上がると。Slackコマンドがトリガーになるのですが、JenkinsとSlackを結んでいるHubotがDockerでできています。この仕組みだとBitBucket上でステージングブランチに上がっているものが、実際のステージング環境にも上がっている、という認識で3人で開発を進めて行けます。

今後のスケール化に向けて、クラウドサーバーの導入も検討

このチャットオペレーションによって、金沢の2人もステージング環境にデプロイすることができるようになりました。ステージング環境にみんなが作ったものが勝手に集まってくるイメージです。僕自身の工数が減ったのも良かったですが、全員が自分の作ったものをステージング環境で確認できるようになったのも重要です。

今だとこういった課題は基本的にクラウドサーバーを使うことで解決しますよね。でもスタートアップ企業の場合は特に、開発環境にかけられるコストが限られています。そのリソースの中で工夫してやっていくというのも面白さを感じますね。

ただ、今後のサービス開発においてはAWSなどの導入も視野に入れてサービス開発を進めています。AWS導入における課題は、やはりコストですね(笑)。AWSのコストはボリュームに応じて変わるとは言っても、今弊社の別のサーバーも立っているのでダブルコストになってしまう。でもそこをなんとかねじ込んで、これから成長するんだったらAWSで行くしかない、という成功事例をHAIRで作りたいですね。

;