V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Orenoid
V2EX  ›  Docker

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

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

    目前有个 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   ·   我们的愿景   ·   实用小工具   ·   952 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:43 · PVG 05:43 · LAX 14:43 · JFK 17:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.