开发人员本地提交代码,本地使用容器模拟生产环境测试,测试通过提交到git master 分支,就会触发pipeline执行集成构建。集成工具: gitlab-vi,travis,或Jenkins。自动构建docker镜像并push到仓库,利用docker cloud,k8s等持续部署到web服务器。然后配置发布服务器从仓库拉取镜像,删除旧的版本,重新run新的版本。就完成了一次自动集成部署。

搭建GitLab CI服务器和Pipeline

不同的项目可能需要不同的测试环境,如果直接在CI服务器上面部署测试,多个项目可能会造成紊乱错误。

利用docker 容器,将项目build 成docker 容器,再进行测试,测试成功再push到docker registry 服务器。即使在一个CI服务器,也可以部署多个测试环境,以供使用。大大精简测试和部署的流程。

# 安装 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 sudo gitlab-ci-multi-runner status sudo usermod -aG docker gitlab-runner
sudo service docker restart sudo gitlab-ci-multi-runner restart # 本地gitlab地址
http://gitlab.example.com/

安装 gitlab ci runner

# 注册runner
sudo gitlab-ci-multi-runner register
gitlab-ci 集成服务器注册runner(即不同的集成环境供gitlab调用) token 在项目的CI选项里面,可以找到
一般不要把runner 绑定到一个项目,这样其他项目也可以调用。(除特殊项目需绑定以保护) [root@jenkins vagrant]# sudo gitlab-ci-multi-runner register
Running in system-mode. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://gitlab.example.com
Please enter the gitlab-ci token for this runner:
gWCZZjwskFtS5n4XT6kV
Please enter the gitlab-ci description for this runner:
[jenkins]: gitlab-ci
Please enter the gitlab-ci tags for this runner (comma separated):
python3.4
Whether to run untagged builds [true/false]:
[false]:
Whether to lock Runner to current project [true/false]:
[false]:
Registering runner... succeeded runner=gWCZZjws
Please enter the executor: docker, shell, ssh, kubernetes, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine:
docker
Please enter the default Docker image (e.g. ruby:2.1):
python:3.4
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

注册runner

查看
[root@jenkins vagrant]# sudo gitlab-ci-multi-runner list
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
jenkins Executor=shell Token=d790b6db10f7f7d3b8547519818948 URL=http://10.0.0.190/
gitlab-ci Executor=shell Token=ad11a86454c6552424fbf0d6c8b029 URL=http://gitlab.example.com
gitlab-ci Executor=docker Token=0304db778d4e040d25234594dbe363 URL=http://gitlab.example.com
gitlab-ci Executor=docker Token=b57303fbaf1623a5d8c42723606aad URL=http://gitlab.example.com
[root@jenkins vagrant]# sudo gitlab-ci-multi-runner verify
Running in system-mode.
Verifying runner... is alive runner=ad11a864
Verifying runner... is alive runner=0304db77
Verifying runner... is alive runner=b57303fb

查看

projects 的导入,可以通过github,url等导入到gitlab

在项目根目录下创建 .gitlab-ci.yml  并配置。 Python 的 tox 测试

 .gitlab-ci.yml

stages:
- style
- test
- deploy
- release pep8:
stage: style
script:
- pip install tox
- tox -e pep8
tags:
- python2.7
except:
- tags unittest-py27:
stage: test
script:
- pip install tox
- tox -e py27
tags:
- python2.7
except:
- tags unittest-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:
- demo
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:
- demo
only:
- tags

.gitlab-ci.yml

项目根目录下的集成文件    .gitlab-ci.yml     配置集成和部署的步骤 (pipeline)

    tags:            # 执行环境
- runner except: # 排除,tags不触发
- tags only: # 只有master更改才触发
- master stages: # 流程,有哪些步骤
- style
- test
- dploy
- release job name: #job名称 ,属于某一个流程

.gitlab-ci.yml配置语法 具体看帮助信息

gitlab 可以 实现代码仓库托管,直接拉取仓库集成测试。这块比较好,而且天生支持分布式。

CI的部署,但是runner公有的有限,还是得要有自己的测试runner,可以在本地自己搭建linux gitlab runner ,配置好环境,并注册,供gitlab CI 测试调度。然后发布到正式服务器。
     gitlab-ci 本身就支持分布式,可以再多台机器上执行runner 供gitlab 调用测试

