Orenoid
V2EX  ›  Docker

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

  •  
  •   Orenoid ·
    Orenoid · Oct 19, 2019 via Android · 6671 views
    This topic created in 2429 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    前两步可以在 docker 容器里面进行,在做 封装 之前清理现场即可
    basefas
        8
    basefas  
       Oct 19, 2019 via iPhone   ❤️ 1
    比如一个 pipeline,分 build,test,deploy 三个阶段,第一步会把项目代码和测试代码都打包到镜像里,第二步 docker run 后执行里边的测试代码做单元测试,第三步 docker run 用来 deploy。如果对镜像大小有严格要求可以在 test 后,将 test 相关代码 ignore 后再 build,deploy
    Orenoid
        9
    Orenoid  
    OP
       Oct 19, 2019
    @chinvo #7 不好意思,我还是没理解,“docker 容器” 就是指 docker 的 container 吗?如果是的话,不是需要先 docker build,然后 docker run image 才有 container 吗?我对 docker 还不是特别熟悉。
    Orenoid
        10
    Orenoid  
    OP
       Oct 19, 2019
    @basefas #8
    谢谢,我是不是可以理解为,build 后对同一个镜像分别用不同的命令 run 两次,也就是说会生成两个 container,然后 test 阶段产生的那个 container 是可以直接舍弃掉的。
    mdluo
        11
    mdluo  
       Oct 19, 2019   ❤️ 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  
       Oct 19, 2019 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  
       Nov 3, 2019
    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  
       Dec 3, 2019
    @amosasas 您好,我想问一下,第四步是再次拿 dockerfile 构建么???
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   986 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 22:50 · PVG 06:50 · LAX 15:50 · JFK 18:50
    ♥ Do have faith in what you're doing.