简介
从8.0版开始,GitLab持续集成(CI)完全集成到GitLab本身,它还具有持续部署和持续交付功能,可用于构建、测试和部署你的应用程序。
步骤主要分为3步:
1.docker安装
2.项目添加gitlab-ci.yml,Dockerfile,Docker-compose.yml
3.服务器配置并注册runner
下面是GitLab CI/CD流程图。
1. docker安装
2. 项目整理
2.1 manage
语言:python,使用flask框架
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'hello world'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
2.2 Dockerfile
docker 官网
dockerhub 官网
dockerfile是docker用来管理镜像的脚本文件,文本内容包含了一条条构建镜像所需的指令和说明。
# 拉取基础镜像,python3.8,镜像底层是debian:10
FROM python:3.8
# 在容器内创建 /app/flask/文件夹,并将该项目文件复制到该文件夹下
COPY . app/flask
# 指定工作目录
WORKDIR app/flask
# 执行安装包安装命令
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple/
# 运行项目
CMD gunicorn -b 0.0.0.0:5000 manage:app -w 2 -t 4 --no-sendfile --log-level info
2.3 docker-compose
docker-compose使用yaml语法书写,compose作为docker的容器编排技术,功能强大,那什么叫做容器编排?
容器是docker镜像运行的实例,一个容器代表一个项目,但实际操作中,你的一个项目需要其他几个项目同时配合操作,才能满足项目的运行需求和数据展示,比如,现在有一个web项目,项目做了前后端分离,同时将oauth单独从项目中剥离出来,这就是三个项目,则需要运行三个容器
compose就是对容器做了编排管理,多个容器时,通过compose命令对多个容器进行一次操作,这里测试使用flask项目和pgsql运行测试
# docker-composer版本
# docker-composer版本
version: '3.1'
# 服务
services:
# 项目名
flask_demo:
# 运行需要的镜像
image: ${IMAGE_NAME}
# 上述镜像没有,则自动构建
build: .
# 容器名
container_name: ${CON_NAME}
# 设置关闭后默认重启
restart: always
# 端口映射
ports:
- '8080:5000'
pgsql:
# 本地拉取一个postgres镜像
image: postgres:10
# 环境配置
environment:
# 其他数据库更改配置选项即可
# 数据库登录用户
POSTGRES_USER: postgres
# 登录密码
POSTGRES_PASSWORD: postgres
container_name: ${DB_HOST}
ports:
- '5432:5432'
2.4 gitlab-ci
gitlab在项目代码的每次push后,会对查找项目中gitlab-ci.yml文件,并根据ci文件内容,通知runner启动作业, runner是gitlab的CI作业的工作者,后面会介绍runner的配置,gitlab-ci同样使用yaml语法
# 使用的docker镜像
# 这个镜像是我自己封装的镜像,正常可以使用docker,
# 但docker的基础镜像没有docker-compose,会导致docker-compose命令无法执行
# 你可以自己封一个,也可以直接使用我这个镜像
image: changzhiqi071/docker_compose:0.1
# 管道任务执行阶段,每一个阶段执行成功后,才会执行下一个阶段
stages:
-build
-deploy
# 作业变量
variables:
APP_NAME: flask
DOCKER_TLS_CERTDIR: ""
IMAGE_NAME: ${APP_NAME}_api:${CI_COMMIT_REF_NAME}
CON_NAME: ${APP_NAME}_api_${CO_COMMIT_REF_NAME}
# build阶段
build:
# 定义任务阶段
stage: build
# 任务失败后,重新尝试作业的次数
retry: 2
# 执行任务的runner,对应文章下面配置的runner
tags:
- flask-test-runner
# shell脚本命令
script:
- echo 'running'
- docker build -t ${IMAGE_NAME} .
# deploy阶段
deploy:
stage: deploy
retry: 2
variables:
APP_PORT: 5000
DB_HOST: ${APP_NAME}_${CI_COMMIT_REF_NAME}_db
DB_PORT: 5433
script:
# 删除正在运行的容器
- docker stop ${CON_NAME} && docker rm ${CON_NAME}
- docker stop ${DB_HOST} && docker rm ${DB_HOST}
# 删除打包镜像留下的空镜像
- docker images| grep none | awk '{print $3}'|xargs docker rmi
# docker-compose 命令启动容器
- docker-compose up -d --force-recreate flask_demo pgsql
tags:
- flask-test-runner
# 指定分支
only:
# master分支有代码变更时做CI,其他分支不会启动CI作业
- master
3. gitlab-runner配置
gitlab-runner是gitlabCI作业的工作者,服务器下载gitlab-runner,并在gitlab项目中注册,配置相关文件
3.1 安装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.2 注册runner
进入gilab项目: setting -> CICD-> runner
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
3.2.1 输入URL
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://*******
3.2.2 输入token
Enter the registration token:
***********
3.2.3 输入服务器中显示的runner名称
Enter a description for the runner:
[e2160b078ccc]: flask-test-runner
3.2.4 输入gitlab项目中显示的runner名称
Enter tags for the runner (comma-separated):
flask-test-runner
3.2.5 输入runner执行器
Enter an executor: docker-ssh+machine, docker-ssh, parallels, shell, virtualbox, docker+machine, custom, docker, ssh, kubernetes:
docker
3.2.6 输入docker默认镜像
Enter the default Docker image (for example, ruby:2.6):
alpine-latest
3.3 配置runner
sudo vi /srv/gitlab-runner/config/config.toml
gitlab-runner配置文件如下
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "flask-test-runner"
url = "*************"
token = "***********"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "alpine:latest"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
shm_size = 0
3.4 重启runner,更新配置
docker restart gitlab-runner
4. runner部署问题处理
主要讲解deploy阶段问题处理
5.效果展示
作为云原生的一名初学者,此篇文章仅用于记录CICD学习过程,不代表任何专业观点,文章有多处引用,引用处如不能允许转载的,请原作者在本文章留言或私信我,文章如有书写错误或需要修改的地方,也请各位评论或私信指出