要注意保护 master 分支 ,不能被随意修改,
     在 CI 设置里有 master protect 选项 和 parallel 检查设置
     只有push-->merge request-->pipline 测试通过 --> commit

.travis.yml # travis集成环境的环境配置文件 https://travis-ci.org/ 一个CI网站 ,开源项目免费,私有项目要钱。

language: python
env:
- TOXENV=py27
- TOXENV=py34
- TOXENV=pep8
- TOXENV=docs install:
- pip install tox
- pip install coveralls
script:
- tox after_success:
coveralls --verbose

.travis.yml

提交触发后 pipeline 的执行流程,可以点不同job 进行查看执行情况

注意要给项目分配 runner

当runner 环境为shell等非docker 时,要拉取自己搭建的gitlab 仓库,只需要配置hosts文件即可。

可当用runner 是 docker 时,每次拉取代码时,docker并不知道宿主机上的host文件,又不可能手动加进去,那样太麻烦。所以会出现无法访问自己的gitlab仓库。

这时候就需要,搭建DNS解析服务器,让docker能够解析到仓库。

Gitlab CI DNS server

配置一个DNS服务器,能让其他容器解析到 gitlab.example.com

首先,在gitlab ci服务器上把 gitlab.example.com 从/etc/hosts里删除

这时候在gitlab ci服务器上是 ping 不通 gitlab.example.com的。
   找一台新的Linux host,装好Docker,创建一个dnsmasq的容器,并运行。

docker-dns 服务器搭建
docker-host
docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq
docker exec -it dns-server /bin/sh
首先配置上行的真正的dns服务器地址,创建文件:
vi /etc/resolv.dnsmasq
添加内容:
nameserver 114.114.114.114
nameserver 8.8.8.8
# 置本地解析规则,这才是我们的真实目的。新建配置文件
vi /etc/dnsmasqhosts
# 加解析规则,其中192.168.205.160是本地 gitlab 服务器地址
192.168.205.160 gitlab.example.com
修改 dnsmasq 配置文件,指定使用上述我们自定义的配置文件 vi /etc/dnsmasq.conf 修改下述两个配置
resolv-file=/etc/resolv.dnsmasq
addn-hosts=/etc/dnsmasqhosts 回到宿主,重启dns-server容器服务。
docker restart dns-server
这时候这台docker host就是一个DNS服务器了,假如他的地址是192.168.205.15

dns-server 配置

搭建完dns服务器后,要修改为gitlab ci 服务器DNS服务器的ip ---> nameserver 192.168.205.15

[vagrant@ci ~]$ more /etc/resolv.conf
# Generated by NetworkManager
#nameserver 10.0.2.3
nameserver 192.168.205.15

view

这时候 docker 就能访问到gitlab服务器。

docker registry 服务器

docker hub 上传的镜像,属于公开状态,docker cloud 有要钱,还好可以搭建自己的docker registry服务器。这样push pull就方便多了。

这里将docker registry 服务器安装在dns同一台机器上。

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

配置 dns-server

执行
docker exec-it dns-server/bin/sh
添加一条新的记录
/ # more /etc/dnsmasqhosts
192.168.205.160 gitlab.example.com
192.168.205.15 reqistry.example.com

view

docker restart dns-server

ci 服务器 测试push 时 报错
[root@jenkins vagrant]# docker push registry.example.com:5000/flask-demo:V10
The push refers to repository [registry.example.com:5000/flask-demo]
Get https://registry.example.com:5000/v2/: http: server gave HTTP response to HTTPS client
docker-registry 服务器为http协议
客户端设置默认是HTTPS 协议取push
所以要特别更改/etc/docker/daemon.json
"insecure-registries":["http://registry.example.com:5000"]
[root@jenkins vagrant]# more /etc/docker/daemon.json
{
"registry-mirrors": ["https://6qcpzbml.mirror.aliyuncs.com"],
"insecure-registries":["http://registry.example.com:5000"]
}

查看push到registry的镜像版本

http://registry.example.com:5000/v2/flask-demo/tags/list

查看push的镜像 registry
     [root@docker-host ~]# ls /opt/registry/docker/registry/v2/repositories/
     flask-demo

在测试通过需要将最新的image push 到仓库

同时 部署容器时,要判断是否有旧的版本容器需要删除,然后再run新版本的容器

$CI_CONMMIT_TAG 是gitlab-ci 的环境变量。具体可以查看帮助文件

一有版本发布或是提交时会自动测试,管理员检查合并到master分支后,就会触发pipeline执行集成构建,build的最新镜像会被push 到仓库。

