背景
公司的生产环境发布基本都是运维人员通过jenkins
来实现CI/CD
的流程,但是测试环境运维不管了,只能自己去搞,本来都是在linux
服务器上每次手动上传打包文件,然后手动执行几个命令来发布,但是每次都要手动操作占用了不少开发时间(摸鱼时间),去调研了下就决定使用gitlab
的gitlab-runner
来实现这个流程的自动化。
实现步骤
1.安装gitlab-runner
需要找个服务器,我使用的是测试环境服务所使用的
linux
服务器
1.拉取镜像
bash
docker pull gitlab/gitlab-runner:latest
2.启动容器
bash
docker run -d --name gitlab-runner --restart always -v /opt/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
-v
命令是把系统目录挂载到docker
容器中,即在docker
容器中可以访问到该目录
3.修改/var/run/docker.sock
文件权限
bash
sudo chown root:root /var/run/docker.sock
- 添加容器权限,保证容器可以使用宿主机的
docker
bash
docker exec -it gitlab-runner usermod -aG root gitlab-runner
5.将gitlab
和gitlab-runner
整合到一起
打开gitlab
的设置
-CI/CD
-Runners设置
,可以看到图中橙色打马赛克的两处后面是有用的
bash
docker exec -it gitlab-runner gitlab-runner register
上面在"Runner
设置时指定以下URL
"就是你要输入的路径,以及下面的注册令牌,也就是token
到此,runner
就和我gitlab
里面的该项目集成到一起了
在gitlab
上查看可以看到刚刚添加的runner
信息。
bash
gitlab-runner register #默认交互模式下使用,非交互模式添加 --non-interactive
gitlab-runner list #此命令列出了保存在配置文件中的所有运行程序
gitlab-runner verify #此命令检查注册的runner是否可以连接,但不验证GitLab服务是否正在使用runner。 --delete 删除
gitlab-runner unregister #该命令使用GitLab取消已注册的runner。
#使用令牌注销
gitlab-runner unregister --url http://gitlab.example.com/ --token t0k3n
#使用名称注销(同名删除第一个)
gitlab-runner unregister --name test-runner
#注销所有
gitlab-runner unregister --all-runners
2.配置gitlab-ci.yml
文件
yml
image: node:14.16.0
stages: #阶段
- build
cache: #缓存
paths:
- node_modules
- build
## 打包
build:
tags:
- deploy-test #这个是注册gitlab-runner时候填写的
stage: build
script:
##安装依赖
- npm install --registry=https://registry.npmmirror.com
##打包
- npm run build
## 删除当前项目文件
- rm -rf /www-root/app-veta/*
## 拷贝打包产物到项目目录下
- cp -rf ${CI_PROJECT_DIR}/build/* /www-root/app-veta/
artifacts:
paths:
- build/ # 将构建生成的文件作为 artifacts,以便后续阶段使用
# 手动触发
when: manual
因为gitlab
是公司运维部署的,版本有些低,一些高级的配置没发进行,然后这边配置的是手动触发流水线操作,只能把几个步骤放在一个阶段进行,效果如下,每提交一次记录都会生成一个流水线,如果需要部署,直接点击下图红框处的build
即可
关于gitlab-ci.yml
的配置参数可以参考gitlab
官网上,注意有些配置项之后新版本才支持的
此处我是手动触发,如果需要合并分支自动触发也可配置,最好把打包部署分开stage
此处我是项目服务和gitlab-runner
在同一台机器上所以可以直接删除当前项目文件和拷贝文件,如果不在同一台服务器需要通过SCP
或SFTP
等操作远程服务
常见问题
1、gitlab-ci.yml
中操作项目目录报错,例如rm -rf /www-root/app-veta/*
会报目录不存在,一开始以为docker
启动时候挂载目录没有挂载上,就在docker run -v
后面又挂载了目录,然后进入docker
中敲命令,是可以访问到该文件夹的,但是执行gitlab-ci.yml
中的命令还是报同样错误,搞了好久终于发现问题所在,虽然docker
中可以访问了,但是gitlab-runner
不能访问,需要修改gitlab-runner
的配置文件,下图是我的路径(路径可能会有所不同,具体配置gitlab-runner
成功时会有显示的)
这个文件可以直接修改红框处,把系统目录挂载到gitlab-runner
下面,保存文件即可生效,然后再重新运行流水线就不会报错了