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

想求问一下 gitlab 的 cicd 使用 docker 遇到的问题,以及 cache 用法等一些细节问题

  •  
  •   archscar · 2020-12-30 18:46:29 +08:00 · 1778 次点击
    这是一个创建于 385 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人 cicd 还是新手,最近在自己研究关于 gitlab 的 cicd 功能的用法,了解了一下之后发现挺强大的。不过有几个具体的问题不知道该怎么弄比较好,还有些概念方面的东西不知道是不是没有理解对,希望有了解的老哥能指点一下。

    我现在主要想做的一个事情是用 gitlab 的 cicd 功能在 docker 环境构建前端项目,然后把构建后的 html 、js 那些东西给放到本机的指定位置,或者是放到远程的某个服务器上,最后运行一个脚本做一些重启 nginx 之类的事情。

    大部分流程我都弄懂了,但现在有 2 个问题我没太弄明白:
    1.我怎么把构建后的 html 和 js 那些东西弄出来呢?
    因为我 gitlab 的 runner 注册的是 docker executor,所有东西都是在 docker 里面跑的。我最开始以为是用 cache 或者 artifact 可以把构建后的东西保存下来,但后来发现 cache 和 artifact 的东西好像都只能在 pipeline 运行的过程中给不同的 job 间使用,并不是用来给你保存到本机的。不知道一般实际使用中应该怎么把 docker 里面的东西弄出来呢?是用 artifact 保存然后自己挂载一个 volume 复制过去吗?

    2.我要怎么运行本地的重启脚本呢?
    因为我的 runner 明显只能在 docker 里面运行命令,没办法跑宿主机环境下的脚本。难道需要 ssh 到宿主机上吗?(貌似记得有用 ssh 远程执行命令的方法,不过总感觉这样怪怪的?)

    ----------------------------------------------------------------------------------------------------------

    另外还有一些细节的问题不太明白也想求问一下。
    1.cache 的使用场景
    官方给的例子是用来存 pip install 生成的 cache 文件夹和 virtualenv 生成的 venv 文件夹。但 pip install 命令和 virtualenv 的命令都是写在 before_script 里面的,也就是每一个 job 的 script 之前都会运行一次。我不太明白为什么要这样使用,不是应该先检查有没有 cache,有的话就用 cache,没有的时候再去运行命令生成吗?

    还有我看文档说 cache 可以在同一个 stage 内使用,但同一个 stage 内怎么保证 cache 一定是生成了的呢?比如说我某个 stage 的 job 可能需要同一些包,我直接提取 cache 运行,但如果 cache 还没生成的话不是会运行失败吗?不知道是不是我对 gitlab cache 的使用方法和使用场景理解有误?

    2.还有一个小问题就是 runner 装在本机的系统里,然后注册的时候选择 docker executor,跟装在 docker 里注册的时候选 docker executor 有区别吗?(只是好奇所以问问)
    13 条回复    2020-12-31 09:36:38 +08:00
    hantsy
        1
    hantsy  
       2020-12-30 19:07:44 +08:00
    不清楚 Gitlab 的环境要求,大部分 CI/CD Pipeline 是支持 VM 和 Docker 的环境的(可以选择配置),也有一些例外,仅支持 Docker 的。

    https://github.com/hantsy/spring-reactive-jwt-sample 我这个例子配置了 Github Actions, Travis, Circle, Codefresh, Drone, SemaphoreCI, Appveyor, Shippable 等
    hantsy
        2
    hantsy  
       2020-12-30 19:10:15 +08:00   ❤️ 1
    你这个问题很简单的。
    1 。在 Docker 里面 Build,只要把结果的 Folder 映射出来就行了。
    2 。 再通过 SSH 之类 的 Copy 远程就行了。
    debuggerx
        3
    debuggerx  
       2020-12-30 19:23:23 +08:00   ❤️ 1
    同新手,最近搞 CI/CD 的过程写在博客里了:
    https://www.debuggerx.com/2020/12/13/modern-development-workflow-gitlab-ci-cd-1/
    第一个问题,我是走网络发出来的,用 curl 的 POST 请求发出来,然后目标机器上写了个简单的接口接收。但是看你描述,我觉得你可以在两个 stage 里使用不同的 tag,然后在实际部署的机器上也装一个 runner,注册为 shell 执行器,第一个 docker 里的编译流程走完以后,要么走网络、scp 、或者干脆建个新仓库专门用于中转数据,把产物发到部署机器上,然后那个 stage 里处理这些产物,执行重启指令就好了,就像我第二篇里部署 web 项目一样
    GopherDaily
        4
    GopherDaily  
       2020-12-30 19:33:04 +08:00
    把东西弄出来的思路是不是就不对?
    为什么不把项目构建成镜像,直接运行镜像作为应用。

    在 docker 里面以 docker in docker 或者 docker out docker 的方式运行 docker build 。成功后把 image 推送到 image registry,之后再通过 k8s 之类的方式来发布
    debuggerx
        5
    debuggerx  
       2020-12-30 19:35:34 +08:00
    @GopherDaily 能 docker 化交付的服务可以这样搞,那我这种是要编译出移动 app 的情况咋办
    carity
        6
    carity  
       2020-12-30 19:44:40 +08:00   ❤️ 1
    1.
    给你的 runner 使用 volume 关联你宿主机的指定路径
    如 -v /dist:/var/www/dist
    然后你在 runner 中将你得产物放到 /dist 文件夹里,你就可以在你宿主机的 /var/www/dist 中使用了
    artifact 配置后可以在 gitlab 流水线的阶段中直接查看产物

    2.
    你 nginx 为啥不用容器跑呢
    我有个测试过的方案,直接给 runner 设置-v /var/run/docker.sock:/var/run/docker.sock 然后在 runner 中就可以使用宿主机 docker 了,我的 runner 的类型是 shell,所有宿主机 dokcer 命令就都能在 runner 中执行
    volumes:
    - '/var/run/docker.sock:/var/run/docker.sock:ro'
    - '/usr/bin/docker:/usr/bin/docker:ro'
    - './etc_group:/etc/group'
    etc_group 文件复制你本机的就好了
    主要最下面要有 docker 权限相关的几行
    gitlab-runner:x:999:
    docker:x:1000:
    docker:x:994:gitlab-runner
    archscar
        7
    archscar  
    OP
       2020-12-30 20:25:34 +08:00
    @hantsy 好的,谢谢解答。还想问一下 docker 的映射是只能启动之前设置好 volume 吗?还是可以启动之后再根据需要临时把某个文件夹映射出来呢?
    archscar
        8
    archscar  
    OP
       2020-12-30 20:26:57 +08:00
    @debuggerx 好的,非常感谢,我参考一下!
    archscar
        9
    archscar  
    OP
       2020-12-30 20:30:53 +08:00
    @GopherDaily
    @debuggerx 关于弄出来的思路的问题,目前暂时还没有考虑 k8s 的东西,学不过来><。不过我想了下前端的 html 这些东西好像不太方便直接打包成镜像运行吧,除非和 nginx 打包到一起发布?
    archscar
        10
    archscar  
    OP
       2020-12-30 20:35:02 +08:00
    @carity 感谢回复。我还真没想过用容器跑 nginx,因为感觉前端就是把那些东西复制过去就行了,目前没感觉有必要专门弄个容器。确实是个没想过的思路,我还需要学习。
    hantsy
        11
    hantsy  
       2020-12-30 20:47:06 +08:00
    @GopherDaily Dockerizing App 是最简单直接的。
    直接 Publish 到私有的 Docker Reg 或者购买的云(很多提供私有 Docker Reg )。
    constantine008
        12
    constantine008  
       2020-12-31 09:04:04 +08:00
    没有考虑搭配 jenkins 吗
    Martin9
        13
    Martin9  
       2020-12-31 09:36:38 +08:00
    我是用的 carity 说的方法,把 docker 中的一个目录和宿主机的一个目录关联起来,每次上传文件到宿主机的该目录,进了 docker 到对应目录也能直接找到了。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1593 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:06 · PVG 08:06 · LAX 16:06 · JFK 19:06
    ♥ Do have faith in what you're doing.