VisualStudioでDockerサポート付きのアプリを作ってCI/CD構築する 最終回

 VisualStudioで作るDockerサポートの付いたWebアプリのCI/CD構築までを進めていく。
 前回にSeleniumを使ったテストを用意した。今回はこのテストをTravisCI上で実行し、その後の自動デプロイまで行う。一通りのファイルが入ったコミットは↓。
https://github.com/hMatoba/DockerAppWithCI/tree/75bf4e201625ad0ae4bfa76f38bfd80acd8b67e3


 TravisCIとGithubの連携は済んでおり、GithubへのプッシュでTravisCIでのビルドまで走るようになっているとする。.travis.ymlはこれから用意する。
.travis.yml

language: csharp
mono: none
dotnet: 2.0.0
dist: trusty
services:
- docker

env:
- DOCKER_COMPOSE_VERSION=1.16.0

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
- cd SeleniumTest
- sudo pip install -r requirements.txt
- cd ..

script:
- cd DockerAppWithCI
- dotnet publish DockerAppWithCI.csproj -c Release -o ./obj/Docker/publish
- docker build -t matoba/dockerappwithci:ci .
- cd ..
- 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
- sleep 10
- cd SeleniumTest
- python setup.py test
- cd ..

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

matrix:
fast_finish: true


 installの項で、docker composeやseleniumテストに必要なものをインストールしている。
 scriptの項ではまず、Webアプリプロジェクトの発行を行っている。Webアプリを他環境にもっていっても実行可能な状態で出力してくれるのがdotnetのpublishコマンド。
https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish?tabs=netcore2x
 Webアプリがdotnetコマンドで発行されたら、それを入れたDockerイメージをビルドする。そしてcomposeでWebアプリコンテナを含めた、テスト一連に必要なコンテナの起動を行う。TravisCIでのテスト用に、docker-compose.travis.ymlというファイルを用意して、これをターゲットにcomposeコマンドを実行している。webappコンテナで使うイメージは直前にビルドしてあるのでそれを使う。あとのリバースプロキシ、Selenium、MongoDBのコンテナは開発環境と同様。
docker-compose.travis.yml

version: '3'

services:
webapp:
image: matoba/dockerappwithci:ci
front:
image: matoba/ssldevenv
ports:
- "443:443"
selenium:
image: selenium/standalone-chrome:3.4
ports:
- "4444:4444"
mongo:
image: mongo
ports:
- "27017:27017"

 これを使ってcompose upするが、ちょっと待ってやらないとコンテナの準備が完了しない。そのためcompose upの直後に10秒ほどsleepを入れてある。sleepが終わったら、開発環境でも行っていたSeleniumテストが走る。これに成功すればその後のafter_successの項が実行される。

 ここでデプロイ先、本番環境について。今回はAzureのWeb App for Containersを使う。AzureでWeb App for Containersを作ると、中のオプションからWeb HookのURLが取ってこれる。これをメモしておく。


 次にDocker Hubへ行く。そしてアプリに使うイメージのリポジトリを選択、あるいはまだイメージを一度もプッシュしていなければリポジトリを作る。
 リポジトリのオプションでWeb Hook URLを入れられるようになっている。ここにさきほどメモしたURLを入れる。これでDocker Hubへのイメージ更新が、Web App for Containersへプッシュされるようになる。


 TravisCIへもどる。.travis.ymlについて。after_successではDocker Hubへ、作成されたアプリイメージのプッシュを行っている。${DOCKER_USERNAME}と${DOCKER_PASSWORD}はTravisCIで環境変数として用意しておく。

これでDokcer Hubへのプッシュが行われる。


 上記の動作をする.travis.ymlと、docker-compose.travis.ymlを用意し、Githubへプッシュする。使っているコンテナの多さなどから五分弱ぐらいかかるかもしれないが、自動テストが行われ、テストにパスすればアプリは自動でデプロイされる。


 VisualStudioで作るDockerサポート付きのWebアプリのCI/CD構築ができた。ぼくはこの手順でAzureとは別のサービスを使って、このブログをCI/CDのもとに機能追加をしながら運用している。
https://github.com/hMatoba/tetsujin

 ASP.NET Core MVCのアプリでCI/CDを構築した。開発は今回はWindows上で行ったが、公式ではVSCodeを使ってLinuxやMac上で行う説明がある。ビルド、テスト、デプロイはTravisCI上で行っており、UbuntuやDebianなどのメジャーなディストロを使っている。Github、TravisCI、DockerコンテナホスティングサービスのHyper.shの一連の連携も難なく取れている。C#やそのまわりのコンパイルのツールなどもオープンソースになっている。ベンダーロックイン?なにそれ。
 もうC#はWindowsだけじゃないんだなーというところ。
comment: 0