Mob Programming の体験ができる/事例発表があるイベント
気が向いたら更新。
これから
体験できる
- 2017.07.22 - Agile Japan 2017 愛媛サテライト - connpass
- 2017.07.25 - モブプログラミング交流会 at ヴァル研究所
- 2017.07.27 - Mob Programming Val #1|TECH PLAY[テックプレイ]
- 2017.07.28 - Mob Programming at クリエーションライン - connpass
事例発表など
終わったもの
体験できる
- 2017.04.13 - AgileJapan2017
- 2017.04.24 - よちよち.rb 第124回 "よちよちモブプロ会" - よちよち(の心をずっとわすれない).rb | Doorkeeper0
- 2017.04.25 - DevOpsDays Tokyo 2017
- 2017.05.29 - モブプログラミングをやってみる - DevLOVE関西 | Doorkeeper
- 2017.06.19 - MobProgramming at ヴァル研究所さん
- 2017.07.01 - Coderetreat for Girls - connpass
- 2017.07.01 - 突発的イベント in Trailhead Live Tokyo - Tokyo Salesforce Developer Group (東京都) | Meetup
事例発表など
- 2017.06.18 - DevLOVE200 Bridge - DevLOVE | Doorkeeper
- 2017.07.11 - モブプロディスカッション | Eventbrite
Mob Programming のエントリまとめ (リンクだけ)
いちいち探すの面倒なので、まとめておこう。 ひとまずリンクだけ。
インタビュー
- モブプログラミング - Woody Zuill氏とのインタビュー
- チーム全員が1台のPCを共有するというモブ・プログラミングの実態。果たしてその効果とは?【バズワードから紐解くエンジニアのキャリア Vol.5】 - エンジニアtype | 転職@type
考察とか
- モブプログラミングが気になったので、なんとなくひろって集めてみた - Togetterまとめ
- CoolなソロとHotなペアプロのあいだ – 時を超えたプログラミングの道
- マネジメントにも技術力は必要。モブプログラミングのメリットとは?|ウェブ担当者通信
- (´-`).。oO(Mob Programming) - Mitsuyuki.Shiiba
- 内向的な人がモブプログラマになるのは難しいのか?
- モブプログラミングって何だ? - iyuichiの私的開発ログ
- モブ・プログラミングって開発手法が人気を集めつつあるらしいぞ : 汎用型自作PCまとめ
- Mob Programmingとは何者か?これはすぐに導入すべきだ - fuuno
- モブプログラミングを楽しむエンジニアをWanted!! - 株式会社レベルファイブのエンジニア中途・インターンシップの求人 - Wantedly
- 今はコードがお偉いさんなんだからMOBは雁首揃えろって話
- 技術なきマネジメントの衰退とその対策 - メソッド屋のブログ
動画
- A day of Mob Programming - YouTube
- A day of Mob Programming 2016 - YouTube
- A DAY OF MOBBING at Agile Japan 2017 - YouTube
やってみた
- モブプログラミングを試してみてわかった事|ネスケラボ
- モブプログラミングやってみたら最高だった #MobProgramming - ジムには乗りたい
- (なんちゃって)モブ・プログラミング(もどき)でスキル伝授をしてみた
- (なんちゃって)モブ・プログラミング(もどき)を何回か実践しての気づき
- (なんちゃって)モブ・プログラミング(もどき)の比較
- モブプログラミングを実際にやってみた - Qiita
- 流行りのモブプログラミングをやって分かった 個人の開発手法の違い - Qiita
- 社内でモブプログラミングやってみた #mobprogramming - クリエーションライン株式会社
- モブプログラミングをやってみた | Engineer Blog | 株式会社エムティーアイ
- 夏到来!みんなで飛び込もう モブプログラミング の海へ!!〜Backlogチームの場合〜 | ヌーラボ
- モブプログラミングおためし会をやってみた | Goalist Developers Blog
- モブプログラミングというものを体験してきた
- ガイアックスで10年、エンジニアとして感じたこと | Gaiax official website
- 取り組みを始めたとのこと
やってみた @ Agile Japan 2017
- モブプロって楽しい! - hi, hikaru
- AgileJapan2017でモブプログラミングに飛び入り参加しました。 - Akiyahの日記
- モブプログラミングをするマシンにMobsterが入ると最高だった | Recruit Jobs TECHBLOG
やってみた @ DevLove関西
やってみたじゃないイベント
ツール
【デンパ】 人間の業を肯定し、得体のしれないモチベーションを使ってアジャイルと付き合う
Joy,Inc.の強烈でまっすぐな「たーのしー!!」と、インフルエンザウィルス、けものフレンズに脳みそがやられた結果、貯めに貯め込んだ色んなものがスパークしまくって、いろいろつながったらしく、ずーっと追いかけてた答えみたいなものが出てきたので、忘れないために書いておく。
超個人的なものなので、適用範囲は狭い。というか、オレ専用。 傍流 of 傍流。光と闇のはざま。フツーの人は来ちゃいけないところのハズ。
後、いくつかの少ない経験と所詮本質の掴めないニワカが集めた情報から導き出された理屈なので、これでいいのか良く分かんない。 ついでに、ここに書いてるストーリ通りに物事が動いたかというと、かなり怪しい。自分の理屈のために事実を捻じ曲げてることは十分にありえる。記憶の改ざんなんてラクショーだもんね。
まぁ、こんなこと考える必要があるのはオレだけだし、すがるものも他に見つからないから、これを使って実験することにする。
スッキリしたこと
大きく2つ。これを続ければ、オレはうまくアジャイルと付き合える(ハズだ)。
- 良く分かんないモチベーションを大事にする
- 人間の業を肯定し、それを使って、人の役に立つロールを見つける
良く分かんないモチベーションを大事にする
続けるためにはモチベーションが必要だ。
ただ、オレには使命感みたいなのがない。会社が、組織が、お客様が。とか、そういうのがない。 危機感もない。かなりのんびりしている。あとで大事になって慌てるタイプだ。できないやつの典型。
どっちもない人はどうすればいいんだろう? オレは、良く分かんないモチベーションを使うことにした。なんかわかんないけど、夢中でやっちゃうやつ。 自分の中の理屈はわからないんけど、感じてることは分かる「たのしー」「すげー」「さすがー」
- パイプライン作るのたのしー!!
- ツール使ったら、こんなに簡単になるんだ、すげー!!
- 達人ってこんな本読んでるんだ、さすがー!!
そういうの。(ちょっと強引?)
実は最後のは説明できる。達人に憧れるけど、近づけないので、せめて同じものに触れようとしてるのだ。涙ぐましい。 それやる時間があるなら、スキルを身に着ける訓練して、達人に近づけばいいんだけど、なにせ、オレなので、そんなことはしない。 しても続かない。ここに業がある。
業の話は置いといて、まぁそういう原初的な感情を使ってモチベーションを上げて、続けることにした。 これにはアップダウンが起きるという副作用があるんだけど、そこは人間だし仕方ないよねーってことにしてフタをする。 とあるマンガによれば、たゆまぬ鍛錬により「エンドルフィンどばどば」を常態化させることができるらしいので、そっちに行くのもありかもしれない。
人間の業を肯定し、それを使って、人の役に立てるロールを見つける
アジャイルは達人のノウハウが凝縮されている。これでもかってくらいギトギトに。 奴らは、マネジメント、エンジニアリング、マインドセット全方向で攻めてくる。さすが達人だ。逃げ場は用意されてない。
一方、オレは弱い人間だ。「気が散りやすい」「自分を中心に考える」「思慮が浅い」「苦手なことは後回し」「続けるの苦手」「危機感知能力が低い」辺りは標準装備。 売上? KPI? 何それ? 自分がやってることすら、意図を説明するのに一苦労、っていうより、上手く説明ができない。 説明できないから企画も立てられない、なので、必然的に予算も取れない。いつもスカンピンだ。(まぁそれで訓練されるものもあるんだけど)
こういう人間がアジャイラーを目指すと、間違いなく挫折する。能力を獲得するために必要な鍛錬ができないからだ。やってるうちに飽きちゃうし。
最初は真面目にアジャイルなエンジニアになろうともがいてたんだけど、苦しいばっかで旨みがない。 それでも何かになりたくて、あっちこっちうろついてたんだけど、まぁ、訓練できない人は何にもなれない。 ひたすら情報だけが貯まっていくだけの日々。しかし、なれない人には使う機会もない。
バッドエンドまっしぐらだったんだけど、45歳になってとある教育を受けたとき、このまま情報ため込んで爆死はちと寂しいと考えるようになり、 長期間に渡り情シスさんのDevOpsの取り組みを手伝い、また、自分でも色んな助けを借りながら社内勉強会を長く続けてきたこと、 さらに会社でも共創というキーワードが流行り始め、アジャイルに興味がある人が増えてきたのもあって、オレのポジションがなんとなーく分かってきた。
自分自身がアジャイラーになることは一旦諦めて、そっちに向かう人に、自分が持ってる情報をパスする役 になればいいのである。
ロール「情報を渡す人」として自分を見れば、
- 「気が散りやすい」は、「いろんなところに足を運び、情報を取って来る」
- 「自分を中心に考える」は、「いろんなものを自分のこととして考えられるので、情報にオレなりの解釈を1つ加えて出すことができる (つっても無駄なのも多いんだろうけど)」
- 「思慮が浅い」は、「ざっくり合えばいいやくらいで、情報をライトに送れる」
- 相手にとって迷惑かどうかはオレにはわからんないのだ。マジ。当たらないと思ったことが当たったりするし、その逆もあるしで。
と、弱みがプラスに変わるのだ。 強引? だって、そう思い込まなきゃ、この先やってらんないだもん。 オレが動ければいいんだから、自分の脳みそをある程度の騙せる理屈と体験さえあればいいのだ。(この辺が自分中心)
そうそう。体験は大事。 社内でオレの雑な情報の渡し方でも喜んでくれる、返事を返してくれる人と出会えたのは、非常にありがたかった。
隣の人は聞き上手で、さらに、水どうと、デイリーポータルZが好きという、オレにとってヒジョーに話しやすい人だったのである。そーとー話聞いてもらった。マジ感謝。
コミュニティはチャットで会話をするようになったのがデカい。オレの思考の垂れ流しをスルーしてくれる人たちで助かった。(もちろん返事もしてもらった。沢山)
そういう人たちに情報を何回も渡すことで、こっちもだんだん情報の渡し方に慣れていくことができた。 感謝。感謝。感謝のメッセージ1万本とか言ったら怒られそうだし、オレもそんなに出せない。
情シスさんとは2年という、オレにとっては非常に長い期間お付き合いをさせていただいている。 長いから、たまに、前に出した情報が、時間が経った後にヒットするなんてことがある。 そういう経験を通じて、以前より待つこともできるようになった。犬でも「待て」ができるのに、なぜオレにはできなかったのか。犬以下。
まとめ
そんなこんなで、色んな意味で弱い人間のオレが、その業を克服することなく、なんとかアジャイルと付き合う方法は、
- 良く分かんないモチベーションを大事にする
- 「使命感、危機感」を感じないのを負い目にせず、「たのしー」「すげー」「さすがー」で動く
- 人間の業を肯定し、それを使って、人の役に立つロールを見つける
- オレのダラシない部分を「情報を渡す人」に必要な要素に変換して、少しでもいいので人の役に立つことをする
この辺らしい。
ただ、この先、このロールだけで生きていけるのか? というとちと疑問がある。 作る人には未練もあるし、何かしら方法を探したいなー。なー。なー。 言うだけならタダだし、言うとなれるっていう話もあるから、言うだけ言っておこうっと。
でも、みうらじゅんまで長じれば…あるいは…。でもあの人のスキルセットって、サブカルの中でもかなりレアらしいからなぁ。
構築に役立ったと思うもの
考え方やスタイル?
芯を外してるものも多い気がするけども。角さん、牛尾さん、川口さんにはいつも感謝しておりますです!!!
追いかけすぎて、ストーカーと化しているんじゃないか…と心配になるレベル…。ばれてるかなぁ。ばれてるだろうなぁ。
- でもやるんだよ from 因果鉄道の旅 via 角 征典さん
- 自分の生まれたホシ from 因果鉄道の旅 via 角 征典さん
- 『いままで当たった棒を10本並べりゃ自分の生まれたホシがわかる』
- 『このホシを知り、心がけさえよくすれば、便通同様、ホシの循環もよくなり、しかも、フィードバックと申しましょうか、自分自身が次第に増幅していく』
- 人間の業を肯定する from 立川談志師匠 via 角 征典さん
- 「気軽に聞く」「気軽に断る」 from 牛尾剛さん
- ソフトウェア開発の生産性を阻害する「気軽に聞けない」ことの考察と対策 - メソッド屋のブログ
- 情報聞くとき、渡す時も、気軽に
- 相手がいらないよーっていうのも気軽に受け止める。あ、そうっすかー
- 自己肯定感 from (不明)
- これを持つためにこの8年があったっぽい
後、ここ最近の良く分からんデンパなツィートに反応していただいた皆様ありがとうございました。
練習
練習嫌いなので、知らず知らずのうちに練習させられてたんだと思う。
- 分ける
- 全部でまるっとまとめない
- できてるところ、できてないところ
- 合意できるところ、できないところ
- イイところ、悪いところ
- 褒めるのに使うし、アジャイルやる人探すのにもいるし、とにかくこれないと辛い
- 全部でまるっとまとめない
- 捨てる
- 全部自分でやりたい
- 昼の勉強会を長く続けるためには、人の力を借りる必要があったので、自分でやりたいは捨てないとアカン
- 捨てたおかげで、何が大事なんだっけ、オレ? を考えられるようになった
- 全部自分でやりたい
- 説明する
- 全部説明しなくていい
- ポインタさえ示しておけば、ピンときたとこ抜き出すくらいのライトさでもヒットする人はいる
- 逆にヒットしない人に、オレは上手に説明できないだろうから、そこはご縁がなかったことにして一旦忘れる
- ピンと来たところを引用する via 川口 恭伸さん
- オレが作った変な要約を渡すよりよっぽど良い
- 全部説明しなくていい
- 待つ
- 情報を渡した後、しばらくたってから様子を見にいく (今もせっかちなとこあるけど)
- 情報渡してすぐ反応がないからといってダメだーって言ってると、せっかく出てきた芽が見のがしてしまう
- しばらくたって芽が出ることもたまにあるから、渡した後忘れてしまうくらいでいい
- マーケティング的にはそれじゃあかんのだろうなぁ
- 情報を渡した後、しばらくたってから様子を見にいく (今もせっかちなとこあるけど)
オレを勘違いしてくれた皆様
最重要。オレという人間を勘違いして、色んなところで使おうとしてくれた/してくれてる人がいる。 名前出すと怒られそうなので、こういう感じでお茶を濁しておくけど、感謝しとりますー!!!
…って、実は仕掛けられてて、今も観察の対象だったりする??
Visual Studio Team Services と Rocket.Chat の連携 (プルリクエストだけ)
平間ソンでできたこと1つ目。
背景
- 開発チームはVSTSを使っている
- ちょっとした連絡にはRocket.Chatを使っている
- VSTSでプルリクエストを作った後、いちいち手動でRocket.Chatに連絡しているので、面倒
- Rocket.Chatのサーバは 社内イントラ にある
やりたいこと
- VSTSでプルリクエストを作ったら、自動でRocket.Chatにメッセージを投げるようにしたい
実現案
a. VSTSのRoom使う (Service Hooks)
多分一番素直なやり方。今回は使えないけど。
連携方法
Roomを開いて、Manage Events -> Pull requestsを選択。 出てくるダイアログで、プロジェクトとリポジトリ、変更した人(チャットメンバーまたは誰でも)を選べば通知ができる。(チェックボックスをONにするのを忘れずに)
詳しくは https://msdn.microsoft.com/en-us/library/vs/alm/work/productivity/collaborate-in-a-team-room あたりを見ればわかる。
対応しているイベント
作成と、ステータス変更。タイトルなどの修正は対応してない。
連携イメージ
b. Service Hooksを使う
Service Hooksについて
Service Hooksを使うと、外部ツールと連携ができる。 https://www.visualstudio.com/en-us/get-started/integrate/service-hooks/webhooks-and-vso-vs
連携可能なツール
一覧がどこにあるのかわからなかった。 https://www.visualstudio.com/en-us/integrate/explore/explore-vso-vsi.aspx で紹介されているアイコンでなんとなくわかるのでよし。
Rocket.Chatとの連携
Rocket.ChatのIncomming WebHookはSlackと互換性があるので、Service Hooksの設定で連携先にSlackを選択、URLにRocket.ChatのIncomming WebHookのURLを設定すれば良い。 ただし、https必須。
Rocket.Chatをhttpsで
独自ドメインも証明書も持ってないので、AzureのWeb Appsでも使おうかと思ったけど、はまりそうだったので、Herokuを利用。Herokuだと本家リポジトリにあるリンクから一発でデプロイできる。
https://github.com/RocketChat/Rocket.Chat
でも、ここまでするなら素直にSlack使ったほうがいいよなぁ...と思ったことは内緒にしておく。
連携方法
Rocket.Chat
管理 -> サービス連携 -> 新しいサービス連携 -> Incomming WebHookで作成。 作成したら、Webhook URLに表示されているURLをメモしておく。
VSTS
プロジェクトの設定 -> Service Hooks -> "+"ボタンでHookを追加する。
- Serivice: Slack
- Trigger: Pull request created
- Action:
- Slack Webhook URL: (Rocket.Chatで作成したWebhookのURLを設定)
Trigger "Pull request updated" についても同じようにHookを作る。
対応しているイベント
Roomと同じ。 作成と、ステータス変更。タイトルなどの修正は対応してない。
連携イメージ
URLのリンクがうまくいってないのは、SlackとRocket.Chatで書式が違うから。(だと思う)
Incommig WebHookの設定にScriptという項目があるので、そこでごにょごにょすれば直るかもしれない?
c. REST APIを使う
背景の Rocket.Chatのサーバは社内イントラにある のおかげで、a,b案は使えない。 ので、結局ここに落ち着くはず。
HubotでVSTSのREST APIを叩き、拾ってきた情報をRocket.Chatに流す。
HubotとRocket.Chatの連携
Rocket.ChatもRocket.Chat連携用のHubotもコンテナが用意されてるのでそれを使うと楽。 RocketChat/hubot-rocketchat: Rocket.Chat Hubot adapter
VSTSのREST API
Pull Requestに関しては以下のページを参照。 Git Pull Requests | REST API Reference for Visual Studio Team Services and Team Foundation Server
APIに必要な認証
Basicのみ対応。
GitHubにあるRailsアプリをVSTSでビルドして、Azureにデプロイする with Docker - cougerの日記 を見て、Alternate authentication credentials を有効にする。
Personal Access Tokenに対応しているので、そちらを使おう。ScopeはCode(Read)のみでOKっぽい。
指定する場合はこんな感じになる。ユーザ名はなんでもOK、パスワードにPersonal Access Tokenを指定すれば良いようだ。
http://[なんでもOK]:[Personal Access Token]@hogefuga.visualstudio.com/....
Personal Access Tokenの有効期間は180日なのでご注意をば。設定で1年間にすることも可能。
Personal Access Token、有効期間について @kkamegawa さんにアドバイスもらいました。ありがとーございます。
@nobiinu_and personal access token じゃダメなんでしたっけ?
— kkamegawa (@kkamegawa) May 3, 2016
@nobiinu_and あとPATを使う場合最長180日だったかなので、気をつけてください
— kkamegawa (@kkamegawa) May 3, 2016
できたもの
だんだん疲れてきたので、できたものをペタペタ。
最初はActiveなものを全部出して、その後は、新規作成したものだけ表示。
vsts show pr [Active|Completed|Abandoned]
のコマンドをhubotに投げると指定したステータスのプルリクを全部表示。
あと、チャーハン。
ごちゃごちゃしているのはなんとかならないものかなぁ。
Hubotスクリプト
Personal Access Tokenを使うように変更。
# Description: # VSTSのPull Requestが作成されたらメッセージを投下します # # Configuration # vsts... の変数を適宜変更してください # # Commands: # hubot vsts show pr [Active|Completed|Abandoned] - 指定したステータスのPull Requestを全部表示 # hubot チャーハン - チャーハン作ります cronJob = require('cron').CronJob startDate = new Date vstsAccount = "[VSTSアカウント名]" vstsProject = "[VSTSプロジェクト名]" vstsRepository = "[VSTSリポジトリ名]" vstsPersonalAccessToken = "[VSTS Personal Access Token]" vstsRemoteUrlBase4PR = "https://#{vstsAccount}.visualstudio.com/DefaultCollection/#{vstsProject}/_git/#{vstsRepository}/pullrequest" vstsRestApiUrlBase4PR = "https://hubotvstsnotifier:#{vstsPersonalAccessToken}@#{vstsAccount}.visualstudio.com/defaultcollection/#{vstsProject}/_apis/git/repositories/#{vstsRepository}/pullrequests\?api-version\=1.0" module.exports = (robot) -> createRestApiUrl4PR = (status, top) -> url = vstsRestApiUrlBase4PR if status? url = "#{url}\&status\=#{status}" if top? url = "#{url}\&$top=#{top}" url searchPullRequests = (status, top, callBack) -> url = createRestApiUrl4PR status, top robot.http(url) .get() (err, res, body) -> responseJson = JSON.parse body callBack responseJson.value createPRMessage = (pullReq) -> prUrl = "#{vstsRemoteUrlBase4PR}/#{pullReq.pullRequestId}" "[#{pullReq.pullRequestId}](#{prUrl}) #{pullReq.title} (#{pullReq.sourceRefName} -> #{pullReq.targetRefName})" showPullRequests = (status, top) -> callBack = (pullReqs) -> prMsgs = for pullReq in pullReqs createPRMessage pullReq if prMsgs.length is 0 msg = "@all: プルリクエストはなかったよ" else msg = "@all: プルリクエストが#{prMsgs.length}個あるよ\n#{prMsgs.join('\n')}" robot.send {room: 'general'}, msg searchPullRequests status, top, callBack showRecentPullRequests = (status, top) -> callBack = (pullReqs) -> prMsgs = for pullReq in pullReqs creationDate = new Date pullReq.creationDate continue if startDate > creationDate createPRMessage pullReq startDate = new Date if prMsgs.length is 0 return msg = "@all: 新しいプルリクエストが#{prMsgs.length}個あるよ\n#{prMsgs.join('\n')}" robot.send {room: 'general'}, msg searchPullRequests status, top, callBack robot.respond /vsts show pr (.*)/i, (msg) -> showPullRequests msg.match[1], null robot.respond /チャーハン/, (msg) -> msg.send """ ```` <- 本当は3個 チャーハン作るよ!! ∧_∧ (`・ω・) 。・゚・⌒) / o━ヽニニフ)) しーJ ```` <- 本当は3個 """ # 初回のみActiveなものを全部出す showPullRequests "Active" # 以降は新しいもののみ出す new cronJob('*/30 * * * * *', () -> showRecentPullRequests "Active" ).start()
実行環境
カレントディレクトリにscriptsフォルダを作成して、上記のCoffee Scriptを配置したあと docker-compose up -d
でRocket.ChatとHubotが立ち上がり、VSTSの連携が始まります。
フォルダ構成
+ root + bot + Dockerfile + scrpts + hubot-vsts-notifier.coffee + docker-compose.yml
docker-compose.yml
chat: image: rocketchat/rocket.chat environment: - MONGO_URL=mongodb://db/rocketchat ports: - "3000:3000" links: - db db: image: mongo ports: - 27017 bot: build: ./bot links: - chat environment: ROCKETCHAT_URL: http://chat:3000 ROCKETCHAT_ROOM: '' LISTEN_ON_ALL_PUBLIC: true ROCKETCHAT_USER: [RocketChat認証ユーザ名] ROCKETCHAT_PASSWORD: [RocketChat認証パスワード] ROCKETCHAT_AUTH: password BOT_NAME: bot volumes: - ./scripts:/home/hubot/scripts
Dockerfile
FROM rocketchat/hubot-rocketchat RUN npm install cron time
連携イメージ
Vagrant 1.8.1@Windows でフォルダの同期に rsync を使う
この辺の記事を見て、やってみようと思ったまでは良かったんだけど、いろいろつまづいたのでメモ。
使ったソフトのバージョン
- Vagrant 1.8.1
やったこと
Vagrantfile でフォルダ共有の設定を以下のようにした
config.vm.synced_folder "d:\\Development\\hoge", "/vagrant",
owner: "vagrant", group: "www-data",
type: "rsync", rsync__exclude: [".git/", ".otto/", "Appfile", "Vagrantfile"]
以下、つまづいたことと、解決または回避策。
つまづき1: sshが終わらない
以下のメッセージが出た後、反応がまったくなくなる。
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
VirtualBoxのGUIでログを確認したところ、DLLの読み込みに失敗しているようだった。
DLLを調べたところ、ネットワークドライバのものらしい。
どうしようもないのでネットワークドライバをアンインストール...orz
ので、現在有線LANが使えない。
ちなみにドライバは "Qualcomm Atheros Killer Network Manager"
あとから最新バージョン入れてみよう。
⇒ 最新版を入れたら解決した!!!
Killer Networking - Driver Downloads
つまづき2: rsync がない
chocolateyでrsyncをインストール。
つまづき3: rsyncで No such file or directory (2)
以下のようなエラーが出た。
There was an error when attempting to rsync a synced folder.
Please inspect the error message below for more info.
...(略)
rsync: change_dir "/d/Development/hoge" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) atmain.c(1165) [sender=3.1.1]
[Vagrantインストールフォルダ]\embedded\etc\fstab に以下を追加する。
d: /cygdrive/d
つまづき4: rsyncで良く分からんエラー(1)
以下のようなエラーがでる。
There was an error when attempting to rsync a synced folder.
Please inspect the error message below for more info.
...(略)
mm_receive_fd: no message header
process_mux_new_session: failed to receive fd 0 from slave
mux_client_request_session: read from master failed: Connection reset by peer
Failed to connect to new control master
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.1.1]
以下の回避策を適用。
つまづき3: rsyncで良く分からんエラー(2)
以下のようなエラーが出る。
C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/io.rb:32:in `encode': "\x8A" followed by "%" on Windows-31J (Encoding::InvalidByteSequenceError)
...(以下、スタックトレース)
外部エンコーディングがWindows-31Jになっているのが問題らしい。 環境変数 RUBYOPT を設定する方向で回避できないか試行錯誤してみたものの、できなかった。 ので、以下を参考に io.rb を修正して回避。
Windows + Vagrant + Rails の比較的快適な環境を作る - みかづきメモ
embedでリンクが上手くできなかった...。
io.rb:32 修正前
data << io.readpartial(READ_CHUNK_SIZE).encode("UTF-8", Encoding.default_external)
io.rb:32 修正後
data << io.readpartial(READ_CHUNK_SIZE).force_encoding("UTF-8")
つまづき4: rsyncで良く分からんエラー(3)
以下のようなエラーが出る。
C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/providers/virtualbox/driver/version_5_0.rb:380:in `split': invalid byte sequence in UTF-8 (ArgumentError)
...(以下、スタックトレース)
上記と同じようなエラーっぽいので、 version_5_0.rb を修正して回避。
version_5_0.rb:380 修正前
execute("list", "bridgedifs").split("\n\n").collect do |block|
version_5_0.rb:380 修正後
execute("list", "bridgedifs").force_encoding('ASCII-8BIT').split("\n\n").collect do |block|
ということで動くようになりましたよ。
GitHubにあるRailsアプリをVSTSでビルドして、Azureにデプロイする with Docker
11/15に社内の人とハッカソン練習会をした。 Railsで作ったアプリを、VSTSでビルドして、AzureとDockerを使って動かすのに挑戦...したんだけど、上手くいかなかった。 ので、日を改めてチャレンジした記録。
目標
- Microsoft Azure, Docker, Visual Studio Team Serviceを使って、Railsアプリをデプロイしたい
考えていること
- 以下を自動化したい。
- Dockerイメージのビルド
- プライベートレジストリへのPush
- デモ用サーバへのデプロイ
- Docker Machine使いたい
- Docker Machineでプライベートレジストリや、デモ用サーバを作りたい。(楽だったから)
ビルドエージェントの構築
VSTSからビルドエージェント上でDockerコマンドを実行できるようにする。
VSTSプロジェクトの作成
Azure Portal にアクセス
新規 -> 開発者向けサービス -> Team Project から作成。 いろいろ聞かれるので適当に入れる。
VSTSプロジェクトの設定変更
ユーザとパスワードを使ってVSTSに接続できるようにする。
Alternate authentication credentials を有効にする
- VSTSにアクセス
- 鍵マーク -> Settings をクリック
- Application Connections にある Alternate authentication credentials を Allow に変更
認証するユーザと、パスワードを指定する
- 名前 -> My Profile
- Security -> Alternate authentication credentials をクリック
- Enable alternate authentication credentials をチェック
- Password, Confirm Password を入力して、Save をクリック
Passwordは以下の条件を満たす必要がある。
Passwords must be between 8 and 32 characters long, and must include 3 or more of the following: numbers, uppercase letters, lowercase letters, and special symbols.
ちなみに Alternate authentication credentials を使うと、VSTSからツッコミがある。
Personal access tokens are a more convenient and secure replacement for Alternate authentication credentials. Please use personal access tokens instead.
ので、Personal access tokenを使いたいんだけど、後回しにする。
Agent Poolの作成
- VSTSにアクセス
- 鍵マーク -> Settings をクリック
- Agent pool -> New pool をクリック
名前を入れて、OKをクリックする。
プロジェクトの作成
- VSTSにアクセス
- Recent Projects & Terms にある New をクリック
- パラメータ設定して、Create project をクリック
ビルドエージェント用サーバの作成
VMの作成
AzureからUbuntu Server 14.04 LTSでVMを作成する。
- 参照 -> 仮想マシン -> 追加をクリック
ビルドが早くなるかもということで、Standard_D1にした。
適当にパラメータを設定。
ランゲージパックの更新
ログインするとやれと言われたので。
sudo apt-get -y install language-pack-ja
Dockerのインストール
http://docs.docker.com/engine/installation/ubuntulinux/ を見ながらインストール。 sudo 必要ないようにdockerグループにユーザを追加する。
sudo usermod -aG docker [ユーザ名]
VSTS Agentのインストール
Node.jsのインストール
nvmでインストールするので、まずはnvmのインストール。 https://github.com/creationix/nvm を見ながら。
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
source ~/.bashrc
バージョンを指定してインストール。
nvm install v4.2.3
azure-cliのインストール
npm install -g azure-cli
azure-cliでAzureにログインする
azure login
標準出力に出てくるガイドに沿ってログインプロセスを進める。 サブスクリプションが適用されているかどうか確認する。
azure account list
利用したいサブスクリプションがカレントではない場合は、以下のコマンドでカレントにする。
azure account set [サブスクリプションID]
VSTS Agentのインストール
https://github.com/Microsoft/vso-agent を見ながら。
npm install vsoagent-installer -g
mkdir myagent; cd myagent
vsoagent-installer
VSTS Agentの起動
node agent/vsoagent
ユーザ名、パスワードを聞かれるので、上の方で設定したユーザ名とパスワードを入力する。 パラメータを幾つか聞かれるので入力。 無事接続すると、以下のようなメッセージが表示される。(最後にAgent Started.が出れば多分OK)
...
...
2015-12-11T15:45:09.233Z: Agent Started.
VSTSのAgent Poolでビルドエージェントが起動していることを確認する。
動作確認
テスト用ビルド定義を作成、Dockerが動作するかどうか確認する。
テスト用スクリプトの作成
ビルド定義からはバイナリファイルを直接呼び出すことができない。 ので、ビルドエージェントに以下の内容のシェルスクリプトを用意する。 (test.shとした)
docker run hello-world
vsoagentを再起動(ログインからやり直し)しないと、以下のようなエラーが出るかも。
2015-12-11T16:11:06.376Z: Cannot connect to the Docker daemon. Is the docker daemon running on this host?
テスト用ビルド定義の作成
- プロジェクトにアクセス
- BUILD -> "+" をクリック
- Empty を選択して、Next をクリック
- Create をクリック
ビルドができたので、ステップを追加する。
- Add Build Step をクリック
- Utility -> Shell script -> Add をクリック
- Close をクリック
- Script path にテスト用スクリプトのパスを入力して Save をクリック
- 名前を聞かれるので、適当に名前をつけて保存
実行するビルドエージェントを変更する。 さっき作ったビルド定義を開いていると思うので、以下の手順を流す。
- General -> Default agent queue をビルドエージェント名にする
- Save -> OK をクリックする
ビルドの実行
- プロジェクトにアクセス
- BUILD -> Build definition -> [ビルドの名前] をクリック
- 右ペインの queue build... をクリック
- OKをクリック
ビルドが成功して、以下のようなログが出力されたらOK。
レジストリ、デモ用サーバを作成する
Docker Machineを使ってサーバを作ってみる。
準備
Docker Machineのインストールと、証明書の作成。
Docker Machineのインストール
unzipないと怒られるので先に入れる。
sudo apt-get -y install unzip
後は https://docs.docker.com/machine/install-machine/ 見ながらインストール。
curl -L https://github.com/docker/machine/releases/download/v0.5.0/docker-machine_linux-amd64.zip >machine.zip && \
unzip machine.zip && \
rm machine.zip && \
sudo mv docker-machine* /usr/local/bin
一応、動作確認。
docker-machine --version
証明書の作成
AzureでDocker Machine使うのに必要。
mkdir ~/azure-cert; cd ~/azure-cert
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout azure.pem -out azure.pem
いろいろ聞かれるので、入力。
openssl pkcs12 -export -out azure.pfx -in azure.pem -name "Azure Certificate"
openssl x509 -inform pem -in azure.pem -outform der -out azure.cer
chmod 600 azure.pem
証明書の登録
- https://manage.windowsazure.com/ にアクセス。
- 設定 -> 管理証明書 をクリック
- アップロードをクリック
- azure.cer をアップロード
レジストリサーバの構築
サブスクリプションIDが必要なので確認。
azure account list
docker-machineでサーバを作る。
docker-machine create -d azure \
--azure-subscription-id "[サブスクリプションID]" \
--azure-subscription-cert "[azure.pemのパス]" \
--azure-location 'Japan West' \
--azure-username '[ユーザ名]' \
--azure-password '[パスワード]' \
--azure-ssh-port 10022 \
--azure-size 'Small' \
--azure-docker-port 52376 \
[レジストリサーバ名]
エンドポイントを設定。
azure vm endpoint create \
--name docker-registry \
[レジストリサーバ名] \
5000 \
5000
デモサーバの構築
レジストリサーバの構築と同じ手順で、サーバを作成する。楽チンだ。 エンドポイントも設定。
azure vm endpoint create \
--name rails \
[デモサーバ名] \
3000 \
3000
動作確認
サーバの確認
docker-machine ls
レジストリサーバ
eval $(docker-machine env [レジストリサーバ名])
docker run -d -p 5000:5000 registry
リクエストを送ってみる。
curl http://[レジストリサーバ]:5000/v1/search
以下のような結果が返ってくればOK。
{"num_results": 0, "query": "", "results": []}
デモサーバ
GitHubのRailsアプリをビルド、レジストリに登録、評価サーバへのデプロイまでやってみる。 ビルドには、Railsアプリ用のDockerイメージ rails:onbuild を使う。 rails:onbuildを使うと、任意のRailsアプリをDockerイメージにできる。
コード: https://github.com/agilecommunity/home_kpt
プライベートレジストリにhttpでアクセスさせる
httpでアクセスするようにビルドエージェント上のDockerサービスにinsecure-registryのオプションを指定する。 ビルドエージェントと、デモ用サーバで、/etc/default/dockerのDOCKER_OPTを変更し、サービスを再起動する。
/etc/default/dockerを変更する。
DOCKER_OPTS=--insecure-registry [レジストリサーバ]:5000
サービスを再起動する。
service docker restart
念のため、デモ用サーバでも実行するのを忘れないこと。(忘れててPullに失敗した...)
Dockerイメージのビルド
リポジトリをクローン。
git clone https://github.com/agilecommunity/home_kpt.git
直下のディレクトリにDockerfileを作成。
FROM rails:onbuild
ビルド。
cd home_kpt
docker build -t ajako/home_kpt .
Dockerイメージの動作確認
Railsが上がればOKとする。
docker run -it --rm ajako/home_kpt
プライベートレジストリに登録
プライベートレジストリに登録するので、タグつける。
docker build -t [レジストリサーバ]:5000/ajako/home_kpt
レジストリに登録
docker push [レジストリサーバ]:5000/ajako/home_kpt
レジストリの内容を確認。
curl http://[レジストリサーバ]:5000/v1/search
レジストリにイメージが登録されていたら、以下のような結果が返ってくる。
{"num_results": 1, "query": "", "results": [{"description": "", "name": "ajako/home_kpt"}]}
デモ用サーバにデプロイ
Railsが動けばOKとする。
eval $(docker-machine env [デモ用サーバ名])
docker run -it --rm [レジストリサーバ]:5000/ajako/home_kpt
VSTSからビルド、デプロイを実行
シェルスクリプトの作成
ビルドと、デプロイで分ける。 ビルド用。カレントディレクトリでビルドをする想定。
docker build -t [レジストリサーバ]:5000/ajako/home_kpt .
docker push [レジストリサーバ]:5000/ajako/home_kpt
デプロイ用。Docker Composeで実行する。
eval $(docker-machine env [デモ用サーバ])
docker stop ajako_home_kpt
docker rm ajako_home_kpt
docker run -d -p 3000:3000 [レジストリサーバ]:5000/ajako/home_kpt --name ajako_home_kpt
初回失敗するのだよなぁ。これだと。
ビルド定義の作成
外部サービスの登録
GitHubにアクセスするために外部サービスの登録をする。
GitHub personal access tokenの作成
- GitHubにログイン
- 自分のアイコン -> Settingsをクリック
- Personal access tokens -> Generate access tokenをクリック
- 名前と、scopeを指定し、Generate tokenをクリック VSTSによると repo, user, admin:repo_hook がいいらしい
access tokensの画面にアクセストークンが表示されてると思うので、それをメモ。
コネクションの作成
- プロジェクトを表示
- 鍵マーク -> Services をクリック
- New Service Endpoint -> GitHub をクリック
- RepositoryタグでRepository typeにGitHubを指定
- ConnectionのところのManageをクリック
- New Service Endpoint -> GitHubを選択
- 名前と、Personal access token -> トークンを指定してOKをクリック
ビルド定義の作成
新しいビルド定義をEmptyテンプレートで作成する。
リポジトリの指定
- Repository をクリック
- Repository typeを、GitHubにする
- Connectionで、作成したコネクションを選択
- Repositoryに選択できるリポジトリが表示されるので、対象のリポジトリを選択
ステップと、エージェントプールの指定
Saveで、保存。
動作確認
ブラウザからアクセスして、画面が出たらOK。 なんだけど、実はこのアプリ、DBにPostgreSQL使ってるので、エラー画面が出るのだなぁ...orz まぁ、なんとかDockerイメージ作って、レジストリにPush、デプロイまではできたということで、ここまでに...いや、やろう。
デモサーバでPostgreSQLを実行して、Railsアプリと連携させる
Docker Composeでやるのが面倒なくていいので、そっちでやる。
ビルドエージェントにDocker Composeをインストールする
https://docs.docker.com/engine/installation/ubuntulinux/ を見ながら。 rootで以下を実行
curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
動作確認
docker-compose --version
データベースの起動と初期化
設定ファイルの作成
以下の内容で docker-compose.yml を作成する。 説明はごめんなさい。はしょります。 Railsは環境変数 DATABASE_URLを指定すると、設定ファイルを無視して、環境変数の内容で接続してくれるらしい。ありがたい。
DBは永続化するデータをDockerホスト側に出した。
web:
image:[レジストリサーバ]:5000/ajako/home_kpt
ports:
- "3000:3000"
links:
- db
environment:
- DATABASE_URL=postgresql://[DBユーザ]:[DBパスワード]@db/home_kpt_db
db:
image: postgres:9.4
environment:
- POSTGRES_PASSWORD=[postgresのパスワード]
volumes:
- [デモサーバのどこか]/home_kpt_db:/var/lib/postgresql/data
起動確認
docker-compose.ymlのあるディレクトリで以下を実行。
docker-compose up
ブラウザからアクセスすると、DBに接続しようとしてエラー。ユーザ作ってないからね。
DBユーザとデータベースの作成
コンテナの中に入ってDBユーザと、データベースを作成する。
docker ps
で名前確認して、以下のコマンドでシェルを実行。
docker exec -it [名前] /bin/bash
DBを初期化する
su - postgres
cd /usr/lib/postgresql/9.4/bin
./createuser -P [DBユーザ名]
パスワード聞かれるので入れよう。 オーナーを指定してDBを作成。
./createdb -O home_kpt home_kpt_db
次にあるマイグレーションのように docker-compose で実行できればいいのに...。
マイグレーション
ビルドエージェントから実行。
docker-compose run web rake db:migrate
デプロイスクリプトの修正
eval $(docker-machine env ajakohackathonDockerDemo)
cd [docker-compose.ymlのある場所]
docker-compose pull web
docker-compose up -d web
動作確認
無事画面が出た!!!
ということで、GitHubのRailsアプリをVSTSを使ってDockerイメージにして、Azureにデプロイするまでが完了。 長かったなぁ。
今後やりたいこと
Microsoft DevOps ハッカソンに参加したよ
Microsoftさんが主催するDevOpsハッカソンに参加したので、そのレポート。
DevOpsハッカソンとは?
イベントの内容からコピペ。
DevOpsのマインドセットを2日間のトレーニングで学ぶイベントです。
伝統的なアプリケーションライフサイクルマネジメント(ALM)から脱却して、
DevOpsの人、プロセス、そしてツールについて学んで、
顧客により早くビジネス価値を届けられるようになりましょう!
DevOpsハッカソンに参加すると、あなたは開発者、インフラ技術者の方とチームを組んで
Infrastructure as Codeに関する実際の環境でDevOpsのプラクティスを適用することができます。
大まかな流れ
- DevOpsについての説明
- アイデア出し&チーム決め
- ホワイトボードに名前と自分のやりたいことを書いてみる
- みんなに紹介
- 各自投票
- ハッカソンについての説明
- 大まかな進め方、チームの評価ポイントなど
- ハック!! (翌日15:30まで)
- 発表の準備を含む
- 初日の残業は18:00まで :P
- 発表&表彰
- 1チーム5分でプレゼン
私たちのチームができたこと
Visual Studio OnlineとAzureを使ったJavaアプリのビルド、デプロイと、負荷テスト。
ビルドと、デプロイはVSOのビルドを使って自動化。負荷テストは手動で実行。
Javaアプリのコード、デプロイのスクリプト(Dockerfileなど)は、MS 寺田さんがデモで作成されたものを利用。
発表スライド
ビルド
GitHubにあるコードをクローン&ビルド&warファイルにパッケージング。
デプロイ
ビルドで生成されたwarファイルを使って、Dockerイメージを作成、DockerHubにpush。
評価用サーバにイメージをpullして、コンテナを起動。
イメージのビルドやデプロイ用のスクリプトはGitHubに格納。
負荷テスト
Visual Studioを使って負荷テスト。 PowerBIを使ってグラフ化。
お借りしたコード
- Javaアプリ: https://github.com/yoshioterada/GlassFish-Docker
- Dockerfile: https://github.com/yoshioterada/JavaEE7-App-On-Docker
お借りした知恵
山ほど。MSのみなさん、どうもありがとうございました。
参加者だったのにたくさんのヘルプに応じてくれた竹林さん、ありがとう!!!
使ったお金
Azureポータルで見ることができるので、さらしてみる。
Visual Studio Onlineが一番太いようだ。
※ VSOは5人まで無料。今回は6人チームだったので、1人分のコストが発生したとのこと。
ふりかえり
良かった
- Visual Studio Onlineを使って継続的デプロイを体験できた
- 会場が快適!! お弁当おいしい、ネットもスイスイ、飲み物たっぷり
- メンバーそれぞれがビルド、デプロイ、負荷に分かれて、いい感じで進めてた
- バランスがとても良かったんだと思う
- 困った時にいろんな人の手を借りた
- 牛尾さん、寺田さん、MSのみなさま
- 竹林さん、原田さん
- 全体の絵を描いて、みんなのコミュニケーションを助けた(と思いたい)
困った
- VSOを使えるようになるのに時間がかかった
- 事前の素振りを間違えた感がある
- dockerじゃなくてサンプルを素振りしておけばかなり楽になったんじゃないか?
- 事前の素振りを間違えた感がある
- テストがない!!
- 時間がなかったからとか言ってたら、誰かにしばかれそう
- VSOAgent, 評価用サーバは手動で作成
- 何回もやるとすると骨折れるし、やっぱ自動化したいところ
- 他のチームとほとんど話せなかった
- 今考えるともったいない気がする
- 最後のプレゼン、各チームのデモをスクリーンで見たかった
- 準備時間考えるとちょっと難しかったと思うけど
- 写真が少なすぎる!!
- ブログ書くとき致命的
次やるとき
- 何を素振りするか注意しよう
- 提供されるサンプルがある場合はまずそこから始めてみよう
- Hello Worldアプリからスタートして、少しずつ成長させよう
- 最初に絵を描いてみよう
- 描けなければ分かってないことが分かるし、上手くいけばみんなの理解を助けることができる
- 他のチームにも遊びに行こう
- 邪魔しない程度に
- 1時間に1回休憩入れて、写真撮ろう
- 頭冷やせるかもしれないし
自分たちでやるとしたら
Azureの費用について、Facebookでコメントをもらったので更新。ありがとうございます!!!
もし、小さな(1チーム=5人未満)DevOpsハッカソンをやるとしたら。
- 会議室: 10時間 * 2
- Wifi: 自前または、付属の会議室を探す
- Azure利用料: 1,000円程度
- VSOは5人まで無料、6人目からは費用が必要
- 仮想マシンリソースは使わない時は落とす
落とさない=24時間運用の場合は3倍くらいになるはず
ご飯と飲み物は、自分の好みで持ち込み。(俺の場合はコンビニ弁当とパンで十分)
会議室は スペースマーケット | 貸し会議室から球場まで簡単予約 とか見ると、Wifi付きで400円/時間くらいから借りられるみたい。
項目 | 費用 | |
---|---|---|
会議室+Wifi | 8,000円 | 400円/時間 * 10時間 * 2日 |
Azure使用料 | 1,000円 | ツワモノがいる場合でも3,000円くらい?? |
9,000円を5人で割って1人1,600円。
ツワモノが集まったとして12,000円だから、1人2,400円。(ツワモノを甘くみすぎ??)
1,600円+食費・交通費だったら、飲み会1回分より安いので、参加しやすいかも。
問題は、MSのエバンジェリストと、VSO、Azureの達人をどうやって確保するか……だよねぇ。
DevOpsハッカソンに参加した人を巻き込んでしまうのがいいかもしれない。
以下は、私から見た経緯。長いし、偏ってるのでご注意をば。
やったこと(1日目)
DevOpsの説明&チーム決め
DevOpsエバンジェリストのDavidさんからDevOpsの説明。そもそもから始まって、VSOを使った継続的インテグレーション、継続的デプロイなどが紹介されてた。
CIの部分は牛尾さんが説明。参加者を罠にはめて、TDD&ペアプロの実演に引きずり込むなど、牛尾さんらしい進め方。
次は、ハッカソンのアイデア出し。
チームでホワイトボードに名前とハッカソンでやってみたいことを書きだして、共有。
このままチームでやりたいこと選んで、ハッカソンスタートなのかなぁと思ったら、
全チームのホワイトボードを壁にはって、みんなにも共有。
その後、自分の名前を書いた付箋を、やりたいテーマに貼り付けて、テーマごとにチームを組み替えた。
なるほど、やりたいテーマで集まった方が面白いよなぁ。
VSO使った継続的インテグレーション・継続的デリバリーをテーマにしてみたものの、他のテーマの方が面白そうでうろうろしてたら、その間に自分が出したテーマに5人集まっちゃって、身動きが取れなくなってしまった。(と、この時点では思ってたんだけど、後から考えてこれはとてもラッキーだったと思う)
後、ぼっちチームができそうになって、かっこえーとか思ってた。
チームができたら、ハッカソンの進め方や評価ポイントなどを説明。 ざっくり計画立てて、スタート!!
ハックハック!!
正確には四苦八苦が正しい。
最初はオートスケールできたらいいねとか、インフラのテストやりたいよね、WebアプリはRailsにしたいよね、という話をしていて、1日目終わるまでに、アプリがデプロイできたらいいんじゃない? なんて気軽に思ってた。
楽観的に考えてることがうまくいけば世の中楽なんだけど、そうはいかず。
VSOの環境設定ではまってどたばたしてたら、夕方が来てたような気がする。(すでに記憶が薄い)
「進捗どうですか?」と聞かれたら、「まったく進捗なしです」と答えなきゃいけない事態。ヤバい。
なんでこう、自分がやるときは楽観的に考えてしまうんだろうね...orz
他の人もいろいろとはまってた模様。夕方近くなっての進捗は、確かこんな感じだったと思う。
- ビルド: できてない
- デプロイ: できてない
- 負荷テスト: できてる!!!
よもや負荷テストが一番最初にできるとは...。 このままいくとやばそうなので、ビルドとデプロイは事前に提供されてたサンプル PartsUnlimitedMRP を使うことに。
18:00までの残業を終えて、1日目終了。
不安だったので、帰ってからサンプルを素振り。2時間程度で継続的インテグレーションの部分ができた。
サンプルの説明が丁寧だったのに加え、昼にこけた経験が生きた結果と思われる。
デプロイもできるようにしておこうかと思ったんだけど、設定ミスのせいでつまづいて気力大幅にダウン&KO。
2日目
朝のワーク
2日目のスタートは、牛尾さんのワークから。 背伸びした後、おたけび。おたけび???
「イイイイヤァァァァーッ!」
その後、「作業の見える化しましょう(だったと思う)」ということで、残タスクを見積もり時間も合わせて書き出した後、課題を共有。 タスクを見ながら、今日どこまで行けそうか相談するという流れ。
いつも自分が会社の人に説明していることのはずなのに、言われてあーそうだよねと気づいたりするところが情けなかったり。
ハックハック!!
いろいろあって、昼頃の状況。
- ビルド: できた!!
- デプロイ: できない
- 負荷テスト: できてるので、さらに楽しいことを!!
デプロイさえできたら、繋がるんだけどなぁ。
DockerホストとVSOエージェントの連携が上手くいかなかったりなんだりで、なかなか進まない。
それでも、MS寺田さんが作っていたDockerfileを使って、Glassfishのイメージを作成、評価サーバにデプロイ、実行するところまで到達。
でも、ビルドしたアプリをGlassfishで動かそうとすると失敗する。
あーだ、こーだと悩んでいるうちに、残り2時間。
この時点で、集中力が切れてしまった。けっこう、あきらめ早い。
1人だったらここで終了なんだけど、そこはチーム。まだまだ終わらない。
MS寺田さんのアドバイスで、動かすアプリをサンプルのものから、寺田さんの作ったものに切り替え。 ビルドとデプロイを修正して.... できた!!!
プレゼンの準備
手が空いてた人がプレゼンの資料を作ってくれてたので、自分はほとんど何もせず。
手慣れた感じで、さくさくっと作ってて、とても羨ましく思うなど。
このへんから、笑いも出たり和やかな雰囲気に。
終わってなかったら、多分眉間にシワが寄ってたと思うし、今も寄ってたんじゃないかと思われる。
みんなの粘りに感謝。
プレゼン&表彰
各チーム、5分間のプレゼン。 メモがないので、覚えていることを書き出してみる。
- 優勝は、Mesos使ってたチーム
- 他のチームも四苦八苦して、軌道修正してた
- VSOでタスク管理してたチームがいた
- 小さく積み上げながら上手く作ってたチームがいた
- プレゼン資料まで作ってたのはうちくらい
後、うちのチームもいいところまでいってたみたい。 Team4のみなさん、MSのみなさん、参加者のみなさん、お疲れ様でしたー!!!