请教一个 Jenkins 和 Docker 部署的问题

2019-10-19 18:47:25 +08:00
 Orenoid

目前有个 web 项目,想尝试用 Jenkins 实现自动化部署,然后项目是有单元测试的。

我想要的效果是每次 git 更新代码后,Jenkins 检测到更新,把代码拉下来,跑一遍单元测试,没问题的话就运行新的代码。

但是把 docker 加进来后,整个流程我就不知道要怎么设计了。项目是用 dockerfile 构建的,所有的代码和依赖环境都在镜像里。这样的话,我想跑单元测试就得先把镜像构建起来,并且还得进到容器里面才能跑,哪怕没有 Jenkins 这个逻辑也很奇怪了,得先 build 和 run 之后才能测试。感觉这里思路就已经不对了,但我不知道该怎么改。

网上搜了很多样例,都跟我的情况不太一样,所以请教一下整个流程应该怎么设计

5944 次点击
所在节点    Docker
14 条回复
chinvo
2019-10-19 19:17:41 +08:00
build 和 test 应该是与 docker 无关的,打包镜像那一步叫 pack,是过了 test 才能做的,pack 成功则执行 deploy
chinvo
2019-10-19 19:19:42 +08:00
或者你可以在 docker 里面执行 build 和 test,然后清理现场再打包、部署( run )
Orenoid
2019-10-19 19:37:24 +08:00
@chinvo #1
> 打包镜像那一步叫 pack,是过了 test 才能做的
我就是对这个有疑问,我们测试实际也要运行测试框架吧,自然也就有相应的依赖,而这个依赖环境我是在 DockerFile 里搭建的,那么如果不把镜像 build 起来的话,就没法跑单元测试了。除非我在 docker 外又搭建一个环境,但感觉就失去用 Docker 的意义了。
P.S. 我上面提到的 build 和 run 都是指 docker 的命令
mdluo
2019-10-19 19:38:08 +08:00
跑测试的 pipeline 一般是 PR 触发的,直接 run 不就好了吗,为什么要 build image ?
Orenoid
2019-10-19 19:40:29 +08:00
@mdluo #4 我是把代码打包到镜像里,然后再 run 的,更新代码后,不重新 build 的话,镜像里还是旧代码
balabalaguguji
2019-10-19 19:45:41 +08:00
docker 可以映射目录,代码放宿主机 a 目录,把 a 目录映射到 docker 里面的 a 目录,更新外面目录的代码,里面的代码也就更新了,然后重启下 docker 的服务就可以了
chinvo
2019-10-19 19:55:23 +08:00
@Orenoid #3 基本 pipeline 是 编译 测试 封装( docker build ) 部署

前两步可以在 docker 容器里面进行,在做 封装 之前清理现场即可
basefas
2019-10-19 19:59:40 +08:00
比如一个 pipeline,分 build,test,deploy 三个阶段,第一步会把项目代码和测试代码都打包到镜像里,第二步 docker run 后执行里边的测试代码做单元测试,第三步 docker run 用来 deploy。如果对镜像大小有严格要求可以在 test 后,将 test 相关代码 ignore 后再 build,deploy
Orenoid
2019-10-19 20:07:24 +08:00
@chinvo #7 不好意思,我还是没理解,“docker 容器” 就是指 docker 的 container 吗?如果是的话,不是需要先 docker build,然后 docker run image 才有 container 吗?我对 docker 还不是特别熟悉。
Orenoid
2019-10-19 20:10:31 +08:00
@basefas #8
谢谢,我是不是可以理解为,build 后对同一个镜像分别用不同的命令 run 两次,也就是说会生成两个 container,然后 test 阶段产生的那个 container 是可以直接舍弃掉的。
mdluo
2019-10-19 20:18:02 +08:00
@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
basefas
2019-10-19 21:08:53 +08:00
@Orenoid 对的,更进一步的,比如你是个 go 的 web 项目,可以 from 一个 Golang 的基础镜像,直接在容器里编译,再利用 docker 的多步构建和 label 功能,分别构建 test 和 production 两个镜像,分别用于测试和正式环境。
https://basefas.github.io/2019/09/24/使用%20Docker%20 构建%20Go%20 应用 /
贴个链接提供参考
amosasas
2019-11-03 22:54:36 +08:00
1.checkout scm
2.build a test container
3.run test case in this test container
4.deploy to a staging server and build a docker container in this staging server
5.deploy to production server by hand
yjxjn
2019-12-03 18:33:06 +08:00
@amosasas 您好,我想问一下,第四步是再次拿 dockerfile 构建么???

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/610979

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX