このブログをご覧のみなさん、こんにちは。

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: チームプレゼンテーション&好評

ハッカソンのチーム編成

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

ハッカソン

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

Iteration 1

Iteration 1 = 1128 の作業です。

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

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

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

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

一週目から大苦戦

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

  • Ops
    • デプロイを Azure Automation で実行しようとするが、はじめての技術でうまくいかない => Dev が pom.xml でなんとかする方向にピボットし、Infrastructure as Code を進める
    • 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 Apps へのデプロイに成功
  • 13:15 Azure CLI による対話型による Azure Web Apps の作成に成功
  • 13:20 Node.js アプリの VSTS からの git push によって、Azure CLI により作成された Azure Web Apps へのデプロイに成功
  • 13:50 Azure CLI による 1 ライナーによる Azure Web Apps の作成に成功
  • 13:55 Node.js アプリの VSTS からの git push によって、Azure CLI による 1 ライナーで作成された Azure Web Apps へのデプロイに成功
  • 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 という千差万別の開発環境だったが、うまくチームで連携できた
  • やりたかったことが一通りできた
  • 一日目、二日目共に VSTS に関する質問で他のチームを支援できた

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

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

挑戦したいところ (Try)

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

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