一、 为了优化公司服务部署流程, 减少不必要的登录服务器操作, 实现提交代码直接部署最短部署路径, 我们选择了gitlab的ci/cd。
当前公司的部署流程繁琐, 以我负责的项目来说, 上线的步骤是:
1. 提交代码到gitlab
2. 登录服务器, 到项目文件夹下拉取代码
3. 使用supervisorctl 重启项目
使用gitlab的ci/cd之后就可以, 节省后两步的操作,把它们交给gitlab 的ci/cd执行, 这样就可以“少做少错”
二、我们使用的工具:
1. gitlab代码仓库
2.docker容器技术
3.gitlab-runner应该属于gitlab的一个配套插件
4. 我们的项目
自动化部署的流程:
1.提交代码gitlab, 触发ci/cd逻辑
2.gitlab 根据gitlab-ci.yml中的命令,通知gitlab-runner进行构建部署
三、工具安装(注意:gitlab和gitlab-runner是两台不同的服务器)
1、gitlab 安装: https://about.gitlab.com/installation/(官网文档)
2、docker安装: https://docs.docker.com/install/#releases(官网文档, 英语不好的注意左侧导航条, 选择对应操作系统)
3、gitlab-runner安装: https://docs.gitlab.com/runner/install/(官网文档, 注意图片中的位置)
图一这里是各个操作系统安装gitlab-runner教程
四、对于工具的安装教程,都是其官网提供的, 我们就不做过多的演示,这里我演示一下gitlab-runner注册的过程
1、我们需要找到gitlab中某个项目的ci/cd的设置界面
2 3然后点击展开runner找到圈出来的url和token,在gitlab-runner注册时需要使用, 如图4
4然后我们去在gitlab-runner中注册:
zm@zmdeMacBook-Pro: ~$ gitlab-runner register # 开始注册
WARNING: Running in user-mode. # 提示可以不管
WARNING: Use sudo for system-mode:
WARNING: $ sudo gitlab-runner...
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): # 输入我们在gitlab中获取的url
http://wechatservers.com/
Please enter the gitlab-ci token for this runner: # 输入token
5KUa3rVrYsRmPzp7CoeL
Please enter the gitlab-ci description for this runner: # 描述
[zmdeMacBook-Pro.local]: cs
Please enter the gitlab-ci tags for this runner (comma separated): # tag,可以不填写直接回车;这个是用来标记runner, 可以指定使用哪个runner进行构建部署
cs # 我们输入的是cs
Registering runner... succeeded runner=5KUa3rVr
Please enter the executor: docker, parallels, shell, virtualbox, docker+machine, docker-ssh, ssh, docker-ssh+machine, kubernetes:
shell # 执行器选择shell, 一开始选择了docker,在部署完之后我找不到container放在哪里了, 这块以后再补
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
这样我们就完成了gitlab-runner的注册, 我可以回到gitlab页面看一下
5这样我们有了个gitlab-runner, tag为cs, 状态为不可用
因为我们没有运行gitlab-runner, 我们可以使用
gitlab-runner run
这样就运行正常了
6五、.gitlab-ci.yml和dockerfile
.gitlab-ci.yml文件和dockerfile文件需要放在项目中,在第一层目录切勿深藏。
.gitlab-ci.yml是gitlab-runner管理项目的配置文件,告诉gitlab-runner怎么做
主要用到了这个几个关键字
stages
before_script
variable
script
tags
stages:阶段
定义使用的阶段和使用顺序, 比如有两个阶段, 一个是构建docker images,另一个是运行docker container, 这样我们就需要定义这个两个阶段里每个阶段都需要干什么, 那个阶段在前那个阶段在后
variable:变量
我们可以定义变量以供在整个job(每次自动部署gitlab runner都会启动一个job)工作期间使用
script:脚本
这个gitlal-runner执行的脚本
before_script: 脚本前
在执行脚本前执行什么, 可以这么理解但是看了文档之后好像不是这个意思, 留坑;
tags:标签
用来指定某个gitlab-runner运行项目
olny:
用来表明将要运行的分支和标记名称
.gitlab-ci.yml内容:
variables:
PROJECT_NAME: cs # 文件名
DOCKER_REGISTRY: wechatservers.com:5000 # docker私有仓库
IMAGE_NAME: "${DOCKER_REGISTRY}/${PROJECT_NAME}" # 镜像名
LOG_DIR: "/data/logs/" # 日志地址
stages: # 阶段设置
- build
- deploy
build:
stage: build # 阶段build
script: # 脚本
- docker build -t "${IMAGE_NAME}:lastest" .
- docker image tag "${IMAGE_NAME}:lastest" "${IMAGE_NAME}:$CI_COMMIT_SHA"
- docker push "${IMAGE_NAME}:lastest"
- docker push "${IMAGE_NAME}:$CI_COMMIT_SHA"
dev_deploy:
stage: deploy
tags:
- dev
variables:
profile_path: "/data/profile.env" # 存放环境变量的文件
port: "503"
before_script:
- docker stop "${PROJECT_NAME}_1" && docker rm "${PROJECT_NAME}_1" || true # 尝试停止并删除容器
script:
- sleep 2
- docker run --rm -v $LOG_DIR:$LOG_DIR --env-file ${profile_path} "${IMAGE_NAME}:${CI_COMMIT_SHA}" python manage.py migrate --settings=settings.settings #
- docker run -d -p "${port}:8000" -v $LOG_DIR:$LOG_DIR --name "${PROJECT_NAME}_1" --env-file "${profile_path}" "${IMAGE_NAME}:${CI_COMMIT_SHA}" # 创建容器
only:
refs:
- /^feature\/dev-.*$/ # 使用正则匹配要部署分支
tags:
- dev-runner # 指定gitlab-run
这时候就可以提交代码了
如果成功则会看到这样的界面
7你也可以在左侧的列表中job看到,执行情况
8对于私有http仓库, 需要加入insecure-registries到/etc/docker/daemon.json(因系统而异)
"insecure-registries": [
"wechatservers:5000"
]
对于docker权限问题,你可以使用 https://docs.docker.com/install/linux/linux-postinstall/ 解决
8到此结束
网友评论