.NET CoreのDockerコンテナに入ったWebアプリをTravisCIでCI

 VisualStudioで作成された.dcprojをdotnetコマンドでビルドしようとすると、"Microsoft.Docker.Sdkのほにゃららがない"と言われる。
The imported project "C:\Program Files\dotnet\sdk\1.0.0\Sdks\Microsoft.Docker.Sdk\Sdk\Sdk.props" was not found.


これを言われるのはWindows環境でもLinux環境でも。dotnet cliでイシューとして挙げられている。
VS2017 Docker-Compose Project breaks build on command line
必要なSDKはdotnet cliのディレクトリにはないが、VisualStudioのディレクトリには入っている。これを使えばまあできんこともないが、一時的な策になってしまう。

 dotnetコマンドで.dcprojをビルドするのはここではあきらめる。
 そもそもぼくはなにがしたいのか。VisualStudioで作ったdocker-compose入りのプロジェクトをビルドしたかった。TravisCI上でdotnetコマンドでプロジェクトをビルドして、そこから出てきたDockerイメージをDocker hubへプッシュしたかった。

 まあそもそも.dcprojのビルドは、dotnetコマンドでは無理だがVisualStudioを使えばビルドできる。それを踏まえて。
代替案
・必要なファイルを開発環境のWindowsで用意してTravisCIへ送って、DockerイメージをTravisCIでビルドしてテストがうまくいったら、Docker hubへプッシュ
・開発環境でVisualStudioでビルドしたDockerイメージをTravisCIでプルしてテスト。テストに通ったらDockerイメージをリネームしてプッシュ

 一つ目。デフォで必要なビルドしてファイルがgitでignoreされているので、ここのデフォ設定をいじらなければならない。その結果、変更を追いかけるファイルが増えてアレ
 二つ目。手っ取り早い。これでいいや。まあ暫定なので、.dcprojがビルドできないバグが直ったら改めて考える。


 一通りやってみたGithubリポジトリ↓
https://github.com/hMatoba/DNCinDocker
ロクに参考資料がないのをトライアンドエラーでやったので、コミットタイトルは超適当。

 .NET CoreのWebアプリが作成できたらリリース設定でプロジェクトをビルドし、WebアプリのDockerイメージを得る。Dockerイメージには"ci"というタグをつけておくことにする。そのイメージをDocker hubへプッシュしておく。

 Docker hubにプッシュしてあるイメージを使ったTravisCIでのテストを用意する。TestWithSeleniumというプロジェクトでSeleniumを使ったテストを用意した。これをdocker-composeで管理する。TravisCI上で使うためのdocker-composeファイルを用意する。
docker-compose.travis.yml

version: '2'

services:
dncindocker:
image: matoba/dncindocker:ci
ports:
- "8080:80"
selenium:
image: selenium/standalone-chrome
ports:
- "4444:4444"
links:
- dncindocker:webapp

 上記を使ってTravisCI上でテストを走らせる。
language: csharp

mono: none
dotnet: 1.0.4
dist: trusty
services:
- docker

env:
- DOCKER_COMPOSE_VERSION=1.8.0

before_install:
- sudo rm /usr/local/bin/docker-compose
- curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
- chmod +x docker-compose
- sudo mv docker-compose /usr/local/bin
- docker-compose -f docker-compose.travis.yml config
- docker-compose -f docker-compose.travis.yml build
- docker-compose -f docker-compose.travis.yml up -d
- sudo pip install selenium

script:
- cd ./TestWithSelenium
- python setup.py test

after_success:
- docker tag matoba/dncindocker:ci matoba/dncindocker:latest
- docker login -u="${DOCKER_USERNAME}" -p="${DOCKER_PASSWORD}"
- docker push matoba/dncindocker:latest
matrix:
fast_finish: true

 成功後にDockerイメージをリネームしてプッシュするので、Docker hubのIDとパスワードを使わなければならない。これは環境変数で埋め込む。

 一通りファイルがそろったのでGithubへプッシュしてみる。そのままTravisCIへ流れるように設定してある。







TravisCIでテストはとおっている様子。




Docker hubに、開発環境からプッシュされたciタグのイメージと、TravisCIからプッシュされたlatestタグのイメージが上がっている。

 ちなみにTravisCIで行っているコードの中身としては、必要なもののインストールとテストだけである。必要なものはdocker-composeとPythonのSeleniumドライバだけ。あとのテストコードはdocker-composeとPythonで処理される。つまり、このテストはWindowsでも実行できる。開発環境でもテストを検証できるってこと。便利。
comment: 0