DevOps Hackathon 参加レポート(大鷲)

クロスワープの大鷲です。

9 月 5 日、6 日の 2 日間、日本マイクロソフトで開催された DevOps Hackathon に、当社の鈴木と一緒に参加してきました。*1
Dev と Ops で混成チームを組み、米国および日本のマイクロソフトのエヴァンジェリストのサポートのもと、各チームで DevOps を実現したソリューションを競ってきました。
我々チーム No.6 は、なんと優勝!*2

課題として、Infrastructure as a Code を必ず行うことと、もう一つ、何らかの DevOps 手法を採用することというのがありました。
我々のチームは、Mesos*3 を利用して何かやりたいというテーマで、Mesos 環境を構築するのに Chef を利用し、また、継続的インテグレーション (CI) のために Visual Studio Online (VSO) を利用しました。

私は Dev 側で参加したので、そちらの活動を主にレポートします。
イベント全体の流れなどは他にブログで紹介して頂いている方がいるので割愛…。

Visual Studio から docker へのデプロイ

Mesos は docker ベースのテクノロジーなので、開発するアプリケーションは docker 上で動かす必要があります。
Dev チームは私も含め、普段 Visual Studio と C# で開発をしている人ばかりだったので、docker 上で動く ASP.NET 5 をターゲットにしました。

ひとまず、ASP.NET MVC 6 のプロジェクト ウィザードで作成されたスケルトンをそのまま動かすことを目標とし、時間的に余裕があればアプリケーションを作り込もうという方針にしました。*4

Visual Studio 2015 では、VS から直接 docker にアプリケーションをデプロイすることができます。
そこで、Azure 上に Ubuntu による docker サーバーを立て、ASP.NET 5 のアプリをデプロイすることにしました。
が、これが難航。
ネットワーク的には接続できているのですが、いざデプロイしようとすると project.json が勝手に書き変わり、そのせいでビルド エラーが発生してデプロイできないという現象に悩まされました。
結局、このアプローチは、ASP.NET 5 も VS 用の docker ツールもまだプレビュー版だから不安定なのかもしれないということで一旦諦めることにしました。*5
元々、デプロイは Visual Studio Online を利用した CI で行うのが目標であり、VS から直接やるのは「とりあえず」だったので、ここにあまり時間をかけるべきではないと判断したためです。

が、1 日目はここまでで時間切れとなってしまいました。

VSO で ASP.NET 5 のビルド

2 日目は、まず ASP.NET 5 のアプリケーションを VSO でビルドするという目標を立てました。
しかしこれも失敗続き。

最初、VSO のビルド定義の Default queue を、何も考えず "Default" にしていたのですが、

No agent could be found with the following capabilities: msbuild, visualstudio, vstest

というエラーが出てビルドできません。
これは、Default queue を "Hosted" にすることで出なくなりました。

しかし今度は、ASP.NET 5 のビルドが始まったところで、

System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.DNX.PackageManager' or one of its dependencies. The system cannot find the file specified.

というエラーに遭遇。
ASP.NET の GitHub の情報なども参考にしつつ試行錯誤しました。
結局これは、ASP.NET 5 の beta7 という新しすぎるバージョンに対して、VSO がまだ対応していない(ビルド エージェントに beta7 用のビルド ツールがインストールされていない)ことが原因だと判明。
Azure のテンプレートを利用して VSO のビルドエージェント用の仮想マシンを作成し、そこに最新のツールをインストールすることで、ビルドができるようになりました。azure.microsoft.com

ビルド エージェント用の仮想マシンを Azure に立てると、VSO のビルド定義の Default queue のところにそのマシンが現れるので、これを使ってビルドします。連携すごい。

三度目の正直

しかし、気付いてしまったのです。
ASP.NET 5 では Roslyn によって実行時にコンパイルが行われるので、アプリケーションを事前にビルドしておく必要はなく、ソースコードをそのまま Web サーバーに配置すれば動いてしまうのだということに。
そこで、VSO ではアプリケーションのビルドは行わず、コードのコミットをトリガーとして、ソースコードを含んだ docker イメージを作るように方針転換しました。*6

docker イメージのビルドは docker サーバー上で行わなければいけないので、VSO と、先ほど作っておいた Ubuntu のサーバーを連携させる必要があります。
これは、Microsoft が公開している VSO-Agent をインストールすることで可能です。
先程、ビルド エージェント用の仮想マシンを作った時と同様、これをインストールしたマシンがビルド エージェントになり、ビルド定義で利用できるようになります。

github.com

まず、普通に docker サーバーに SSH で接続した上で、イメージをビルドし Web サーバーを起動、外部からブラウザーで参照できるところまでは確認できました。
ビルド タスクにシェル スクリプトを登録し、Ubuntu 上で docker イメージのビルドは無事にできたようでした。
しかしその後、アプリケーションを起動するために dnu restore(NuGet パッケージの復元)をしている最中にネットワーク タイムアウトが頻発し、結局 restore に失敗。
残念ながら、時間内にこの問題の解消には至りませんでした。

感想

やはり最終的に、時間内に Dev 側のタスクを完遂して Mesos と繋ぐことができなかったというのが最も悔やまれるポイントです。
また、最後のプレゼンの際に、Dev 側のプレゼンで最も時間を取ってしまったのも反省点です。
このような状況にもかかわらず優勝できたのは、ひとえに他のチーム メンバーの皆さんのおかげです。ありがとうございました!

docker の使い方やビルド エージェントの作り方などがわかり、実り多い 2 日間となりました。
docker については ASP.NET 絡みでも知っておいて損はないので、docker イメージを作って動かすところまでは、宿題として取り組みたいと思います。*7
今回使えなかった DevOps 手法も盛り込んでみたいです。

VSO は Microsoft 製のソフトウェアですし Visual Studio との相性はもちろん最高なのですが、前述の通り Linux でビルド エージェントを立てることができたり、ビルド タスクとしてシェル スクリプトや Gradle を動かすことができるなど、非 Microsoft 製のテクノロジーでも利用できるので、普段 MS 製品を使っていない方にも一度触れて頂きたいです。

今回は第 1 回ということで、今後も同様のイベントは継続的に開催されるようです。私も可能な限り参加したいと思います。

あと、お弁当が美味しかったです。*8

参考資料

当日の Twitter の模様は #DEVOPSJP で見ることができます。
他の参加者の方のブログ記事もこちらから探せます。twitter.com

Microsoft 製のサンプルとして、PartsUnlimited というアプリが提供されました。github.com

*1:他、初対面の方 4 人と、計 6 人でチームを組みました。

*2:賞品は特になし…

*3:多数の docker ノードを束ねてクラスターにし、状況に応じてタスクを各ノードに割り振るシステム

*4:結局、その時間はありませんでした。

*5:VS の言語設定を英語にすると挙動が変わったりしました。

*6:実行時のパフォーマンスを考えるなら事前にビルドしておいた方が良いです。

*7:さすがに Mesos までは手が回りません…

*8:重要