CI CD(gitlab ci来实现)

2 篇文章 0 订阅
1 篇文章 0 订阅

CI && CD

如果你是个初创公司,苦于svn代码管理,发布的繁琐。那么为什么不用git呢。本文就是使用开源的软件gitlab+gillab-ci+docker来完美的搭建代码持续集成,持续部署的系统。码字不易。各位看官多多给赞!!!

1 安装gitlab

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4fIcLeXQ-1668671555828)(https://github.com/jeremyke/PHPBlog/raw/master/Pictures/20190606173440.png)]

安装步骤

  • 安装依赖
  yum install -y git vim gcc glibc-static telnet
  yum install -y curl policycoreutils-python openssh-server
  systemctl enable sshd
  systemctl start sshd
  yum install postfix
  systemctl enable postfix
  ln -s  /usr/lib64/mysql/libmysqlclient.so.18   /usr/lib64/
  systemctl start postfix
  • 设置gitlab安装源
vim /etc/yum.repos.d/gitlab-ce.repo
文件内容:
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=o
enabled=1 
  • 安装
EXTERNAL_URL="http://[你的域名]" yum install -y gitlab-ce 
安装完成之后:
gitlab-ctl reconfigure
  • 访问
默认80端口 可以直接输入你设置的访问 
2. 本地安装gitlab CI
  • 安装Docker
  curl -sSl https://get.docker.com/ | sh
  • 安装gitlab ci runner
 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
 sudo yum install gitlab-ci-multi-runner -y
 查看是否正常运行:
 gitlab-ci-multi-runner status
  • 设置Docker权限(将gitlab-runner用户添加到docker group里面)
 usermod -aG docker gitlab-runner
 service docker restart
 gitlab-ci-multi-runner restart
 
  • 把gitlab-ci-runner 注册到gitlab服务器里面(让服务器知道有这个ci-runner)
 gitlab-ci-multi-runner register

具体如图:
在这里插入图片描述

  • 把gitlab web上添加.gitlab-ci.yml。就可以实现持续集成了!
3. 真实python项目的CI步骤

实验步骤

  • 在gitlab web上创建一个flask-demo项目(可以通过import github的项目方式)

github url为:https://github.com/imooc-course/docker-cloud-flask-demo

  • 在本地通过docker run跑起来这个flask-demo项目

  • 在gitlab-ci-runner服务器使用docker来进行CI操作(代码风格检查,语法检查…)

首先解决dns问题,使得ci上的docker能够访问gitlab的域名:

(1)在另一台独立主机启动dns服务:docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq

(2)配置dns服务:docker exec -it dns-server /bin/sh

配置服务器地址:vi /etc/resolv.dnsmasq添加内容:nameserver 114.114.114.114 nameserver 8.8.8.8
配置本地解析规则:vi /etc/dnsmasqhosts 添加gilab域名解析:192.168.101.128 gitlab.example.com
修改dns服务的配置文件:vi /etc/dnsmasq.conf 内容:resolv-file=/etc/resolv.dnsmasq addn-hosts=/etc/dnsmasqhosts
(3)重启dns-server:docker restart dns-server
修改gitlab服务器的nameserver:vi /etc/resolv.conf nameserver [dns服务器地址]

  • 在gitlab-ci-runner服务器创建2个runners(python3.4和python2.7)

gitlab-ci-multi-runner register(excutor选择docker)

  • 在gitlab-ci-runner服务器首先pull2个需要的docker镜像(这里是python2.7和python3.4)

docker pull python:3.4/2.7

  • 在gitlab web上创建.gitlab-ci.yml会在pipeline上创建running,这就是整个ci过程。
stages:
  - style
  - test
pep8:
  stage: style
  script:
      - pip install tox
      - pip -e pep8
  tags:
      - python2.7
unittst-py27:
  stage: test
  script:
      - pip install tox
      - tox -e py27
  tags:
      - python2.7
unittst-py34:
  stage: test
  script:
      - pip install tox
      - tox -e py34
  tags:
      - python3.4
4. 真实python项目的CD

基于上面CI流程

实验步骤

  • 修改.gitlab-ci.yml文件
stages:
  - style
  - test
  - deploy
pep8:
  stage: style
  script:
      - pip install tox
      - tox -e pep8
  tags:
      - python2.7
unittst-py27:
  stage: test
  script:
      - pip install tox
      - tox -e py27
  tags:
      - python2.7
unittst-py34:
  stage: test
  script:
      - pip install tox
      - tox -e py34
  tags:
      - python3.4
docker-deploy:
  stage: deploy
  script:
      - docker build -t flask-demo .
      - if [ $(docker ps -aq --filter name=web) ]; then docker rm -f web; fi
      - docker run -d -p 5000:5000 --name web flask-demo
  tags:
      - shell
  only:
      - master

注意

1在上述实验过程中,可以在gitlab界面上设置master分支保护,只能允许hotfix或者realease分支merge。只有ci-runner通过后才能push到master分支

2在上述yml文件中,deploy只限制在master分支(only master)。也就是说master分支才出发deploy,其他分支不触发部署,只触发代码检查…等操作。

缺点

以上CD只部署在CI服务器,真实情况下是不行的,会使其部署在其他服务器。

5. CI实现版本自动发布

实验步骤

  • 在之前dns服务器搭建私有的docker registry

(1)docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2

(2)在dns-server的docker里面添加记录:[这台主机的ip] registry.example.com

(3)重启dns-server的docker.这样就能在CI服务器上ping通registry.example.com了

(4)在CI服务器上创建文件:vim /etc/docker/daemon.json写入内容:{“insecure-registries”:[“registry.example.com:5000”] }
(5)测试:在ci服务器pull一个busybox镜像,然后push到registry.example.com:5000
docker pull busybox
docker tag busybox registry.example.com:5000/busybox
docker push registry.example.com:5000/busybox(测试成功会出现pushed字眼)

  • 修改.gitlab-ci.yml文件
stages:
    - style
    - test
    - deploy
    - release
pep8:
    stage: style
    script:
        - pip install tox
        - tox -e pep8
    tags:
        - python2.7
    except:
        - tags
unittst-py27:
    stage: test
    script:
        - pip install tox
        - tox -e py27
    tags:
        - python2.7
    except:
        - tags
unittst-py34:
    stage: test
    script:
        - pip install tox
        - tox -e py34
    tags:
        - python3.4
    except:
        - tags
docker-deploy:
    stage: deploy
    script:
        - docker build -t flask-demo .
        - if [ $(docker ps -aq --filter name=web) ]; then docker rm -f web; fi
        - docker run -d -p 5000:5000 --name web flask-demo
    tags:
        - shell
    only:
        - master
docker-image-release:
    stage: release
    script:
        - docker build -t registry.example.com:5000/flask-demo:$CI_COMMIT_TAG .
        - docker push registry.example.com:5000/flask-demo:$CI_COMMIT_TAG
    tags:
        - shell
    only:
        - tags

说明:except:除去什么什么操作不触发;only tags 只在打tags的时候触发

  • 在gitlab web上new一个tab就能触发pipeline,使其push到registry服务器

在这里插入图片描述

在这里插入图片描述

  • 最后在docker host上使用k8s或者docker swarm 或者docker原生的方法去update image就可以实现无宕机的更新线上代码。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值