AppVeyorで、ビルド結果をSlackに通知するメモ

先日の内容でビルドが自動化され、バッジも出たところですが
このままでは、終わったぜー!タイミングがわからないので、人的なポーリングが必要になってしまいます。もちろんメールで通知されますがメールは少し遅延があったりします。もっと即座にやってくれたほうがいろいろ使い勝手もいいかなぁと。
というわけで、Slackに通知させるようにします。

Slack側

配信先のチャンネルを用意します。もちろんすでにあるチャンネルでもよいです。
そして、Slack公式から「Incoming WebHooks」を準備します。

チャンネルごとに設定がありますので、その中からWebhook URL というのがありますので、控えておきます。

AppVeyor側

Slackを選びます。
控えておいた「Webhook URL 」を「Incoming webhook URL」に設定します。
投稿先のチャンネル名を入れます。

あとは、Saveボタンで保存!

ビルド~通知

何か適当にビルドを動かしましょう。手動でもトリガーでもいいので。
そうすると、ビルドの結果が投稿されてくるはずです。

という感じです。これ自体、.NET Coreとも関係ない世界ですが、一応のメモでした。

その他

カスタマイズとかは以下の情報が参考になりそうです。
http://www.appveyor.com/docs/notifications#slack

.NET Core WindowSocketのエラーメモ

とあるテストで、かつ1回目にしか発生しないエラーに遭遇したメモ

.NET Coreも内部ではSocketを使ってるわけで、以下のようなエラーが起きることがあるようです。
https://support.microsoft.com/ja-jp/kb/819124

今回遭遇したものは、

WSA_OPERATION_ABORTED (オペレーティング システムに依存)

  • 意味 : 重複した操作が取り消されました。
  • 説明 : ソケットが閉じているか、WSAIoctl (Wsapiref_6ik2.asp) の SIO_FLUSH コマンドが実行されたため、重複した操作が取り消されました。

でした。先のログ出力をしていってわかったことでした。
というのもこのエラー、デバッグで実行しても発生しない。
Consoleとして起動しても発生しない。
ので、実際に使う上では問題なさそうなものでした。
ただ、テストコードのようにmsで動く世界だとどうしてもシビアなのかなぁというところで、一つ一つトレースしてました。

[14:18:19.7113][  21][0][Info] ExecProcess: outputLength6087
[14:18:19.7123][  21][0][Info] HttpResponseBody.Set Length=6060
[14:18:19.7123][  21][0][Info] CgiHandler.CreateFromCgi 
[14:18:19.7133][  21][0][Info] WebServer.OnSubThread SEND
[14:18:19.7143][  21][0][Info] 33768781 SockTcp.Send 31
[14:18:19.7143][  16][0][Info] Detail Web-localhost:7188 ::1 0000004 response HTTP/1.1 200 Document follows
[14:18:19.7143][  27][0][Info] 55071656 SockTcp.EndReceive Length=31
[14:18:19.7143][  27][0][Info] 55071656 SockTcp.BeginReceive
[14:18:19.7143][   4][0][Info] 55071656 SockTcp.LineRecv 31
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.SocketErrorCode:OperationAborted
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.ExceptionType:System.Net.Sockets.SocketException
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.ExceptionMessage:スレッドの終了またはアプリケーションの要求によって、I/O 処理は中止されました。
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.ExceptionMessage:One or more errors occurred. (スレッドの終了またはアプリケーションの要求によって、I/O 処理は中止されました。)
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.StackTrace:
[14:18:19.7163][  28][0][Erro] SockTcp.SetError 55071656 SockTcp.disconnect
[14:18:19.7173][  21][0][Info] 33768781 SockTcp.SendNoTrace 173
[14:18:19.7183][  21][0][Info] HttpResponseBody.Send encode=True
[14:18:19.7183][  21][0][Info] 33768781 SockTcp.SendNoTrace 6060

という具合に、問題の箇所は突如として、謎のエラーが出てるというところです。
これを、SocketExceptionとしてキャスト、エラーコードを調べてみたところ上のエラーにいきついたというころでした。
この「OPERATION_ABORTED」というのは、Socketそのものが切断されたためのものではないため、再度受信待機に入ることで対策しました。

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

というわけでこれでした。

開発者、インフラ技術者のための DevOps ハッカソン~ DevOps のすべてをエバンジェリストと体験し学べる 2 日間~

二日間の日程でした、お仕事の都合で二日目は午前中までの参加でした。お弁当食べたかったなー。。。

一日目は、セッション、チーム分け、ハッカソン

二日目は、ハッカソン、発表

の流れだったようです。(二日目の詳細はよくわかっていない

1日目セッション中

ひたすら、つぶやいてました。以下一部

 

と、マイクロソフトのエバンジェリストと非常にテクニカルなつぶやきに@ツイートをいただいたり。

講師は、牛尾さん、安納さん、松崎さんでした。

最初はDevOpsとはから始まりました。ツールのことではなくて、取り込みといったところでしょうか・・・日本語での表現が非常に難しいところですが、思想というか文化というか。ツール感覚のものではないとは言えます、顧客ももちろん巻き込んだもので、あり方そのものともいえるかもしれません。Azureでも定期的にアップデートされ、不具合も出ては修正されてといったことが日常おきています。ただ、進化は明らかに早いですし、利用者側の立場にしてみれば、少しづつ変化しているところは、新作ゲームの発売日を待つような感動はなくとも、日々動いているんだなぁと感じます。小さな変化でも地道にアップデートされていくというのは面白いものです。

AzureResourceManagerによる、インフラのコード化、構成のコード化について。このメリットは、再現性あるインフラを作れるというところが一番なんじゃないかと思います。再現性があるから、だれでも作れる。どこでも作れる(とはいっても、Azureの異なるサブスクリプション、リージョンとかにはなりますが)、また可視化するという意味で少しづつVisualizeな部分も出てきています。上から下にながれるスクリプトバッチによって組み立てられているのではなく、オブジェクトとしてJSON形式で組み立てられているというのが面白いですね。これを、ポータルまたはPowerShellから流し込んでいくことができるということでした。他にサイドメニューとして、AutomationというAzure上のインフラを自動的に構成するツールの話も出ていました。

VSTS(VisualStudioTeamService)ちょっと前まで、VisualStudioOnlineとか言われてたものです。TeamFoundationServerから見ればクラウド版というか、開発版というか。主たる昨日を上げれば、ソース管理、チケット管理、自動ビルド、自動テスト、ロードテスト、リリース管理、チーム可視化の看板でしょうか。AzureADによる認証を用いれるので、組織には便利なんじゃないかと思います。(Office365のアカウントでもいけるということ)うまいこと使うと、チェックインから始まる自動ビルドの自動テストのデプロイ、またはリリースフローにまでほぼ自動化するデモが展開されていました。ここから先は、AzureのWebアプリにデプロイということで、締めくくられます。まだ、かゆいところは少しあるかなぁという気もしますが、Webアプリへの自動デプロイと展開スロット、A/Bテスト、バックアップなどと組み合わせていくことで、実験的に投入されたデプロイで障害が発生したとしてもすぐに戻せる。少しづつ試せる。戻すことができる。という話でした。

 

チーム分け

お弁当が支給され食した後はチーム分けでした。どういうわけか気づいたら「美女からAzureを1から10まで教えてもらえる・・・」という謎のチームに所属しました。テーマとしては面白いのと、プライベートの活動であるために、こうした学びのテーマには興味がひかれたというのはありました。自分のスケジュールを管理するといったものでは、すでにクラウドの何らかのサービスを使えばいいんじゃないかとか、Cortanaやらでいいんじゃないかとかもあったり。(ログイン時に必ず直近の予定が表示されるように)ツイッター検索は・・・APIを使えば簡単な反面、何をどうするかっていうのがないとなかなか難しいのもあって、こうした場合明確なソリューションがほしいと思ったり。クラウディアさんじゃなきゃいやだー!俺のクラウディアとなったわけではないです。

さぁミーティング

というわけで、集まったチームは3人。@ag0uさんと優れた院生と私。・・・Dev私だけ?というわけで、どう考えて。インフラ二人と私一人で、ものづくりを受けるには無理があります。というのも翌日にすでに予定があったので、私だけがモノづくりを引き受けてしまうと、その後何もできなくなる可能性がありました。ので、ここはMIX!すべての人に平等に転職のチャンスがあってもいいんじゃないか!?という建前ですね。全員が、VSもって、だれでもチェックインできる環境を作り、難しいビルドとかデプロイは、チェックイントリガーにすべて仕込んでしまえばよく、互いの作業は何かツールを使うより隣を見るほうが早かったのでした。(今思えば、徹夜するならKANBAN使ったほうが良かったかもしれないとは少し思う。)

そんな妄想をしているうちに、内容が決まり3次元より2次元(@ag0uさんが、最初からクラウディアさん、クラウディアさんといってた。おそらく隠れファン。)となりました。そして、学習として1(はじまり)とは何か?とした場合に、自習書シリーズとか、Blogとか。そして最新情報を知りたければ、英語になるけど、本家のチームブログとか。そういうステップがあるよねぇという話になりました。継続的学習には楽しいと感じるものでなければなかなかできないということで、素材を探しました。画像だけじゃなくて何か支えてくれるを感じるものがほしいということで、声を入れてみようとか。

初日打ち上げ

これは継続的にやらなくてはならないことの一つです。(ツイートの都合上)しっかりチーム全員で全うしましたっ!誇るべきことですね!ただし、継続的なので深酒は厳禁じゃないかと思います。

2日目

朝から、無謀にもWebJobsを用いた、限定的なクローラーを実装していました。Queueに追加したURLを拾って、データストアにコンテンツを突っ込んで、そこから独自検索エンジンでも作ったらいいんじゃないかと思ったんですが、数時間でできるものではありませんでした。デプロイメントの定義をテンプレートのままとしていた場合、プロジェクトをソリューションに追加するとデプロイが失敗しました。このあたり、継続的にチェックインごとに自動的にデプロイされていたので、変更セットの内容で何が問題か絞り込んでトレースできたのはとても楽でした。これいいなぁと心から思ったこと。結局問題は、デプロイメントの部分で、Zipファイルが一意じゃないからどれあげればいいかわからないっていう感じでした(Zip化されたファイルができるということを牛尾先生から伺ってました)なので、対象とするZipファイルを固有ファイル名にして、無事に解決。そのまま、お仕事するため、リタイアとなりました・・・(悔しかったのは、心にしまっておきましょう)

その後、チームの方にお話しを伺ったところ、何やらいい結果が出た!ということでおおーやったぜ!という感動と、こんなゆるくてよかったのかというものと・・・wあとチームの方が、ARMを用いて開発系のWebアプリをデプロイしようとしてたのは面白かったw

最後に

ただ、継続的にリリースしていく仕掛けを作って、挑戦していくっていう姿勢は実現できた気がします。そのために選ぶツールは、チーム構成やらソリューションにわりとあっていたかなぁと思います。人数が少ないので、看板とかやると逆に手間じゃないかとか、リリース管理とはいっても、3人での変更で、展開スロットに開発系のものがあがるので、スワップをもって完全リリースとしてしまえばよいとか。小さく初めて、少しづつ大きくしていくスマートな感じが構えずに継続的。個人のレベルから、複数人、本格的なチーム開発みたいなのが普通にできる気がした。ただこればかりは、やってみないとわからない。

問題ももちろん継続的におきるけど、それには小さな節目さえしっかり作れれば(変更の内容を掌握できること)、大きなリリースよりも、実は対処しやすいんじゃないかとか、そんな発見もあったり。ただし、明らかに使う人も巻き込んだものなので、今日からいきなりこれに変えますというのは少し難しいとは思います。スピードを上げたいとか、少しづつ変化させて様子を見ておきたいとかそういった声があれば動機になりそう。

そんな刺激的な二日間でした。

それでは!