M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

S・ジャクスン『処刑人』

処刑人 (創元推理文庫)

処刑人 (創元推理文庫)

文体は読みやすいし表現はうつくしいし、空想に没入しがちの主人公の懊悩の過程は読んでいてたのしいのです。そしてウルフの作品みたいに作品全体に妙な緊張感もあります。それにしても、比喩表現と仄めかしと空想世界の描写が渾然一体となっており、巻末の解説を読んでやっと得心した箇所もままあり。私には難しい作品でした。

Visual StudioソリューションをTravis CIでビルド&テストする

Travis CIはGitHub上のGitリポジトリでバージョン管理されているプロジェクトのコードに対して、PushやPullリクエストをトリガーにして自動的にビルドやテストを実行して結果をログしてくれるサービスです。OSSのプロジェクトに対しては無償、それ以外のプロジェクトに対しては有償でサービス提供しています。Travis CIについてはまだ日本語ドキュメントは少ないようですがその概要や利用方法はこちらのページなどで取り上げてくれています。

今回、これまでこのブログ上で紹介してきたいくつかのC#プログラムのGitリポジトリをこのTravis CIに接続してみました。その手順をメモしておきます。

NOTE: Travis CIはビルドの実行にDebianLinux仮想マシンを利用しているようです。当然ビルドはMonoにより行われます。よってWindows OSの.NET Frameworkでしかビルドできない構成のソリューションはTravis CI上でビルドできないはずです。Xamarin StudioやMonoDevelopにより作成・メンテ・動作確認されているVSソリューションであれば問題ないと思いますが、VSにより作成・メンテ・動作確認されているものの場合はビルドできない可能性があると思います。

#1. Travis CIにサインアップする

Travis CIのサインインはGitHubアカウントを使ったOAuth認証で行われます。トップページの[Sign Up]をクリックすると、GitHubOAuth認証・認可ページに遷移します:

f:id:m12i:20161228095313p:plain

[Review permissions]欄でTravis CIに許可される機能をチェックしてください。[Organization access]欄にあなたが参加している組織リポジトリの一覧が表示されている場合は、ここで同じようにTravis CIのアクセスを許可するかどうかを選択できます。[Authorize application]ボタンをクリックすると認証・認可が実行されます。

#2. 対象リポジトリをアクティベートする

OAuthの認証・認可が終わるとTravis CIのページに戻されます。この記事を書いている現在(2016年12月)ではサインイン後のトップページは以下のような画面になっています。あなたがGitHub上で管理しているリポジトリが左側のペインに表示され、右側には個々のリポジトリのステータスが表示されるレイアウトです(各リポジトリ=プロジェクトのビルド結果次第で表示カラーやテキストは変わってきます):

f:id:m12i:20161228095812p:plain

左側のペインでTravis CIで継続的インテグレーションの対象にしたいリポジトリ名を選択(クリック)します。すると右側のペインにそのステータスが表示されます。

この表示の右上に[More options]というドロップダウンリストがあります。このリストから[Settings]を選択(クリック)します(ドロップダウンリストから選ばなくても、ステータス表示画面のタブのなかに[Settings]が存在するかもしれません):

f:id:m12i:20161228100602p:plain

設定画面が表示されるので[General Settings]で以下の項目をONにしておきます。画面での変更は即座に保存されるようです。これでアクティベートは終わりです:

  • Build only if .travis.yml is present
  • Build pushes
  • Build pull requests

f:id:m12i:20161228100650p:plain

#3. プロジェクトに.travis.ymlファイルを追加する

Travis CIに対してプロジェクトで使用している言語やビルド前後に実行させたいスクリプトを指定するため、 .travis.yml というファイルを作成してプロジェクトのルートに保存します。このファイルにはCIのために用意された仮想環境(DebianLinuxみたいです)のシェルで実行させるコマンドを記述できます。

