2017-03-31 10 views
0

私たちはNodeJSアプリケーションのビルド/デプロイにDockerを使用しています。 Jenkinsによって構築されたtestコンテナがあり、ユニットテストが実行されます。私たちは+は、カバレッジレポートのHTMLファイルを生成し、ユニットテストを実行しますnpm run test:covを実行するように、この手順を変更したいdockerコンテナの内部からのrsyncファイル?

FROM node:boron 

# <snip> some misc unimportant config here 

# Run the tests 
ENTRYPOINT npm test 

:Dockerfileはこのようになります。 Dockerfileを次のように変更しました。

# Run the tests + generate coverage 
ENTRYPOINT npm run test:cov 

...が動作します。わーい!

...しかし今、私はリモートサーバにrsync(Dockerfileの中の上記のコマンドによって生成された)カバレッジレポートをどのようにするのか不明です。

docker run -t test --rm 

、再度、上記のテストを実行し、コンテナが存在する:

はジェンキンスにおいて、上記設定はこのように呼び出されます。

entrypointコマンドの実行後に、いくつかの追加ステップを追加するにはどうすればよいですか?たとえば、rsyncによってリモートサーバーにいくつかの結果が出力されますか?

答えて

0

エントリポイントとして実行するスクリプトを作成し、スクリプトにコマンドを入れます。 docker runを呼び出すときに引数を渡し、スクリプトに渡されます。

ドキュメントには、postgresイメージのスクリプトの例があります。あなたはそれを構築することができます。

Docker Entrypoint Docs

0

私は「ノード」専門家ではないよ、そう細部に私と一緒にクマ。

まず、テストを実行するために別のDockerfileが必要かどうかを検討することができます。理想的には、実際の画像を変更することなく画像を構築し、テストしたいと思っています。

ベースイメージ(FROM my-nodejs-image)としてあなたのNodeJSアプリは、トリックを行うことができます使用してテストイメージを構築するが、あなたがしなければならないすべては上の異なるコマンド/エントリポイントを実行している場合は必要とされなくてもよいです画像。

2番目。ステートフルなデータ(カバレッジレポートはそのカテゴリに分類される)は、コンテナの内部に格納されてはならない(つまり、コンテナのファイルシステムに格納されない)。あなたのコンテナは一時的で、コンテナのライフサイクルを超えて生きるべきもの(コンテナ自体が消えた後に保存すべきもの)があれば、コンテナのの外側にを格納する必要があります。 「ボリューム」またはバインドされたディレクトリに格納されます。

「個別のDockerfile」ポイントから始めましょう。たとえば、NodeJSアプリケーションDockerfileは次のようになります。

FROM node:boron 

COPY package.json /usr/src/app/ 
RUN npm install && npm cache clean 
COPY . /usr/src/app 

CMD [ "npm", "start" ] 

イメージをビルドし、ビルドされたコミットなどでタグ付けします。

docker build -t myapp:$GIT_COMMIT . 

イメージが正常に作成されたら、テストします。おそらく実際にそれが "実行されている"ことを確認するための簡単なテストです。おそらく何か、それをするための多くの方法;

docker run \ 
    -d \ 
    --rm \ 
    --network=test-network \ 
    --name test-{$GIT_COMMIT} \ 
    myapp:$GIT_COMMIT 

実際にテストするコンテナは何かを行います。

docker run --rm --network=test-network my-test-image curl test-{$GIT_COMMIT} 
一度テスト

(および削除一時的なコンテナ)、あなたはしかし、代わりに、容器内のカバレッジレポートを書くの、ボリュームにそれを書くか、マウントを結合し、あなたのカバレッジテストを実行することができます。 に変更すると、コンテナ内で実行するコマンドはdocker runとなります。

mkdir -p /coverage-reports/{$GIT_COMMIT} 
docker run \ 
    --rm \ 
    --name test-{$GIT_COMMIT}\ 
    -v /coverage-reports/{$GIT_COMMIT}:/usr/src/app/coverage \ 
    myapp:$GIT_COMMIT npm run test:cov 

上記のコマンドは、

  • usr/src/app/coverage
  • で容器に/coverage-reports/{$GIT_COMMIT}をバインドマウント
  • あなたが構築され(とmyapp:$GIT_COMMITをタグ付けされた)画像を実行します
  • テスト・アーティファクト(カバレッジレポート)を格納するために独自のローカルディレクトリを作成します。カバレッジテストを実行します(ノードエキスパートではなく、誤っていない場合は/usr/src/app/coverageに書き換えます)
  • 終了後にコンテナを削除します。

コンテナが終了すると、カバレッジレポートはホスト上の/coverage-reports/{$GIT_COMMIT}に格納されます。通常のツールを使用して、rsync希望するものを使用することができます。

volume pluginを使用して結果を(たとえば)s3バケットに書き込むことができます。これにより、結果をrsyncする必要がなくなります。

テストが成功したら、docker tagイメージでアプリケーションのバージョン(たとえばdocker tag myapp:1.0.12345)、docker pushをレジストリにバンプして新しいバージョンを展開できます。

関連する問題