请教一个 Jenkins 和 Docker 部署的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Orenoid
V2EX    Docker

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

  •  
  •   Orenoid
    Orenoid 2019-10-19 18:47:25 +08:00 via Android 6248 次点击
    这是一个创建于 2186 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    前两步可以在 docker 容器里面进行,在做 封装 之前清理现场即可
    basefas
        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
    Orenoid
        9
    Orenoid  
    OP
       2019-10-19 20:07:24 +08:00
    @chinvo #7 不好意思,我还是没理解,“docker 容器” 就是指 docker 的 container 吗?如果是的话,不是需要先 docker build,然后 docker run image 才有 container 吗?我对 docker 还不是特别熟悉。
    Orenoid
        10
    Orenoid  
    OP
       2019-10-19 20:10:31 +08:00
    @basefas #8
    谢谢,我是不是可以理解为,build 后对同一个镜像分别用不同的命令 run 两次,也就是说会生成两个 container,然后 test 阶段产生的那个 container 是可以直接舍弃掉的。
    mdluo
        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
    basefas
        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 应用 /
    贴个链接提供参考
    amosasas
        13
    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
        14
    yjxjn  
       2019-12-03 18:33:06 +08:00
    @amosasas 您好,我想问一下,第四步是再次拿 dockerfile 构建么???
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5261 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 03:54 PVG 11:54 LAX 20:54 JFK 23:54
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86