CI && CD
如果你是个初创公司,苦于svn代码管理,发布的繁琐。那么为什么不用git呢。本文就是使用开源的软件gitlab+gillab-ci+docker来完美的搭建代码持续集成,持续部署的系统。
1 安装gitlab
安装步骤
- 安装依赖
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就可以实现无宕机的更新线上代码。