这是Jenkinsfile
生成的默认jx
container('nodejs') {
sh "npm install" #line 2
sh "CI=true DISPLAY=:99 npm test" #line 3
sh 'export VERSION=$PREVIEW_VERSION && \
skaffold build -f skaffold.yaml' #line 4
sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:$PREVIEW_VERSION"
}
skaffold build
最终将运行docker build
,而Dockerfile
也具有npm install
(重新运行与上述第2行相同的内容)
我知道第2行的npm install
是为第3行的npm test
做准备。但是我很好奇,为什么不只对生成的docker文件运行测试?
container('nodejs') {
sh 'export VERSION=$PREVIEW_VERSION && \
skaffold build -f skaffold.yaml'
sh 'docker run IMAGE_GENERATED_BY_SKAFFOLD npm test'
sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:$PREVIEW_VERSION"
}
这样,我们不需要重新执行npm install
。此外,运行npm test
的环境与skaffold
生成的环境完全相似。
我很好奇,詹金斯-X团队不这样做的考虑是什么?
答案 0 :(得分:1)
是的-我猜这取决于Dockerfile
-它可以进行npm安装,也可以将已构建的工件复制到docker映像中-在这种情况下,尽管无需运行npm install
两次。我们应该为npm修复构建包,以避免出现双重npm install