然后配置发布服务器从仓库拉取镜像,删除旧的版本,重新run新的版本。就完成了一次自动集成部署。

s11 Docker+DevOps实战--过程和工具的更多相关文章

  1. Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(2)- Jenkins初始化、Jenkins插件、Jenkins配置、自动化测试

    Jenkins初始化 step-1 访问Jenkins http://ip:80  step-2 查看密码.输入密码 # 方式一:通过查看容器日志 [root@localhost ~]# docker ...

  2. Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(1)- 创建Jenkins容器、安装Python环境、安装项目依赖类库、安装Allure报告插件

    前言: 本文实操笔记参照菠萝笔记,安装过程中的坑大家可以参考下 创建Jenkins容器 # 下载Jenkins镜像 [root@localhost ~]# docker pull jenkins/je ...

  3. Docker DevOps实战: 一分钟搭建Hexo博客

    原文地址:https://yq.aliyun.com/articles/53772 Hexo博客 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown解析文章,在几秒内,即可利 ...

  4. Docker DevOps实战:GitLab+Jenkins(1)- GitLab容器搭建、使用SourceTree pull/push项目

    GitLab容器搭建 # 创建GitLab容器# --restart always #重启,容器自动重启# --privileged=true #容器内使用root权限 [root@localhost ...

  5. Docker DevOps实战:GitLab+Jenkins(2)- CI/CD相关配置

    Jenkins关联GitLab Gitlab仓库配置Webhooks 上传项目到GitLab,Jenkins构建

  6. 研发过程及工具支撑 DevOps 工具链集成

    https://mp.weixin.qq.com/s/NYm63nkCymIV3DbL4O01dg 腾讯重新定义敏捷 |Q推荐 小智 InfoQ 2020-09-03 敏捷开发奠基人 Robert C ...

  7. docker入门实战笔记

    1.什么是docker: docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致 ...

  8. Docker下实战zabbix三部曲之三:自定义监控项

    通过上一章<Docker下实战zabbix三部曲之二:监控其他机器>的实战,我们了解了对机器的监控是通过在机器上安装zabbix agent来完成的,zabbix agent连接上zabb ...

  9. 【云计算】docker相关开源项目、工具

    十大基于Docker的开发工具 作者                     郭蕾        发布于     2014年8月19日     |              注意:QCon全球软件开发 ...

随机推荐

  1. 记录 Ext 日历月份选择控件bug解决过程结果

    目录 背景 代码 背景 项目使用 Ext.NET 2.2.0.40838 , 对应 Ext JS4.2 版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3 ...

  2. 学习 MeteoInfo二次开发教程(三)

    1.breakList的问题 ((PolygonBreak) aLS.breakList[0]).DrawFill=false; 新的类库将LegendScheme的breakList属性改为了Leg ...

  3. 第三章 FFmpeg转封装

    3.1 音视频文件转MP4格式 在互联网常见的格式中,跨平台最好的应该是MP4文件. 3.1.1 MP4格式标准介绍 MP4文件由多个Box与FullBox组成 每个Box由Header和Data两部 ...

  4. gentoo 工具命令

    查看具体某个命令来源于哪个软件包,使用 equery,比如说查找 lsusb 来源于哪个包,可以用 equery belongs lsusb

  5. Vim 命令、操作、快捷键

    打开单个文件:vim file 同时打开多个文件:vim file1 file2 file3 ... 在vim窗口中打开一个新文件 :  :open file 在新窗口中打开文件: :split fi ...

  6. 使用Nexus2搭建Maven本地仓库

    由于OS为WindowsXP,而Nexus3forWindows为x64版本,只能选择安装nexus2了. Windows(x86)平台,Nexus Repository Manager OSS 2. ...

  7. 尚硅谷springboot学习33-整合mybatis

    引入mybatis依赖(还要引入mysql和jdbc依赖) <dependency> <groupId>org.mybatis.spring.boot</groupId& ...

  8. LevelDB源码分析-Compact

    Compaction compact由背景线程完成,代码中触发背景线程的函数为: void DBImpl::MaybeScheduleCompaction() { mutex_.AssertHeld( ...

  9. 干货|技术小白如何在45分钟内发行通证(TOKEN)并上线交易(附流程代码

    https://blog.csdn.net/HiBlock/article/details/80071478

  10. JAVA类与类之间的全部关系简述+代码详解

    本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...