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

2020-12-30 18:46:29 +08:00
 archscar
本人 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 有区别吗?(只是好奇所以问问)
2674 次点击
所在节点    DevOps
14 条回复
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
2020-12-30 19:10:15 +08:00
你这个问题很简单的。
1 。在 Docker 里面 Build,只要把结果的 Folder 映射出来就行了。
2 。 再通过 SSH 之类 的 Copy 远程就行了。
debuggerx
2020-12-30 19:23:23 +08:00
同新手,最近搞 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
2020-12-30 19:33:04 +08:00
把东西弄出来的思路是不是就不对?
为什么不把项目构建成镜像,直接运行镜像作为应用。

在 docker 里面以 docker in docker 或者 docker out docker 的方式运行 docker build 。成功后把 image 推送到 image registry,之后再通过 k8s 之类的方式来发布
debuggerx
2020-12-30 19:35:34 +08:00
@GopherDaily 能 docker 化交付的服务可以这样搞,那我这种是要编译出移动 app 的情况咋办
carity
2020-12-30 19:44:40 +08:00
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
2020-12-30 20:25:34 +08:00
@hantsy 好的,谢谢解答。还想问一下 docker 的映射是只能启动之前设置好 volume 吗?还是可以启动之后再根据需要临时把某个文件夹映射出来呢?
archscar
2020-12-30 20:26:57 +08:00
@debuggerx 好的,非常感谢,我参考一下!
archscar
2020-12-30 20:30:53 +08:00
@GopherDaily
@debuggerx 关于弄出来的思路的问题,目前暂时还没有考虑 k8s 的东西,学不过来><。不过我想了下前端的 html 这些东西好像不太方便直接打包成镜像运行吧,除非和 nginx 打包到一起发布?
archscar
2020-12-30 20:35:02 +08:00
@carity 感谢回复。我还真没想过用容器跑 nginx,因为感觉前端就是把那些东西复制过去就行了,目前没感觉有必要专门弄个容器。确实是个没想过的思路,我还需要学习。
hantsy
2020-12-30 20:47:06 +08:00
@GopherDaily Dockerizing App 是最简单直接的。
直接 Publish 到私有的 Docker Reg 或者购买的云(很多提供私有 Docker Reg )。
constantine008
2020-12-31 09:04:04 +08:00
没有考虑搭配 jenkins 吗
Martin9
2020-12-31 09:36:38 +08:00
我是用的 carity 说的方法,把 docker 中的一个目录和宿主机的一个目录关联起来,每次上传文件到宿主机的该目录,进了 docker 到对应目录也能直接找到了。
isnullstring
287 天前
同新手,artifact 是用来把编译好的内容上传到 gitlab 的产物中,你可以直接在该页面下载,然后放到网站目录里
不过我还没折腾 到 docker in docker 这步骤,只会用 shell

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740394

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX