2017-10-12 8 views
5

.NET Core 2.0 Web APIをビルドしています。私はDockerイメージを作成しています。私はDockerにとって非常に新しいので、その質問が以前に答えられていれば謝ります。多段ドッカービルド(.NET Core 2.0)からのユニットテスト結果の抽出

画像を作成するために、以下のDockerファイルがあります。特に、私はビルドプロセス中にユニットテストを実行し、結果は./test/test_results.xmlに出力されます(ビルド時に作成された一時的なコンテナ内にあります)。私の質問は、ビルドが完了した後、これらのテスト結果にどのようにアクセスすればよいのでしょうか?

FROM microsoft/aspnetcore-build:2.0 AS build-env 

WORKDIR /app 

# Copy main csproj file for DataService 
COPY src/DataService.csproj ./src/ 
RUN dotnet restore ./src/DataService.csproj 

# Copy test csproj file for DataService 
COPY test/DataService.Tests.csproj ./test/ 
RUN dotnet restore ./test/DataService.Tests.csproj 

# Copy everything else (excluding elements in dockerignore) 
COPY . ./ 

# Run the unit tests 
RUN dotnet test --results-directory ./ --logger "trx;LogFileName=test_results.xml" ./test/DataService.Tests.csproj 

# Publish the app to the out directory 
RUN dotnet publish ./src/DataService.csproj -c Release -o out 

# Build the runtime image 
FROM microsoft/aspnetcore:2.0 
WORKDIR /app 
EXPOSE 5001 
COPY --from=build-env /app/src/out . 

# Copy test results to the final image as well?? 
# COPY --from=build-env /app/test/test_results.xml . 

ENTRYPOINT ["dotnet", "DataService.dll"] 

私が取ったアプローチの1つは、# COPY --from=build-env /app/test/test_results.xml .という行にコメントすることです。これにより最終画像にtest_results.xmlが置かれます。次に、これらの結果を抽出し、次のpowershellスクリプトを使用して最終イメージからtest_results.xmlを削除します。

$id=$(docker create dataservice) 
docker cp ${id}:app/test_results.xml ./test/test_results.xml 
docker start $id 
docker exec $id rm -rf /app/test_results.xml 
docker commit $id dataservice 
docker rm -vf $id 

これは醜いと思われますが、私はそれを行うよりクリーンな方法があると思います。

私はdocker build中にボリュームをマウントする方法があったことを期待していたが、それは、これは、公式ドッカーでサポートされる予定であることを表示されません。

単体テスト専用の別の画像を作成しています。

私は欲しいものを達成するための推奨される方法があるかどうかはわかりません。

+0

解決方法はありますか?私は全く同じ問題を抱えています。 – Mike

+0

@Mikeいいえ、申し訳ありませんが、まだです。テスト結果を最終的な画像に一時的に追加して抽出する方法については、私はちょっと考えました。 Dockerの新機能なので、これを行う方法や推奨される方法があるかどうかをチェックしたかっただけです。 – Francis

答えて

0

ご質問ありがとうございます。私は同じことを解決する必要がありました。

ビルドの結果に基づいて別のコンテナステージを追加しました。テストとその出力はすべて最終的なコンテナに到達しないようにすべて処理されます。そう構築-ENVは、次いで、中間試験容器を構築するために使用されるビルドENV画像に基づいて、最終がでコピービルドENVの結果を伴うランタイムコンテナに基づいている。

# ---- Test ---- 
# run tests and capture results for later use. This use the results of the build stage 
FROM build AS test 
#Use label so we can later obtain this container from the multi-stage build 
LABEL test=true 
WORKDIR/
#Store test results in a file that we will later extract 
RUN dotnet test --results-directory ../../TestResults/ --logger "trx;LogFileName=test_results.xml" "./src/ProjectNameTests/ProjectNameTests.csproj" 

Iは、シェルスクリプトを追加しました次のステップとして、イメージをプロジェクトテストとしてタグ付けします。

#!bin/bash 
id=`docker images --filter "label=test=true" -q` 
docker tag $id projectname-test:latest 

その後、基本的にはドッカーcpを使用してファイルを取り出します。違いは私のテスト結果は決して最終的なイメージにはなかったので私は最終的なイメージに触れないことです。

全体的には、テストを正しく行うには、テストイメージ(ビルドイメージに基づいて作成)を作成し、マウントしたボリュームでテスト結果を実行し、そのコンテナの起動時に単体テストを実行することが望ましいと思います。適切なイメージ/コンテナを使用すると、統合テストなども実行できます。この記事は古くなっていますが、類似しています。https://blogs.infosupport.com/build-deploy-test-aspnetcore-docker-linux-tfs2015/

関連する問題