数年前までC#Travis CIでサポートされておらず、このymlファイルの中でオープンソースCLR実装であるMonoをインストールするコマンドまで記述する必要があったようです。が、現在はさすがにそこまでする必要はなく、ただNUnitなどテストランナーの準備についてだけ特別な考慮が必要という状態のようです(こちらの記事にそのような記述がありました)。

ともかくも、Visual StudioC#プログラムのソリューションをTravis CI上でビルド&テストさせるため、こちらのブログ記事 "Setup Travis CI to compile a C# project and run NUnit tests" を参考に.travis.ymlファイルを作成します:

language: csharp
script:
  - xbuild /p:Configuration=Debug (ソリューション名).sln
before_install:
  - sudo apt-get install nunit-console
before_script:
  - nuget restore (ソリューション名).sln
after_script:
  - nunit-console (テストプロジェクト)/bin/Debug/(テストアセンブリ).dll

参考までに、 "Tac.MetaServlet.Client" のために作成したymlファイルの内容を掲載しておきます。このソリューションには3つのテストプロジェクトがあるので、yml末尾のテストコードを含むアセンブリの記載が複数行になっています:

language: csharp
script:
  - xbuild /p:Configuration=Debug Tac.MetaServlet.Client.sln
before_install:
  - sudo apt-get install nunit-console
before_script:
  - nuget restore Tac.MetaServlet.Client.sln
after_script:
  - nunit-console Test.Tac.MetaServlet.Rpc/bin/Debug/Test.Tac.MetaServlet.Rpc.dll
  - nunit-console Test.Tac.MetaServlet.Client/bin/Debug/Test.Tac.MetaServlet.Client.dll
  - nunit-console Test.Tac.MetaServlet.V56.Client/bin/Debug/Test.Tac.MetaServlet.V56.Client.dll

ymlファイルができたら手元のリポジトリにCommitして、GitHub上のGitリポジトリにPushします。

#4. ビルドステータスをチェックする

.travis.ymlをPushしてしばらくすると、Travis CIが自動的にこれを検知して、ymlに記述された設定・手続きでビルドを開始します。ビルドが開始されるとTravis CI上当該プロジェクトの表示がイエローになり、ビルドが成功の場合はグリーンになります:

f:id:m12i:20161228102821p:plain

プロジェクト名の右側に表示されているアイコン(上手では「build passing」)をクリックすると、README.mdなどに貼り付けてプロジェクトのステータスを示すためのバッジのコードを入手できます。

npmベースWeb開発に関する素朴な疑問

きょうは何の益もない徒然なるままに書き綴っただけの投稿です。

前回の記事で取り上げたようなことをするたびに疑問に思うこととして、npmベース開発──npmやGulp/Gruntといった周辺ツールを用いたWebアプリケーション開発において、JavaScriptCSS、そこから呼び出される画像ファイルなどの各種リソースの実行時依存性の解決はどうなっているんだろうか、ということです。

「どうなっているのか」というのは、そうしたタスクを自動化するデファクトな手法がすでにあるのか、ない場合皆さんはどんなふうな工夫をしているのだろうかということです。例えば「BootstrapのJavaScriptCSSやフォントをWebアプリの各画面からロードする」というとき、「"node_modules/bootstrap/dist"配下のサブ・ディレクトリをごっそりコピーして、そのコピー先のパスを参照する<script/>タグや<link/>タグを各HTMLファイル内に書き込みます」という身の毛もよだつような手仕事をしているのか、それとももっとクレバーな方法が実践されているのか。

JavaC#の世界とは使用する言語がちがいすぎるのかそれっぽいキーワードで検索してもそこら辺の情報がちっともヒットしません。私のGoogle先生に対する質問スキルの問題でしょうか。前回記事で取り上げたBrowserify(JavaScriptの実行時依存性を自動的・静的に解決してくれるパッケージ)にしても完全に偶然の発見でした。なんというかとても不思議な気分です。

m12i.hatenablog.com