使用Gitlab CI/CD结合docker容器实现自动化部署
Gitlab CI/CD基本介绍
-
核心概念
持续集成(CI):每次代码提交后自动触发构建、测试和代码检查,确保代码质量
持续交付/部署(CD):在 CI 基础上自动将代码部署到测试或生产环境,支持人工审核(交付)或全自动发布(部署)
-
核心组件
Pipeline(流水线):由多个阶段(
stages
)组成,每个阶段包含并行执行的作业(jobs
).gitlab-ci.yml:YAML 格式的配置文件,定义流水线的逻辑,需放置在项目根目录
Runner:执行作业的代理,支持 Docker、Shell 等运行环境,分为共享 Runner 和私有 Runner
-
工作流程
代码提交:触发流水线执行
阶段执行:
- 构建阶段:编译代码、安装依赖
- 测试阶段:运行单元测试、集成测试等
- 部署阶段:自动发布到指定环境
结果反馈:通过 GitLab 界面查看日志和状态
-
优势
- 自动化:减少手动操作,提升效率
- 可视化:提供流水线状态和日志的实时监控
- 灵活性:支持多语言、多环境部署,可集成 Kubernetes 等云原生工具
预先准备
- 用于发布程序的机器一台,负责执行任务、部署程序
- 若干台服务器(生产环境)
发布程序
在发布程序的机器上安装gitlab-runner
-
添加官方仓库
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
-
使用apt安装
sudo apt-get install gitlab-runner
-
验证是否安装成功
gitlab-runner --version
注册Runner到项目
-
注册runner到项目,在项目目录下执行
sudo gitlab-runner register
填写gitlab的地址,token,其余信息不必要填
token在gitlab的网页端可以找到
按照下图填写服务器的必要信息,地址、端口号、ssh用户名和密码
-
注册完成后,可以看到runner的配置文件在**/etc/gitlab-runner/config.toml**下
-
查看gitlab-runner运行状态
在安装runner的机器上生成ssh密钥
-
生成密钥,需要指定格式
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
-
查看id_rsa私钥格式,必须有开头和结尾,否则密钥加载会失败
-----BEGIN OPENSSH PRIVATE KEY----- 密钥内容 -----END OPENSSH PRIVATE KEY-----
-
将本地生成的 SSH 公钥添加到目标服务器(生产环境)上,使用以下命令将公钥添加到目标服务器的 authorized_keys 文件中
ssh-copy-id username@remote_host
在项目目录下编写.gitlab-ci.yml
下面是我的一个示例
stages:- build- deploybuild_image:stage: buildimage: docker:latestservices:- docker:dindscript:- docker rmi ems-simulate 2>/dev/null || true- docker build --no-cache -t ems-simulate .- docker save ems-simulate | gzip > ~/ems_simulate.tar.gzonly:- maindeploy_ems_simulate:stage: deployparallel:matrix: # 使用矩阵同时部署4台服务器- HOST: ["10.10.112.4", "10.10.112.5", "10.10.112.6", "10.10.110.33"]before_script:# 禁用严格主机密钥检查(仅限测试环境)- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/configscript:# 传输镜像到远程主机- scp ~/ems_simulate.tar.gz narada@$HOST:~# 远程执行部署命令- ssh narada@$HOST "gunzip -c ~/ems_simulate.tar.gz | docker load && docker stop ems_simulate_container 2>/dev/null && docker rm ems_simulate_container 2>/dev/null && docker volume rm ems_simulate_volume 2>/dev/null || true && docker volume create ems_simulate_volume 2>/dev/null || true && docker run -d --name ems_simulate_container --network host -v ems_simulate_volume:/app ems-simulate /bin/bash -c 'cd /app && python3 start_back_end.py'"needs: [build_image]only:- main
结合docker使用分为两个阶段
- 构建阶段,制作docker镜像并导出为tar.gz文件
- 将镜像文件分发到每台生产环境,部署docker容器
当将代码提交到gitlab时,将会自动执行任务,下面是执行的效果
点进某个任务可以看到具体的执行情况
执行成功的任务最后会显示Job succeeded