我不是一个“节点”专家,所以在细节上多多包涵。
首先,您可以考虑是否需要单独的Dockerfile来运行测试。理想情况下,您希望构建图像,然后进行测试,而不修改实际图像。
建立该应用程序使用您的NodeJS作为基础图像(FROM my-nodejs-image
)的测试图像可以做的伎俩,但如果所有你需要做的就是在运行不同命令/入口点可能不需要图片。
其次;有状态数据(覆盖报告属于该类别)不应该存储在容器内(即,不存储在容器的文件系统中)。你希望你的容器是短暂的,并且任何超出容器生命周期的东西(在容器本身消失后应该保留的任何东西)应该被存储在容器的外部之外;无论是在“卷”还是在一个绑定安装的目录中。
让我从“单独的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
上述命令;
- 创建一个唯一的本地目录来存储测试工件(覆盖报告)
- 运行你构建(和标签
myapp:$GIT_COMMIT
)在usr/src/app/coverage
- 绑定贴装的
/coverage-reports/{$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
添加到您的注册表中,并部署新版本。