GitLab CI/CD自动化部署(持续集成)
一、安装及配置
1、gitlab及runner安装
1.)gitlab安装
$ docker run -d --name gitlab -p 1443:443 -p 9800:80 --restart always \
-v /opt/gitlab/config:/etc/gitlab \
-v /opt/gitlab/data:/var/opt/gitlab \
-v /opt/gitlab/logs:/var/log/gitlab \
--privileged=true \
gitlab/gitlab-ce:latest
2.)gitlab-runner安装
$ docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
3.)gitlab-runner注册
进入gitlab-runner容器,进行注册
$ docker exec -it gitlab-runner gitlab-ci-multi-runner register
注册时需要的url、token都在settings > CI/CD或runner中找到,再输入runner名称,executor执行器选shell好了
4.)相关应用安装
进入gitlab-runner容器,下载安装node、npm等全局依赖
2、gitlab-ci配置详解
gitlab-runner注册成功后,当监听到push等事件,会自动执行.gitlab-ci.yml配置中任务,ci配置通常由stages、job等主要部分组成。
- Stages
阶段/步骤,多个Stage按以下顺序执行,若其中任何一个失败,则后续stage不执行。
stages:
- build
- test
- deploy
- 公用
所有stage之前,可以执行一些公共的操作
before_script: # after_script,在所有job之后
- npm set registry http://registry.npm.taobao.org
- Job
任务可以有多个
job1:
# 执行阶段,若不指定默认test
stage: build
# 指定执行的runner标签
tags:
- runner-build
# 触发分支
only:
- master
- release
- /^release\/.*$/
- triggers
# 自定义变量
variables
sourceDir: ./src
# 执行脚本
script:
- cd ./xxx
- npm install
- npm run lint
- npm run build
# 是否允许失败,true表示失败后不影响后面流程
allow_failure: false
二、自动化构建
1、设置远程登录
通过用户名+公钥的方式可以让脚本在无密的情况下登录远程服务器
1.)查看/生成ssh密钥
进入gitlab-runner容器,查看/home/gitlab-runner/.ssh目录下 id_rsa(私钥)、id_rsa.pub(公钥)文件,若没有可通过下面命令生成:
$ ssh-keygen -t rsa -C 'your email@domain.com'
2.)公钥追加到服务器ssh认证文件
将/home/gitlab-runner/.ssh/id_rsa.pub公钥通过rz命令上传到服务器~/目录下,也可以直接copy后手动编辑添加
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
2、自动化部署
1.)gitlab ci配置
./.gitlab-ci.yml文件
stages:
- deploy
job:
stage: deploy
tags:
- runner-deploy
only:
- master
- triggers
script:
- chmod +x ./bin/deploy.sh
- ./bin/deploy.sh encore
2.)编译/部署脚本
./bin/deploy.sh文件
#!/bin/bash
# 服务名接收/判断
serv=$1
if [ ! $serv ] ;then
echo -e "\e[31;5mError: No service name config in .gitlab-ci.yml\!\e[0m"
exit 2
fi
npm config set registry http://registry.npm.taobao.org
clear
# 1.编译web
echo -e "\e[1;36;5m======>Start buiding [$serv] web...\e[0m"
cd ./web
npm i
npm run build
# 2.编译server
echo -e "\e[1;36;5m======>Start buiding [$serv] server...\e[0m"
cd ../server
npm i --production
# 3.打包远程传送
echo -e "\e[1;36;5m======>Start sending [$serv] over ssh...\e[0m"
cd ../
tar -zcf $serv.tar.gz ./bin ./web/dist ./server ./docker-compose.yml ./.gitlab-ci.yml
# 传送
scp -o StrictHostKeyChecking=no $serv.tar.gz root@192.168.4.28:/root/static
git clean -fd
git reset --hard HEAD
# 4.远程部署
echo -e "\e[1;36;5m======>Start deploy [$serv] service...\e[0m"
# 远程执行批量脚本
ssh -Tq user@x.x.x.x << remotessh
#----------------------------------------------
cd /root/static
if ! test -e $serv; then
mkdir $serv
fi
tar -mzxf $serv.tar.gz -C $serv
rm $serv.tar.gz
cd $serv
# 创建/启动服务
docker-compose up -d
exit
#----------------------------------------------
remotessh
echo -e "\e[1;32mService [$serv] deploy success!\e[0m"
注意事项:
a.)echo -e显示带颜色的闪动文字
b.)scp/ssh参数-o StrictHostKeyChecking=no用来忽略第一次连接提示生成known_hosts文件
c.)ssh参数-Tq用来去掉伪终端提示
d.)远程执行批量脚本需用remotessh或EOF(不输出echo内容)
e.)变量申明推荐放脚本头部,若定义在remotessh代码块中变量都需要转义成\\都需要转义成,也可直接在第一个remotessh或EOF加引号
f.)exit 0:成功退出,1:失败退出,2:用法不当退出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-03-14 集成 Jenkins 和 TestNG 实现自助式自动化测试平台