AccelPlatform のつくりかた Season2 株式会社 NTT データイントラマート開発本部 2015/10/09 1
はじめに EWS 2015 当日限定 2
2 年前 (EWS 2013) 3
今年は アジャイルのレフトウィング intra-martにおける 開発環境 ~Commit, Build, Test, Deployを 支える技術~ 弊社開発本部における開発の自動化への取り 組みを2年間の変遷と共にご紹介します 4
アジェンダ 1. 概要 2. 開発 開発環境 CI 概要 開発 テスト ビルド リリース 3. 運用 バックアップ / リカバリ 監視 4. 開発手法 5. 今後の取組 分析 チャレンジ 5
概要 期間 2010/09 ~ 2015/10 開発者 チーム モジュール数 モジュール数 ( 全バージョン ) ビルドジョブ 40~80 名程度 ( 現在約 50 名 ) 4~10 チーム ( 現在 7 チーム ) 251 モジュール (2 年前 80 モジュール ) 1794 モジュール 1163 ジョブ (2 年前 420 ジョブ ) 6
自動化前 ( 半自動化時代 ) 1. CVS / Subversion を利用したソースコード管理 2. リモートデスクトップでサーバへログイン 3. ビルド用スクリプト (build.bat) の実行ビルド時間 1 時間 ~ 4. 成果物を元に手動でインストールし確認問題があれば 1 へ戻る 手戻りが発生した場合のコストが非常に高い 7
自動化前 ( 半自動化時代 属人性 ビルドスクリプトが複雑になり職人以外触れない 特定の端末でしかビルドできないスクリプトも存在 ビルド環境へは一部の人のみがアクセス可能 ビルド環境がスケールしない / 直列化されている リリースが重なると待ち時間がとられる リリース作業が複雑 リリース職人以外リリース作業が行えない 8
概要 9
開発サイクル 年 4 回から年 3 回のリリースに変更 3~4 ヶ月単位のリリース 4 月 1 日 Spring 7 月 1 日 Summer X 月 X 日 Autumun 12 月 1 日 Winter リリース テスト 開発 10
開発サイクル内訳 1ヶ月目 計画 設計等 + 実装 タスクの洗い出し プランニングポーカー等 2ヶ月目 実装 翻訳 3ヶ月目 試験 結合試験 総合試験 セキュリティ検証 実際には数シーズンかけて開発を行う機能も存在します 11
開発 12
開発環境 Windows7 Widnows10 Mac OSX Ubuntu Linux Cent OS RedHat Enterprise Linux CentOS RHEL Windows Mac OS X Ubuntu Linux 2 年前と比べて Linux 系 OS が減少 Mac OSX が増加 13
CI 環境 : 概要 14
CI 環境 : クライアント 15
CI 環境 : クライアント 開発環境の構築は 1 クリックで実現完了 内製の環境構築スクリプト 初期導入コスト削減 環境の差異による品質のブレを防止 16
CI 環境 : クライアント e-builder / Eclipse 静的解析プラグイン (Findbugs, Checkstyle) Sphinx( ドキュメント ) 用プラグイン各種 業務スケルトン ツール Apache Maven Apache Ant Sphinx Middleware Java SDK Python 内製ツール / プラグイン等 17
CI 環境 : 開発 18
CI環境: 開発 ソースコードはGit及びSubversionで管理 Subversionのリビジョン番号は 106739 (2015/09/16時点) 1日辺りのコミット数は50回以上 目的 新規開発 機能拡張/改善 改修 ドキュメント テスト 19
CI 環境 : ビルド 20
CI環境: テスト ビルド ソースコードがコミットされる事により Jenkins上でコンパイル テス ト パッケージング等のビルドジョブが動作します ビルドジョブ: 約1200 ビルドサーバ: 3台 テストケース: 6万以上 Jenkins: 9インスタンス 21
CI 環境 : テスト ビルド 1600 ビルドジョブ / 週 93 時間 / 週 ( 稼働率 55.3%) 4DB 環境のテスト (Oracle, PostgreSQL, DB2, SQLServer) Selenium を利用したブラウザテスト Coverity を利用したコード静的解析 不具合密度 0.5 以下 22
CI 環境 : テスト ビルド Selenuim / WebDriver Web アプリケーションのテストを自動化 実際のブラウザを動かしながらテストします Coverity Java 向けの静的コード解析ツール ( 有償 ) 単一のクラス内のコード解析だけではなく クラスを跨った解析を行います 23
CI 環境 : 独自のテスト リンク切れチェック メッセージファイルチェック 翻訳漏れが存在しないこと ( 日英中対応が行われているか?) モジュールを跨ってキーが重複していないこと ドキュメントチェック リンク切れ検出 版 日付が更新されていること スペルチェック (e.g. tenatid -> tenantid) 文言チェックです ます調等の確認 略称の使用の検出 コードチェック Javadoc コメント 不要な printstackstrace 全て内製ツール 24
CI 環境 : デプロイ 25
CI 環境 : デプロイ プログラムの成果物は全て Maven リポジトリへ格納されます 社内検証用 IM-Juggling 用リポジトリが更新されます 成果物を元に Docker イメージを作成し Docker レジストリに登録されます 26
CI 環境 : デプロイ Maven リポジトリ ビルドされた成果物を管理するリポジトリ Sonatype Nexus Apache Archiva IM-Juggling リポジトリ Accel Platform を構成するモジュールファイルを管理するリポジトリ IM-Juggling から参照 27
CI 環境 : デプロイ Docker レジストリ コンテナ型仮想化環境 Docker で利用イメージファイルを管理するためのレジストリ 開発本部では ビルドが成功した後 Docker で利用可能なイメージファイルの作成を行っています 28
CI 環境 : デプロイ デプロイされた成果物は 各開発環境から参照される為 最新の成果物が共有されます Docker イメージが有るため そのまま起動する事が可能です Vagrant Docker へ移行しました docker run t i p 8080:8080 p 5432:5432 p 2222:22 registry.intra.intramart.jp/xxx/iap_latest_standalone_postgres 29
CI 環境 : リリース 30
CI環境: リリース リリース作業の自動化 公開サーバへのアップロード 資材配置等のリリース作業の自動化を 行いました 結果 半日かかっていた作業が1時間へ また 手作業によるミスが無くなりました 31
自動化外のテスト 打鍵試験 脆弱性診断 IBM Security AppScan 負荷試験 Oracle Load Testing Apache JMeter 32
運用 33
運用 : 概要 サーバ数 モジュール数 ビルドジョブ 7 サーバ (2 年前 5 サーバ ) 251 モジュール (2 年前 80 モジュール ) 1163 ジョブ (2 年前 420 ジョブ ) 34
運用 : バックアップ / リカバリ 日時で Amazon S3 にバックアップ ビルドサーバはビルドサーバ間でバックアップを保持 障害発生時に即時復旧出来るように ディスク リソースは常にある程度余裕がある状態を維持 5 年間の運用中障害が発生したのは 2 件 ディスク障害 電源が壊れた 共に短時間で復旧 35
運用 : 監視 内製ツール / 名称 : manabot ビルドジョブ / サーバ死活監視 36
運用: 監視 監視內容はフロア上部に設置されている ディスプレイに常時表示されます ビルドの状況 サーバ死活監視で何か問題 が発生した場合には社内irc, IMBoxに通知 が行われます IM-Noticeによりスマホにpush配信 37
開発手法 38
開発手法 Java7対応 Java8はJavaEE7, JavaEE8対応後検討予定 lombokの導入 @Data, val等を利用しコード量削減を実施 コード解析ツール javadocと相性難あり DDD(Domain-Driven Design) ドメイン駆動設計 ユビキタス言語の使用 モデルへの反映 モデリングが綺麗でわかりやすく 品質の向上 39
開発手法 フロントエンドのビルドシステム WebPackの導入 JavaScriptのモジュール化 ビルド時に結合 (圧縮 最適化) ES6(Babel)は今後検討 SPA (MV*)アプローチ Single Page Application Vue.js + page.js + α カスタマイズしない(と想定される)画面に適用 生産性向上 コード量削減 再利用 (推測3割) 画面描画のパフォーマンス向上 他言語化 認可連携等で一部課題あり 40
今後の取組 41
今後の取組 開発改善に取り組んで5年以上 感覚ベースでの最適化は難しい段階 データ収集と可視化の実施 ELKスタックを利用したデータ分析 (Logstash + ElasticSearch + Kibana) Jenkinsのジョブ結果をElasticSearchへ登録するプ ラグインを作成 https://github.com/junsandesuka/jenkinselasticsearch-plugin.git 様々な傾向が可視化出来た 改善へ 42
今後の取組 : 分析画面 43
今後の取組 : チャレンジ 予防保全的なアプローチへの取り組み / 研究 リリースサイクルを通しての統計データの分析 機械学習を利用した予測 開発に関する様々なデータの収集 社内メンバーが気軽に可視化 分析を行える環境 44
今後の取組 : チャレンジ これまでのノウハウを元にした外部への展開 ミニマムな構成を VM イメージ化し配布等 パートナー様 エンドユーザ様等へ展開サポート 導入支援コンサルティングを行っております お問い合わせ下さい 詳細 実物をご覧になりたい方は弊社まで! 45
ご清聴ありがとうございました 46