Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)
写在前面
记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的DevOps
gitlab安装
步骤一:安装依赖
yum -y install git gcc glibc-static telnet
yum -y install curl policycoreutils-python openssh-server
systemctl enable sshd
systemctl start sshd
yum -y install postfix
ystemctl enable postfix
systemctl start postfix
步骤二:设置镜像源
设置清华镜像源
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=0
enabled=1
步骤三:yum正式安装
yum -y install gitlab-ce
步骤四:修改配置文件
vim /etc/gitlab/gitlab.rb
重新加载配置文件进行启动
gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-ctl status
Gitlab -CI 服务器的安装【这台服务器中安装好docker】
步骤一:下载配置yum repository信息:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
步骤二:安装gitlab-ci-multi-runner
yum install -y gitlab-ci-multi-runner
步骤三:安装完毕,就可以进行状态定位查看:
gitlab-ci-multi-runner status
/etc/hosts
192.168.1.113 gitlab.csylh.cn
步骤四=======补充:由于我们的CI服务器,即Gitlab-runner 需要执行docker的命令,因此需要将gitlab-runner这个用户进行授权等操作
保证gitlab-CI服务器上面有安装Docker服务
操作:将gitlab-runner用户添加到root或者docker组中去
usermod -aG root gitlab-runner
重启docker服务
service docker restart
systemctl restart docker.service
重启runner的service
gitlab-ci-multi-runner restart
这样一来,就可以在runner中去使用docker的命令了
步骤五:注册
[把runner注册到gitlab的服务器中去],让gitlab服务器知道我们有这个runner
命令:gitlab-ci-multi-runner register
依次
输入gitlab服务器的地址: http://gitlab.csylh.cn
ps:这里的url地址需要注意:假如不和gitlab服务器在一台上,需要将url的映射地址添加在/etc/hosts
输入token:某一个具体项目中》details>settings》ci/cd>runners:找到token码
输入runner的描述:默认或自定义
输入tags: 比如:test,demo
回车
回车
这个时候,就是会看见succeeded
接下来,需要进行选择runner执行操作的方式
比如:shell
命令:gitlab-ci-multi-runner list 查看
或:回到页面,查看刚才的token位置 ,会多一个绿色的runner
如何去使用刚为HelloWorld项目注册的runner呢??
在HelloWorld》CI/CD》pipelines
通过.gitlab-ci.yml的文件去定义CI的pipelines
接下来,为HelloWorld项目增加这个文件:
# .gitlab-ci.yml定义阶段
stages:
- build
- test
- deploy
job1:
stage: test
tags:
- demo
script:
- echo "I am job1"
- echo "I am test stage"
job2:
stage: build
tags:
- demo
script:
- echo "I am job2"
- echo "I am build stage"
#部署阶段
job3:
stage: deploy
tags:
- demo
script:
- echo "I am job3"
- echo "I am deploy stage"
案例二:基于真实项目的CI操作
https://github.com/imooc-course/docker-cloud-flask-demo
步骤一:new project > import project > repo by url
步骤二:这个时候项目就在自己搭建gitlab服务器上了
可以把项目git clone的方式拷贝到gitlab-ci服务器上面来
步骤三:使用DockerFile文件进行构建镜像
docker build -t flask-demo .
docker build -t [镜像名] dockerfile的位置
生成了一个叫做flask-demo的image
步骤四:根据生成的镜像启动一个容器
docker run -d -p 5000:5000 flask-demo
docker run -d -p 5000:5000 [镜像名]
打开浏览器,就可以访问网站了
步骤五:
我们需要持续集成CI这一步骤,来完成单元测试和检测代码风格
我们在本地gitlab-ci服务器上面使用tox进行单元测试和代码风格的校验
tox应该是pyhton的一个第三方校验的工具
ps:使用docker的一个好处就是,不会让你的物理机环境变得脏乱
假如在gitlab-ci服务器上面使用docekr容器进行构建项目的话,
首要问题就是,你注册的runner的gitlab服务器的URL,
容器中是不能找到的
DNS服务的配置
【新机器】docker-mertion创建docker-host
启动一个dnsmasq ,其实就是一个DNS服务
Gitlab CI DNS Server
配置一个DNS的服务器,能够让其他的容器解析到gitlab的URL地址
步骤一:
将gitlab-ci 服务器上面的192.168.1.112 gitlab.csylh.cn 映射关系移除
保证,这个时候ping 不通gitlab.csylh.cn
步骤二:启动DNS服务器
找一台新的linux 主机,可以使用vagrant或docker-machine创建一台
在新的linux主机上,创建一个dnsmasq的容器
docker run -d -p 53:53/udp -p 53:53/tcp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq
步骤三:配置DNS服务
进入容器:
docker exec -it dns-server bash
docker exec -it dns-server /bin/sh
3.1配置上行的dns服务地址
vim /etc/resolv.dnsmasq
添加:
nameserver 114.114.114.114
nameserver 8.8.8.8
3.2添加本地解析规则
vim /etc/dnsmasqhosts
添加:
192.168.1.112 gitlab.csylh.cn
192.168.1.112是本地gitlab服务器的地址
3.3修改dnsmasq的默认配置文件,指定上述文件
vim /etc/dnsmasq.conf 修改如下配置
resolv-file=/etc/resolv.dnsmasq
addn-hosts=/etc/dnsmasqhosts
步骤四:
回到物理机:
重启docker服务
docker restart dns-server
步骤五: 回到gitlab-ci 这台机器上来
5.1: 指定dns的server 为刚才配置的这台机器的ip
vim /etc/resolv.conf
nameserver 192.168.1.113
5.2 :使用ping gitlab.csylh.cn是可以通的
5.3: 使用gitlab-ci服务器创建的容器中 也是可以ping通gitlab.csylh.cn
添加docker类型的runner
1.在gitlab-ci服务器中注册python2.7版本的
命令:gitlab-ci-multi-runner register
输入gitlab服务器的地址:
输入token:某一个具体项目中》details
输入runner的描述:默认或自定义
输入tags:python2.7
回车
回车
选择runner执行操作:docker
输入默认的python镜像:python2.7
2.在gitlab-ci服务器中注册python3.4版本的
命令:gitlab-ci-multi-runner register
输入gitlab服务器的地址:
输入token:某一个具体项目中》details
输入runner的描述:默认或自定义
输入tags:python3.4
回车
回车
选择runner执行操作:docker
输入默认的python镜像:python3.4
3.通过gitlab-ci-multi-runner verify 查看这个时候正在运行的runner
或:回到页面,查看刚才的token位置
会发现有多个了
4.可以提前拉取容器中需要使用到的image
以便于CI服务器中的pipelines再跑的时候,不至于去找自己所需要的镜像
5.正式使用刚才注册的runner
做style
做test
stages:
- style
- test
pep8:
stage: style
script:
- pip install tox
- tox -e pep8
tags:
- python2.7
unittest-py27:
stage:test
script:
- pip install tox
- tox -e py27
tags:
- python2.7
unittest-py34:
stage:test
script:
- pip install tox
- tox -e py34
tags:
- python3.4
提交之后:就是会触发CI操作
重点:吧唧的配置
》HelloWorld》settings>CI/CD>General pipelines settings
复制到ReadMe.md文件中去
CD的持续部署操作
目的:本地提交代码到gitlab的master分支
进行触发runner 的pipelines ,从而自动部署
其实就是在.gitlab-ci.yml 文件中去定义部署的stage
参考DockerFile
runner的类型shell docker
如下:
定义阶段
stages:
- style
- test
- deploy
pep8:
stage: style
script:
- pip install tox
- tox -e pep8
tags:
- python2.7
unittest-py27:
stage:test
script:
- pip install tox
- tox -e py27
tags:
- python2.7
unittest-py34:
stage:test
script:
- pip install tox
- tox -e py34
tags:
- python3.4
docker-deploy:
stage:deploy
script:
- docker build -t flask-demo .
- docker run -d -p 5000:5000 flask-demo
tags:
- demo # demo是shell类型的runner
这个时候,在gitlab服务器上面使用或者本地提交到gitlab上
git add .
git commit -am "add cd"
git push origin master
主要是想触发gitlab-ci服务器上面的runner的pipelines
这个时候在gitlab-ci上面就会执行
docker-deploy:
stage:deploy
script:
- docker build -t flask-demo .
- docker run -d -p 5000:5000 flask-demo
tags:
- demo # demo是shell类型的runner
这一段脚本,结果就是,可以浏览器访问到网站
ps:上面的脚本中docker run -d -p 5000:5000 flask-demo
在每一次,提交,都会启动5000端口,但是这是不可能的
只能是,强制kill 掉之前的,重新启动5000端口
实现:
docker-deploy:
stage:deploy
script:
- docker build -t flask-demo .
- if [ $(docker ps -aq --filter name=web) ]; then docker rm -rf web;fi
- docker run -d -p 5000:5000 --name web flask-demo
tags:
- demo # demo是shell类型的runner
做了上面的更改之后,重新提交到master分支
git add .
git commit -am "add cd"
git push origin master
这样就可以啦。浏览器成功访问
===========================================
步骤一 :设置受保护的分支
HelloWorld》settings>repository 》protectd Branches
更改为 NO ONE
目的:任何人都不能随意动master分支
步骤二 :
上面的master分支被设置之后,是不能够直接提交的
所以,只能够是在开发分支等上面进行提交代码
HelloWorld》settings> General > Merge Request settings》
[√]only allow merge requests to be merged
步骤三 : 创建分支
HelloWorld》第三个》branche>new 一个dev 分支
步骤四:
本地开发,重新拉取dev分支
git fetch
git checkout dev
做简单修改
docker-deploy:
stage:deploy
script:
- docker build -t flask-demo .
- if [ $(docker ps -aq --filter name=web) ]; then docker rm -rf web;fi
- docker run -d -p 5000:5000 --name web flask-demo
tags:
- demo # demo是shell类型的runner
only:
- master # 只有master分支变化,才做CD部署操作
git add .
git commit -am "footer edit"
push到gitlab服务器上面的dev分支
git push origin dev
来到gitlab服务器对象项目的dev分支,
右上角的,create merge request
创建一个合并请求
小节:
以上的CI/CD 都是将项目部署在gitlab-ci服务器上面的,但是真实,可不一定是这样
接下来,就是需要将CD部署在其余的机器上
再就是,基于版本发布进行CD
CI实现版本自动发布=====
简单的CI/CD功能的实现:
只要master分支一变化,就会自动构建image 自动docker run
github或gitlab上面一有新的版本发布,
docker cloud 会基于这个新的版本进行自动build 一个新的镜像image[带有版本的tag]
一种方式如下:
=搭建一个私有的Docker registry==========
找一台docker host ,运行
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
======接下来, 我们需要配置DNS server
,假设这台运行registry的机器ip为 192.168.1.113
找到,上次运行dns-server 容器的机器
进入容器:
docker exec -it dns-server bash
添加一条:
vim /etc/dnsmasqhosts
192.168.1.113 registry.csylh.cn
接下来, 使用gitlab-ci去ping registry.csylh.cn是可以ping通的
,而且,之前的gitlab.csylh.cn还是可以ping 通的
===测试:push image到registry.csylh.cn机器上
因为我们这个是不安全的registry
,需要修改gitlab-ci服务器上面的/etc/docker/daemon.json文件
添加:
{ "insecure-registries":["registry.csylh.cn"] }
接着,重启这个docker server【docker-ci 服务器上】
在gitlab-ci 中:
[从dockdr hub中拉取任意一个镜像]
docker pull busybox
把这个拉取的镜像打上我们自己的标签
docker tag busybox registry.csylh.cn:5000/busybox
然后,就是可以进行push到自己的私有仓库中去了
docker push registry.csylh.cn:5000/busybox
显示成功。
===到这里,准备工作完成
重点来了,修改.gitlab-ci.yml文件
增加stage
定义阶段
stages:
- style
- test
- deploy
- release
pep8:
stage: style
script:
- pip install tox
- tox -e pep8
tags:
- python2.7
except:
- tags #不包含有tags的改变都会执行
unittest-py27:
stage:test
script:
- pip install tox
- tox -e py27
tags:
- python2.7
except:
- tags #不包含有tags的改变都会执行
unittest-py34:
stage:test
script:
- pip install tox
- tox -e py34
tags:
- python3.4
except:
- tags #不包含有tags的改变都会执行
docker-deploy:
stage:deploy
script:
- docker build -t flask-demo .
- if [ $(docker ps -aq --filter name=web) ]; then docker rm -rf web;fi
- docker run -d -p 5000:5000 --name web flask-demo
tags:
- demo # demo是shell类型的runner
only:
- master # 只有master分支变化,才做CD部署操作
docker-inage-release:
stage:release
script:
# - docker build -t 【tag的名字】/【image的名字】
Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)的更多相关文章
- Jenkins+Gitlab搭建持续集成(CI)环境
利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...
- CentOS 7 部署Gitlab+Jenkins持续集成(CI)环境
持续集成概述及运行流程 : 持续集成概述 :持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中 ,可以频繁的将代码部署集成到主干,并进行自动化测试 开发→代 ...
- GitLab、Jenkins结合构建持续集成(CI)环境
1 持续集成 概述及运行流程 1.1 持续集成概述 持续集成概述:持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并迚程自 ...
- 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表
准备工作 开通Azure账号,具有开通服务权限,关键是里面要有钱. 开通Azure DevOps,能够创建组织和项目. 具备一定的DevOps知识,了解CICD概念.Docker基本操作. 一.创建& ...
- 【持续集成】jenkins安装部署从git获取代码
一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部署Continuous Deployment 1. ...
- 持续集成篇 --Hudson持续集成服务器的安装配置与使用
样例项目参考视频教程:http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 IP:192.168.4.221 8G内存 ...
- 持续集成篇_08_Hudson持续集成服务器的使用(自动化编译、分析、打包、部署)
持续集成篇_08_Hudson持续集成服务器的使用(自动化编译.分析.打包.部署) 1.创建任务 svn用户验证 验证通过 *****五颗*表示每分钟检查svn路径是否有变更,有变更就会重新构建,相当 ...
- 【docker】docker持续集成CI/持续部署CD
持续集成(CI) 持续集成(Continuous integration)是一种流行的软件开发实践.集成是指开发将自己本地的代码提交到git等远端仓库上,那么持续集成就是每天多次提交,提早提交代码. ...
- 持续集成CI
一.CI 和 CD 持续集成是什么? 持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干.让产品可以快速迭代,同时还能保持高质量. 持续交付( ...
随机推荐
- LeetCode115不同的子序列
题目说明在这里就不贴出来了,相信打开这篇文章的小伙伴们肯定都是在刷LeetCode的. 一开始我的想法是dfs+回溯,结果运行超时,一开始我就觉得可能会超时,结果不出所料[手动笑哭]. 后来我想了下d ...
- 快速了解会话管理三剑客cookie、session和JWT
更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 存储位置 三者都是应用在web中对http无状态协议的补充,达到状态保持的目的 cookie:cookie中的信息是 ...
- 2019-07-26-hexo博客图片问题
本人的解决方案 *** 将hexo的主页配置文件中的_config.yml里的post_asset_folder设置为true. 在git bash里运行npm install hexo-asset- ...
- 《快照读、当前读和MVCC》
1.快照读 快照读是基于 MVCC 和 undo log 来实现的,适用于简单 select 语句,避免了幻读. 读已提交:一个事务内操作一条数据,可以查询到另一个已提交事务操作同一条数据的最新值.( ...
- (二)springMvc原理和手写springMvc框架
我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)Sp ...
- python控制窗口移动(画圆)
import win32con import win32gui import time import math notepad = win32gui.FindWindow("Notepad& ...
- 模板汇总——快读 fread
struct FastIO { ; int wpos; char wbuf[S]; FastIO() : wpos() { } inline int xchar() { static char buf ...
- poj 3660Cow Contest
题目链接:http://poj.org/problem?id=3660 有n头奶牛还有m种关系a,b表示a牛逼b彩笔,所以a排名比b高 最后问你给出的关系最多能确定多少头奶牛的排名,而且给出的数据不会 ...
- bzoj3032 七夕祭题解
题面 TYVJ七夕祭和11区的夏祭的形式很像.矩形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的.Vani ...
- go Server示例
示例1: package main import ( "fmt" "log" "net/http" "time" ) f ...