DevOps ハッカソンに参加してきました #devopsjp

http://changesworlds.com/wp//HLIC/3720620a6b4bb6b0d2045a38c940c1b4.png

DevOps ハッカソン

2015/11/28, 2015/11/29にベルサール新宿グランドにて行われた、DevOps ハッカソンに参加してきました。

タイムスケジュール

Day 1のタイムスケジュールは以下の通り。

  • 13:00-13:10: 会場説明
  • 13:10-15:30: DevOpsセッション
  • 15:30-16:00: ハッカソンチーム作成
  • 16:00-19:00: ハッカソン

Day 2のタイムスケジュールは以下の通り。

  • 09:00-12:00: ハッカソン
  • 12:00-13:00: 昼食休憩
  • 13:00-15:00: ハッカソン
  • 15:00-17:00: チームプレゼンテーション&好評

でした。

ハッカソンのチーム編成

全部で4チームが結成され、自分が所属したチームの目標は『手順書と Infrastructure as Codeの一本化​、承認プロセス、エビデンス​の完備⇒何も知らない上司でも使える!!​』というもので、何も知らないとはDevOpsの裏側の仕組みなどは理解しておらず、従来と同じように上司はリリース承認ができる(変更の契機となった依頼内容、ソースの変更箇所、エビデンスなどがすべて網羅され、紐付いている)ということです。

ハッカソン

『変更の契機となった依頼内容、ソースの変更箇所、エビデンスなどがすべて網羅され、紐付いている』ということは後からすべてトレースできる、トレーサビリティが必要です。そのため、チームでは作業をすべてVisual Studio Team Service(以下VSTS)に紐付けました。以下が初日の作業内容です。

Iteration 1

Iteration 1=11/28の作業です。

  • 1週目
    • Dev1: Mavenを使ってHello Worldを出力するコードを作成し、そのコードをビルド定義でビルドする
    • Dev2: Mavenを使ってServletでHello Worldを出力するコードを作成する
    • Ops1: 開発に必要なVSTSやAzure側の設定を行う
    • Ops2: JavaのWebアプリが動作するサーバーを構築する
  • 2週目
    • Dev1&2: OpsからWAR形式で欲しいと言われたので、Mavenを使ってWARファイルを出力するようにpom.xmlを修正する
    • Ops1&2: WARファイルを手動でサーバーにデプロイする

手動デプロイはできたので、コードに落とし込もうとするもここで用事のためにDevとOpsがそれぞれ1名帰宅されました。

  • 3週目
    • Dev2: JavaのWebアプリとApplication Insightsを連携する
    • Ops2: Infrastructure as CodeでAzure上にJavaのWebアプリをデプロイするマシンを構築する

を最後まで行っていました。

1週目といいつつ、大苦戦

11/29の作業は前日からの続きの作業を開始したもののここで大苦戦し、12:00過ぎまでかかっても解決しませんでした。以下、その挫折の歴史です。

  • Ops
    • デプロイをAzure Automationで実行しようとするが、はじめての技術でうまくいかない => Devがpom.xmlでなんとかする方向にし、IaCを進める
    • Ansible, ServerSpecを使ったInfrastructure as CodeをしたもののVSTSで実行する方法がよくわからない
    • Azure Resource ManagerならVSTSから実行できるだろうと取り組むがはじめての技術でTry&Errorの繰り返し
  • Dev
    • Wagonというプラグインを使うものの、ホスト鍵の検証エラーが多発し、うまくいかない
    • settings.xmlを追加して解決しかけるが、WARファイルの後に必要のないファイルもデプロイしようとして、そこでエラーになるの繰り返し

エヴァンジェリストの方々の力を借りながらも全く解決する気配がなく、時間だけは刻一刻と過ぎていっている状況だったので、12:30頃に『git pushできればデプロイできるNode.jsにしよう!』と大きく方向転換することを決定しました。この方向転換によって、前日に実施した『JavaのWebアプリとApplication Insightsを連携』がチャラになってしまい、残念でした。

