目前有个 web 项目,想尝试用 Jenkins 实现自动化部署,然后项目是有单元测试的。
我想要的效果是每次 git 更新代码后,Jenkins 检测到更新,把代码拉下来,跑一遍单元测试,没问题的话就运行新的代码。
但是把 docker 加进来后,整个流程我就不知道要怎么设计了。项目是用 dockerfile 构建的,所有的代码和依赖环境都在镜像里。这样的话,我想跑单元测试就得先把镜像构建起来,并且还得进到容器里面才能跑,哪怕没有 Jenkins 这个逻辑也很奇怪了,得先 build 和 run 之后才能测试。感觉这里思路就已经不对了,但我不知道该怎么改。
网上搜了很多样例,都跟我的情况不太一样,所以请教一下整个流程应该怎么设计
1
chinvo 2019-10-19 19:17:41 +08:00 via iPhone
build 和 test 应该是与 docker 无关的,打包镜像那一步叫 pack,是过了 test 才能做的,pack 成功则执行 deploy
|
2
chinvo 2019-10-19 19:19:42 +08:00 via iPhone
或者你可以在 docker 里面执行 build 和 test,然后清理现场再打包、部署( run )
|
3
Orenoid OP @chinvo #1
> 打包镜像那一步叫 pack,是过了 test 才能做的 我就是对这个有疑问,我们测试实际也要运行测试框架吧,自然也就有相应的依赖,而这个依赖环境我是在 DockerFile 里搭建的,那么如果不把镜像 build 起来的话,就没法跑单元测试了。除非我在 docker 外又搭建一个环境,但感觉就失去用 Docker 的意义了。 P.S. 我上面提到的 build 和 run 都是指 docker 的命令 |
4
mdluo 2019-10-19 19:38:08 +08:00 1
跑测试的 pipeline 一般是 PR 触发的,直接 run 不就好了吗,为什么要 build image ?
|
6
balabalaguguji 2019-10-19 19:45:41 +08:00 1
docker 可以映射目录,代码放宿主机 a 目录,把 a 目录映射到 docker 里面的 a 目录,更新外面目录的代码,里面的代码也就更新了,然后重启下 docker 的服务就可以了
|
7
chinvo 2019-10-19 19:55:23 +08:00 via iPhone 1
|
8
basefas 2019-10-19 19:59:40 +08:00 via iPhone 1
比如一个 pipeline,分 build,test,deploy 三个阶段,第一步会把项目代码和测试代码都打包到镜像里,第二步 docker run 后执行里边的测试代码做单元测试,第三步 docker run 用来 deploy。如果对镜像大小有严格要求可以在 test 后,将 test 相关代码 ignore 后再 build,deploy
|
9
Orenoid OP @chinvo #7 不好意思,我还是没理解,“docker 容器” 就是指 docker 的 container 吗?如果是的话,不是需要先 docker build,然后 docker run image 才有 container 吗?我对 docker 还不是特别熟悉。
|
10
Orenoid OP @basefas #8
谢谢,我是不是可以理解为,build 后对同一个镜像分别用不同的命令 run 两次,也就是说会生成两个 container,然后 test 阶段产生的那个 container 是可以直接舍弃掉的。 |
11
mdluo 2019-10-19 20:18:02 +08:00 2
@Orenoid
你有 Dockerfile 肯定是要先 build 再 run,但是作为单元测试 pipeline 里的这个 image 和 container 都需要是一次性的,pipeline 跑完就删掉。 不太建议你自己去管理这个过程,Jenkins 支持 docker pipeline 直接用就好了: https://jenkins.io/doc/book/pipeline/docker/#caching-data-for-containers 另外 Jenkins 配置繁多,相对来说是 比较难用的,可以考虑一下更现代化的 CI 系统比如 Travis CI / Circle CI / GitHub Actions,如果必须要 on-pre 可以看看 DroneCI / GitLab CI |
12
basefas 2019-10-19 21:08:53 +08:00 via iPhone 1
@Orenoid 对的,更进一步的,比如你是个 go 的 web 项目,可以 from 一个 Golang 的基础镜像,直接在容器里编译,再利用 docker 的多步构建和 label 功能,分别构建 test 和 production 两个镜像,分别用于测试和正式环境。
https://basefas.github.io/2019/09/24/使用%20Docker%20 构建%20Go%20 应用 / 贴个链接提供参考 |
13
amosasas 2019-11-03 22:54:36 +08:00
|