こんにちは、CTO兼福岡オフィスマネージャーの@edvakfです。最近はとあるC++のコードをRustに逐語訳しながらRustを勉強中です。
今回はピクシブで使っているデプロイ管理画面のpployをgo-pployにリプレースした話を書きます。
まずは結論から
- メンテナビリティの向上 を目指して社内システムをリプレースした
- 小規模であっても新規開発から得られる学びはとても大きい
- その気になれば式年遷宮できるシステム規模を心がけましょう
そもそもpployとは?
pployとは、「デプロイ管理画面」という類の小さなウェブアプリケーションです。
ピクシブで開発しているウェブアプリケーションのデプロイは基本的にはすべて
- 「デプロイ中」状態になる
- masterにpushする
- staging等にデプロイして確認する
- productionにデプロイする
- 問題無ければ「デプロイ中」状態を解く
という手順でやります。この「デプロイ中」状態を管理するのがpployです。masterにpushするときは必ず「デプロイ中」になってね、という社内ルールになっています。
デプロイの方法はcapistranoやrsyncするものもあれば、静的ファイルを書き出してS3に設置するだけのものもあったり、多種多様ですが、リポジトリ内に .deploy/bin/deploy
というスクリプトを置いてくれればpployが実行してくれます。
2014年にpixivのデプロイを支えるpployという記事にも詳しく書きました。
なぜリプレースするに至ったか
2014年8月にScala (Play Framework)で書かれたpployでしたが、PlayのアップデートやScalaのアップデートに対応できておらず、開発環境の構築も面倒になっていました。
pployを通してデプロイしているアプリケーションが増えていき、「ログをストリーミングしている間に別の人がページのリクエストを待たされる」という問題が報告されるようになりました。
社内の何人かが調査に協力してくれたのですが、けっこう時間がかかっていたので、「これだったらフルスクラッチで作ってしまったほうが早そう」と(一度作った自分としては)思ったという経緯です。
なぜGoを選んだか
イマドキこういうのはGoでしょ、というのもあるのですが、ちゃんとした目論見がありました。
- 「子プロセスを実行して標準出力を待つ」みたいな処理がプロセスをブロックしない
- これはそもそもScalaを選んだ理由でもあるのですが、Scalaだとプログラマーが意識しないとそういう使い方はできないのに対して、Goだと意識しなくてもそうなってくれます
- 「デプロイ中」状態などの状態をプロセスのメモリ内に持たせられる
- PHPとかRails+Unicornみたいなpreforkのサーバーでは難しい
また、今回の目的が メンテナビリティの向上 だったので、次のような点も重要でした。
- 社内で実績がある
- 言語自体やエコシステムが安定しているので、作ってから長期間放置したいシステムに向いている
- シングルバイナリで配布できるのでデプロイサーバーに特殊なプロビジョニングがほぼ不要
余談ですが、シングルバイナリで配布するためにgo-bindataというツールを使おうと思ったちょうどその頃にGitHubリポジトリが消えるという事案があり、Goといえど天国ではないなと思ったのでした。
ついでにフロントエンドも式年遷宮
元々はjQuery、Bootstrap、CoffeeScript、Lessという時代を感じさせる構成だったのですが、Scalaのテンプレートを書き換えなければいけなかったので、Svelteを選んでCoffeeとLessも無くしてしまいました。
テンプレートエンジンをフロントエンドで持つことで今後またバックエンドを変えるのもラクかなと思います。
Svelteの所感ですが
- コンポーネントごとにhtmlとscriptとstyleを1ファイルに書いて、それをJSにコンパイルする
- Vue.jsの.vueファイルとほとんど同じ感覚
- ランタイム不要。コンパイルされたJSさえ読み込めば使える
- ドキュメントは、まあまあ充実している
Svelteは メンテナビリティの向上 を考えると、まあ及第点なのかな?と思いました。覚えることはそこまで多くないですし、機能を増やすよりは枯れていく方向に進む感じがしたので。
Bootstrapはちょうど4.0がリリースされたので使ってみたかったのですが、クラス名などを変えないといけないところがいくつかあったので、3系の最新にまで上げました。
最後に
フルスクラッチの期間は1週間半ぐらいでした。最初は週末とか夜中にちょこちょこ作り始めて、「いけそう」と思ってからは仕事中にやりました。
目的をしっかり意識し、その達成のために一からシステムを設計して実装したので、短期間であっても多くの学びを得られました。
また、その気になればいつでも書き直せるぐらいの規模にシステムを保っておくこの重要性も改めて実感しました。(特に社内システムは!)
ピクシブではGoエンジニアも募集しています!