想求问一下 gitlab 的 cicd 使用 docker 遇到的问题,以及 cache 用法等一些细节问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
archscar
V2EX    DevOps

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

  •  
  •   archscar 2020-12-30 18:46:29 +08:00 3178 次点击
    这是一个创建于 1813 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人 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 有区别吗?(只是好奇所以问问)
    14 条回复    2024-02-06 11:07:40 +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 到对应目录也能直接找到了。
    isnullstring
        14
    isnullstring  
       2024-02-06 11:07:40 +08:00
    同新手,artifact 是用来把编译好的内容上传到 gitlab 的产物中,你可以直接在该页面下载,然后放到网站目录里
    不过我还没折腾 到 docker in docker 这步骤,只会用 shell
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3899 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 05:15 PVG 13:15 LAX 21:15 JFK 00:15
    Do have faith in what you're doing.
    ubao msn 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