DevOpsハッカソン (デプロイの自動化編)
昨年12月に行ったDevOpsハッカソンの詳細な内容です。
今回はデプロイの自動化について書きます。(作業時間にして3~4時間ほどの内容)
下記のようにASP.NETのWebアプリケーションを作成してデプロイの自動化をやってみました。
■VSTS上でBUILD定義の作成
build定義のテンプレートはXamarinやXcodeなどもあります。
今回はVisual Studioを選択。
Default agent queue は「Hosted」を選択。「Hosted」を選択できない場合は確かアカウントの権限などの問題だった気がします。。。あまり覚えてないです。。。
Continuous integrationにチェックを入れるとgitの該当ブランチにcheck-inされる度にビルドされます。
デフォルトで上記のように
- ソリューションのビルド
- テストの実行
- 発行情報のパス
- 発行の設定
があります。
修正した項目は、
- ビルドのMS Build Argumentsを「/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.stagingDirectory)"」に書き換え。
- Copy and Publish Build ArtifactsのCopy Rootを「$(build.stagingDirectory)」にContentsを「**\*」に書き換え
- Copy and Publish Build Artifactsをもう一つ追加して、Copy Rootは空Contensを「**\*」に書き換え。
Copy and Publish Build Artifactsを二つにしたのはデプロイした後にデプロイ環境上でテストを流したりするためのものなので今回必ずしも必要はありません。
上記のようにしてビルドまでは完了できました。
■VSTS上でRELEASE定義の作成
プロジェクトにリソースグループの追加。
テンプレートはWeb Appを選択。
WebSite.param.dev.jsonのvalueを適当に変更。
次にAzureのポータル上でリソースグループの作成。
そしてApp Serviceの作成。
このあたりは適当に名前を付けるだけ。
次にVSTS上でのAzure Subscriptionの設定。
上記のページにてAzureのSubscriptionの設定が可能。
Credentialsを選択して認証情報を入力して設定しました。
アカウントの権限によって設定できないので注意が必要。
下記はRelease定義の作成画面。
Releaseのテンプレートは上記のようにクラウドサービスとWebSiteの2種類あります。
今回はWebSiteを選択。
デフォルトでAzure Web App DeploymentとVisual Studio Testが追加されています。
一番左のEnvironmentではDevelopmentやReleaseなどの環境を設定しておくことで、各環境へのリリースを段階的に作成できます。
Devへのデプロイ⇒テスト⇒承認⇒Releaseへのデプロイなどのステップを組むことも可能です。
Azure Subscriptionは先程設定したものを選択。
Web App Nameはポータルで確認できるのでそれを入力。
(選択できるように映っていますができません)
あとはCreate Releaseするだけでリリースが実行されます。
※大部分を思い出しながら書いたので間違ってたらすみません。
■感想
サンプルアプリのデプロイだけですが、かなり短時間で自動化できました。
個人的にはリリース前に承認プロセスを入れれるところやリソースグループの設定によってすぐに別の環境へと持っていけるように作れるところなどがとても魅力的だなと感じました。
早く実際のプロジェクトへと反映させたいです。
次回はPowerBIについて書こうと思います。
DevOpsハッカソン (総括)
Microsoftの方々(牛尾さんというDevOpsエバンジェリストの方など)のご協力のもと、DevOpsハッカソンを社内で実施して頂けたので、レポート代わりに内容をまとめます。(約3日間の内容です)
■DevOpsハッカソンのアジェンダ
- Value Stream Mappingの振り返り
- 改善ターゲットの抽出とプランニング
- ひたすらHACK!!!
■Value Stream Mappingの振り返り
Value Stream Mappingは事前に作成していたので、どこが問題かという視点で振り返りをしました。今回のハッカソンでどこを改善/ハックしたいかを考えました。
ちなみに、Value Stream Mappingとは何かというのを簡単に説明すると、「製品が顧客に渡るまでの全工程を可視化したもの」です。
具体的に私たちの場合は、実装完了後からリリースまでの全工程を図として書きました。そして、どの工程にムダな作業がどのくらいかかっているのか/どこが改善できそうか(自動化/手続きの変更)などを一つの図に可視化しました。
イメージとしては下図のような感じです。
これを書くことで、DevOpsをやる上で重要な指標となる「○日/デプロイ」が概算的に算出できます。またその指標における課題も明確になります。
今回のハッカソンで○日/デプロイまで縮めるぞー!!!
とまでは目標を立てていませんが、この期間を短縮することが一つの目標となります。
■改善ターゲットの抽出とプランニング
以下の手順で実施。
- ValueStreamMappingの振り返りをもとに課題を付箋に書いて貼り出す
- エピックを抽出しながらグルーピングして整理する
- Visual Studio Team Services(以下、VSTSと略)にバックログおよびストーリーとして登録
- 担当者の割り振り(自分がハックしたい内容を優先的に)
テーマとしては下記のようなものが出ました。
- 受け入れテストの自動化
- 負荷テストの自動化
- TDD
- ビジネス価値の可視化
- バッチアーキテクチャの変更
- システム停止なしのリリース
- デプロイの自動化
- 開発者とデザイナーのやり取りの改善
- 本番環境構築の自動化
- ...etc
VSTSは視覚的にバックログをボードとして管理できるので楽しいですね。
しかもローカルのエクセルとも同期が取れたりもします。
ちなみに私は、「ビジネス価値の可視化」と「デプロイの自動化」を担当しました。
下図は「ビジネス価値の可視化」のストーリーのボード。
■ひたすらHACK!!!
普段の業務を気にせずひたすらHACKします。
Microsoftの方々にたくさん質問しながらHACKを加速させました。
詳しい内容はまた別の記事に書きます。
■感想
Microsoftの方々のご支援のおかげで、かなり濃密な期間を過ごせました。
VSTSの使い方やデプロイ自動化の部分、Azureの機能などについてすぐに聞けるという環境はとても恵まれたものでした。
また、個人的には、使ってみたかったPower BIのレポートを一緒に作ってもらえたというのが、自分ひとりで調べながらやるのに対して体感で100倍くらいの成果を出せた気がします。(※あくまで個人の感覚値です)
実際のアウトプットとして、プロダクトに貢献できるものが約3日間という期間で作成できたのもとても有意義なところでした。
牛尾さんはじめ、Microsoftの方々、大変ありがとうございました。
SQL Azure のFull-Text Searchが微妙なので暫定対応をする~形態素解析のせいでしょう~
- フルテキスト検索の仕組み
通常のLIKE検索では遅い
⇒LIKE比較は負荷が高い
⇒LIKE検索したい対象を言葉に分解してそれぞれにインデックスをはれば、その言葉と一致で検索することでLIKE検索のようなものを内部的に一致検索で速くする
っていうのがざっくりした自分の理解です。
- 通常のSQL Serverの場合
参考記事が下記にあります。
ほぼ、上記を同じような内容なのですが、
こちらでは、SQL Azureを使った場合の情報です。
- SQL Server とSQL Azureの違い
現状、Full-Text Searchにおいて、SQL AzureではSQL Serverの全機能はサポートされていません。(プレビュー版ですからね)
どこが具体的に違うかまでは調査してないです。
Full-Text Search is now available for preview in Azure SQL Database | Microsoft Azure Blog
そのため、類似語辞典などの機能も恐らく使えないです。(試していません。。。)
- 暫定対応
さて、本題に入りますが、上記のページにもあるように、
Full-Text Searchが微妙な理由はズバリ形態素解析の精度です。
SQL Server での形態素解析では、「片頭痛」を「片頭痛」としてしか解析してくれません。
「片頭痛」と「頭痛」に分解してくれると良いんですけどね。
それをやるにはmecabなどの形態素解析ツールを別途取り入れる必要がありそうです。
ただ、「片頭痛」としてしか解析してくれないものの、「頭痛」と検索してヒットさせたい場合どうするのかという点において、
select * from hogehoge where Contains((hoge_culumn),'*頭痛*')
と書いてみても「頭痛」しかヒットしてくれません。
ただ、これを
select * from hogehoge where Contains((hoge_culumn),'"*頭痛*"')
と二重引用符をつければ正しくLIKE判定してくれるみたいで、「片頭痛」もヒットしてくれます。
ただし、フルテキスト検索にLIKE検索を混ぜたような対応なので、ただのフルテキスト検索よりは若干パフォーマンスは落ちているような気はします。(ちゃんと計測はしていません)
それに加えて照合順序が適用されません。。。
つまり、「テスト」と検索しても「てすと」はヒットしません。
⇒どうも形態素解析しているワードブレーカーにおいて、各言語設定における照合順序が設定されているみたいです。
ドキュメント的にはSQL Serverの照合順序に依るっぽいことが書いてありますが、どうもSQL Azureだからか、適用されませんでした。
ちゃんとした対応をするためにはやはり形態素解析を改善した方がよさそうですね。
mecabについてはそのうち調べます。。。
Android4.2系の標準ブラウザで「ページが応答しません」となる場合の対処法 ~カルーセルでyoutube動画埋め込み~
原因:基本的にはメモリの問題だと思います
あまり詳しく調べてませんが、たくさん画像読み込んで かつ youtubeの埋め込み動画とかも読み込んでいるページでよく起きているようです。
そのため、下記、二つの側面から対応策を考ました。
- 端末側の対応
- サイト側の対応
※以下は、レスポンシブ対応しているサイト前提の話となります。(bootstrapを使用しています)
■端末側の対応
- ブラウザの設定で、「デスクトップ版サイトをリクエストする」にチェックを入れてアクセスする。
恐らく使用できるメモリが増えた状態でリクエストされるので正常に動作する可能性が上がります。
「PC版サイトを表示する」みたいな表記の場合もあるようです。
■サイト側の対応
youtube動画を遅延読み込みにする
ただし、遅延読み込みの方法は色々あります。
- ファーストビューでの表示領域以外にyoutubeの埋め込みがある場合
echo.jsを使用する⇒YouTube動画の遅延読み込みができるEcho.js - 星屋工作室ブログ
レアかもしれませんが、自分はこのパターンだったので下記のように対応しました。
youtube動画は最初に読み込まず、1pxの透明画像として読み込んでおく。
<div id="carousel_main" class="carousel slide" data-ride="carousel" data-interval="8000"> <div class="item active main01">カルーセルコンテンツ1</div> <div class="item active main02">カルーセルコンテンツ2</div> <div class="item active main03"> <div class="embed-responsive embed-responsive-16by9 margin-20"> <img src="../img/spacer.gif" class="youtube"> </div> </div> </div>
カルーセルの切り替わりをフックして、youtube動画埋め込みのカルーセル表示の場合のみiframeのyoutube動画にjavascriptで書き換える
<script type="text/javascript"> $(function () { var youtubeLoad = false; $('#carousel_main').on('slid.bs.carousel', function (e) { @*youtube動画のカルーセルが表示されている時のみロードする*@ if (!youtubeLoad && $(".main03").hasClass("active")) { $(".youtube").after('<iframe class="embed-responsive-item" src="//www.youtube.com/embed/hogehoge" allowfullscreen></iframe>').remove(); youtubeLoad = true; } }); }); </script>
上記の対応で「ページが応答しません」は再現しなくなりました。
直接的な原因はわかってないですが、とりあえずこれで問題なさそうです。
Slackでスレッド機能を実装なしで実現する
みなさんお使いのSlackですが、スレッド機能がありません。(執筆時点)
下記のようにheroku環境を立ててごにょごにょするのもアリかとは思いますが、
いまある機能でなんとかするっていう一つの提案です。
まず試してみるって感じですが。
その方法はと言うと、
スニペットorポストを使う!
スレッドを立てたいようなテーマがあった時、
「Create a text snippet」もしくは「Create a post」でスレッドテーマを投稿します。
あとは各個人がそこにコメントを追加していくだけ。
こんな感じにファイルにも残るし、見た目的にもスレッドっぽく残るので、
いかがでしょうか。
herokuなど立ててごにょごにょする前に一度試してみてはいかがでしょうか。
お試しください!!!!
Google Cloud Platform Nextに参加してきた
参加したときのメモと感想をざっと忘備録として。
■基調講演
下記のような時代の流れの説明が最初にあり、
その後、各社の GCPの導入事例などが紹介された。
■あっという間の、Google Cloud Platform 開発ガイド
ここはざーっと色んな機能の説明なのでさらっと流す。
■意外と簡単、AIを使ったリアルタイムモバイルゲーム開発
ここはFirebaseの紹介。
Firebaseでできることは大きく分けて下記の3つ。
- リアルタイムデータベース
- ユーザー認証
- 静的ファイルのホスティング
リアルタイムデータベースはNoSQLのJson形式で扱えたり、リスナーの機能を簡単につけられるとか。
ユーザー認証はTwitter/Facebook/Google/Githubの認証に対応できる。
静的ファイルのホスティングはまあそのまんまかな。
■データと分析で、情報を見抜く力を(Tableau)
初めてデモを見ましたが、なかなかに良さそう。
あれだけ簡単に大量データを可視化できれば色んな分析ができそうで楽しそう。
後で展示スペースに行ったら無料で使える期限延長されるQRコードがもらえました。
Tableauが目指しているのは、
「自分でデータを見て理解することを支援すること」らしい。英語で書いてあったのだが、たぶんこの理解で正しいはず。
■Googleが描く、MapReduceを超えたビッグデータの世界
まあ、やっぱりBigQueryはすごい。
パターンマッチのSelect文で、
1000億行3.6TBのデータでも結果が8.2秒で返ってくるのはやっぱりすごい。
あとはCloud Dataflowの説明が良かった。
完全に理解できてないけど、バッチ処理とストリーム処理を統一したのが他のサービスと違うところだとか。あとで少し詳しく調べてみようと思った。
■まとめ
Google Cloud Platformの500ドル分ももらえるのでなかなか良いイベントでした。
Tableauは自分でも使ってみるのと、Dataflowはもうちょっと調べてみよう。
■ちなみに発表されたスライドの一部はコチラにあがっているようです。