ここからはダイジェストになります。

  • 12:45頃 Node.jsアプリのVSTSからのgit pushによるAzure Web Appへのデプロイに成功
  • 13:15頃 Azure CLIによる対話型によるAzure Web Appの作成に成功
  • 13:20頃 Node.jsアプリのVSTSからのgit pushによって、Azure CLIにより作成されたAzure Web Appへのデプロイに成功
  • 13:50頃 Azure CLIに1ライナーによるAzure Web Appの作成に成功
  • 13:55頃 Node.jsアプリのVSTSからのgit pushによって、Azure CLIにより1ライナーで作成されたAzure Web Appへのデプロイに成功
  • 14:10頃 チームプレゼンテーション資料作成開始
  • 14:32 Release Managementによるデプロイパイプライン作成開始(手順書と Infrastructure as Codeの一本化​、承認プロセス、エビデンス​の完備)
  • 14:45 Release Managementによるデプロイパイプライン完成(手順書と Infrastructure as Codeの一本化​、承認プロセス、エビデンス​の完備)
  • 15:00 チームプレゼンテーション開始

といった具合の挫折の繰り返しの中でのギリギリの綱渡りでしたが、なんとか『手順書と Infrastructure as Codeの一本化​、承認プロセス、エビデンス​の完備⇒何も知らない上司でも使える!!​』を実現できました。

『手順書と Infrastructure as Codeの一本化​、承認プロセス、エビデンス​の完備⇒何も知らない上司でも使える!!​』という目標は一緒のチームのOpsの方が要望したものでしたが、今回の結果に満足されていたので、眼の前で実現できてよかったです。

以下がチームで実践できたDevOps Practicesになります。

  • Infrastructure as Code
  • 継続的インテグレーション
  • 自動テスト
  • 継続的デプロイ and デリバリー
  • リリース管理
  • 構成管理

以下が最後欠落してしまったのが残念でした。

  • アプリのパフォーマンス監視/管理
  • 使用状況監視/テレメトリ

実装したのはHello worldを出力する簡単なアプリでしたが、『手順書と Infrastructure as Codeの一本化​、承認プロセス、エビデンス​の完備⇒何も知らない上司でも使える!!​』という承認プロセスまで含めた明確なテンプレート化​というのは大きな成果だったのかなぁと思います。

感想

良かったところ(Keep)

  • いきなりサンプルを突っ込んでエラーにしてからのTry&Errorではなく、Hello Worldから始めてインクリメンタルに成長させられた
  • すべての作業をVSTSで記録し、Workitemとビルド、テスト、デプロイ(リリース)をすべて紐付けることができた(トレーサビリティを確保した)
  • ブランチポリシーを適用し、ビルドNGやWorkitemにリンクされていないものはマージできないことをハッカソンの中でも実現できた
  • 会場が快適過ぎてヤバかった。すぐに食べられる朝食&美味しい昼食&無限ドリンク&お菓子は非常に恵まれた環境だった
  • WindowsとLinuxとMacという千差万別の開発環境だったが、うまくチームで連携できた
  • やりたかったことが一通りできた
  • 1日目、2日目共にVSTSに関する質問で他のチームを支援できた

良くなかったところ(Problem)

  • 脇が甘かった。
    • JJUG CCC 2015 Fallと同時開催ということはJavaでアプリ開発をする人が多く対応できなければならなかったが、事前準備を一切してなかった
    • そのため、WARファイルのデプロイに長時間ハマった
    • 写真撮るの忘れたが、スクリーンショットは撮った
    • それどころではない程に集中していたといえばいいが、後でふりかえることを考えると撮っておいた方が良かった

挑戦したいところ(Try)

  • 自分一人で一通りDevOpsの連携部分をできるようになる

最後にMSの皆さん、参加者の皆さん、チームの皆さんありがとうございました。また機会がありましたら、よろしくお願いします。