写在前面

记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的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)的更多相关文章

  1. Jenkins+Gitlab搭建持续集成(CI)环境

    利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...

  2. CentOS 7 部署Gitlab+Jenkins持续集成(CI)环境

    持续集成概述及运行流程 : 持续集成概述 :持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中 ,可以频繁的将代码部署集成到主干,并进行自动化测试  开发→代 ...

  3. GitLab、Jenkins结合构建持续集成(CI)环境

    1 持续集成 概述及运行流程 1.1 持续集成概述 持续集成概述:持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并迚程自 ...

  4. 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表

    准备工作 开通Azure账号,具有开通服务权限,关键是里面要有钱. 开通Azure DevOps,能够创建组织和项目. 具备一定的DevOps知识,了解CICD概念.Docker基本操作. 一.创建& ...

  5. 【持续集成】jenkins安装部署从git获取代码

    一:持续集成的概念: 1.1:总体的概括 持续集成Continuous Integration 持续交付Continuous Delivery 持续部署Continuous Deployment 1. ...

  6. 持续集成篇 --Hudson持续集成服务器的安装配置与使用

    样例项目参考视频教程:http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 IP:192.168.4.221  8G内存 ...

  7. 持续集成篇_08_Hudson持续集成服务器的使用(自动化编译、分析、打包、部署)

    持续集成篇_08_Hudson持续集成服务器的使用(自动化编译.分析.打包.部署) 1.创建任务 svn用户验证 验证通过 *****五颗*表示每分钟检查svn路径是否有变更,有变更就会重新构建,相当 ...

  8. 【docker】docker持续集成CI/持续部署CD

    持续集成(CI) 持续集成(Continuous integration)是一种流行的软件开发实践.集成是指开发将自己本地的代码提交到git等远端仓库上,那么持续集成就是每天多次提交,提早提交代码. ...

  9. 持续集成CI

    一.CI 和 CD 持续集成是什么? 持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干.让产品可以快速迭代,同时还能保持高质量. 持续交付( ...

随机推荐

  1. odoo添加顶部按钮实现自定义方法

    一.效果图 自定义添加顶部按钮,实现自定义方法. 二.实现过程 1.需要用到三个文件,tree_view_button.js.tree_view_odoo.xml.base.xml三个文件,文件目录如 ...

  2. vue-cli2.X中引入高德地图,将其设为全局对象

    平时一般未用脚手架构建或用webpack构建的项目只要用script标签引入即可,在vue-cli 2.X构建的项目中,需要用如下方式引入高德地图: 首先在高德地图开放平台中注册开发者账号并获取key ...

  3. requests.get爬虫模块参数

    地址和请求头参数--url和header res = requests.get(url,headers=headers) 向网站发起请求,并获取响应对象 参数 url :需要抓取的URL地址 head ...

  4. P2698 [USACO12MAR]花盆Flowerpot 单调队列

    https://www.luogu.org/problemnew/show/P2698 警示 用数组写双端队列的话,记得le = 1, ri = 0:le<=ri表示队列非空 题意 求一个最小的 ...

  5. Trace 2018徐州icpc网络赛 思维+二分

    There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy) ...

  6. ZOJ-1610 Count the Colors ( 线段树 )

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Description Painting some co ...

  7. 一起来聊一下 JavaScript 的用途和那些特性

    JavaScript 简介 我们一起来聊一下 JavaScript,用它能做什么,它有哪些特性,以及一些跟它配合使用的技术. 什么是 JavaScript? JavaScript 最初的目的是为了&q ...

  8. 原来JS是这样的 - 对象属性

    引子 在上一篇(原来JS是这样的 (2))刚发布的时候就阅读了那篇文章的人可能会注意到那篇曾用过"JavaScript 中万物皆对象"的说法,而在随后我发现错误后立即更新改掉了这个 ...

  9. PythonI/O进阶学习笔记_3.2面向对象编程_python的封装

    前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第三篇 封装. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...

  10. 相同类中方法间调用时日志Aop失效处理

    本篇分享的内容是在相同类中方法间调用时Aop失效处理方案,该问题我看有很多文章描述了,不过大多是从事务角度分享的,本篇打算从日志aop方面分享(当然都是aop,失效和处理方案都是一样),以下都是基于s ...