gitlab+docker+docker_compose实现CICD

简介

从8.0版开始,GitLab持续集成(CI)完全集成到GitLab本身,它还具有持续部署和持续交付功能,可用于构建、测试和部署你的应用程序。
步骤主要分为3步:
1.docker安装
2.项目添加gitlab-ci.yml,Dockerfile,Docker-compose.yml
3.服务器配置并注册runner
下面是GitLab CI/CD流程图。
gitlab cicd原理图, 图片来源:CSDN作者benben

1. docker安装

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
runner注册数据 图片来源:简书作者IT科技互联


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阶段问题处理
空镜像处理错误

docker配置文件挂载
docker-compose未找到

5.效果展示

阶段
deploy
容器运行

web效果展示

作为云原生的一名初学者,此篇文章仅用于记录CICD学习过程,不代表任何专业观点,文章有多处引用,引用处如不能允许转载的,请原作者在本文章留言或私信我,文章如有书写错误或需要修改的地方,也请各位评论或私信指出

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值