Docker践行DevOps-Gitlab

1 DevOps实践基本环境

1.1 DevOps的基本流程

在这里插入图片描述

  1. 这里选择GitLab CI,作为我们的CI服务器。(最流行的是jenkins,有很多插件这里不做介绍。)
    1.安装部署方便,天然分布式
    2.跟GitLab集成较好

1.2 搭建GitLab服务器

  1. 以Centos7为例,准备一台至少内存为4G的机器。
  2. 其他按照参考:https://about.gitlab.com/install/
# 安装依赖
sudo yum install -y git vim gcc glibc-static telnet
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

#  设置gitlab安装源
sudo mkdir -p /etc/yum.repos.d/
sudo tee /etc/yum.repos.d/gitlab-ce.repo <<-'EOF'
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
EOF

# 安装GitLab 本地测试,则可以像下面一样, 设置一个example的域名
sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce
# 然后记得在本地你的笔记本设置host C:\Windows\System32\drivers\etc 
# 192.168.211.10 gitlab.example.com
# 如果不想设置域名可以直接
sudo yum install -y gitlab-ce
# 安装后可以对gitlab进行配置 第一次不配置就不启动
sudo gitlab-ctl reconfigure
# 查看运行进程 是否存在(不存在的话 可以看下配置加载没) 如果存在 主机浏览器输入看到界面
http://gitlab.example.com/

# 修改gitlab的常用配置 重新加载
sudo vim /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
  1. 创建一个demo组,在组中创建一个HelloWorld的Project工程。并添加README.md文件。
    在这里插入图片描述
  2. 本地使用Git工具进行第一次下载代码。
    1.使用Http协议的。不需要要秘钥配置,简单操作一些。如果配错密码,请到 控制面板\用户帐户\凭据管理器 中修改。
    2.使用SSH协议,需要配置秘钥。
git clone http://gitlab.example.com/demo/Helloworld.git

1.3 搭建GitLab-CI服务器

  1. 配置gitlab-ci-multi-runner。 GitLab CI服务器最好是单独一台Linux机器,和GitLab分开。
# 安装Docker 我环境中已经有docker 就不用安装了
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y yum-utils lvm2 git vim gcc glibc-static telnet bridge-utils net-tools bind-utils wget device-mapper-persistent-data nfs-utils
sudo yum install -y docker-ce


# 安装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

# 设置Docker权限
# 为了能让gitlab-runner能正确的执行docker命令,需要把gitlab-runner用户添加到docker group里, 然后重启docker和gitlab ci runner
sudo usermod -aG docker gitlab-runner
sudo service docker restart
sudo gitlab-ci-multi-runner restart
  1. 把gitlab-ci-multi-runner注册到GitLab服务器中。
# 先在GitLab CI服务器上添加GitLab服务器host 
# 192.168.211.10 gitlab.example.com
sudo vi /etc/hosts
# 查看帮助奥
gitlab-ci-multi-runner -h
# 注册
sudo gitlab-ci-multi-runner register
# 1. 提示输入GitLab服务器
http://gitlab.example.com/
# 2. 输入gitlab-ci token查看 看下图
7s6AgGVqPMTo4QsYLyHV
# 3. 输入描述 随便输入 不写也行
# 4. 输入tag 提示逗号隔开 我们写两个
test, demo
# 5. 是否untags build 默认否 直接enter
# 6. 是否只为这一个工程服务 默认否 直接enter
# 7. 选择执行方式这里选shell。Please enter the executor: shell, ssh, virtualbox, docker-ssh+machine, kubernetes, docker, docker-ssh, parallels, docker+machine:
shell
# 注册成功 查看runner
gitlab-ci-multi-runner list

在这里插入图片描述
在这里插入图片描述

1.4 Pipeline的案例演示

  1. 在Helloworld工程中添加一个文件.gitlab-ci.yml。
  2. 注意:如果文件中没有定义tags,那它就找不到执行的runner机器。
    在这里插入图片描述
# 按照stages的顺序执行 先执行build job2
stages:
  - build
  - test
  - deploy

job1:
  stage: test
  tags:
    - demo
  script:
    - echo "I am job1"
    - echo "I am in test stage"
    
job2:
  stage: build
  tags:
    - demo
  script:
    - echo "I am job2"
    - echo "I am in build stage"
    

job3:
  stage: deploy
  tags:
    - demo
  script:
    - echo "I am job3"
    - echo "I am in deploy stage"
  1. 查看对应的流水线执行。以及点进去可以看到执行输出。
    在这里插入图片描述
    在这里插入图片描述

2 基于真实Python项目的CI

2.1 导入python项目

1.导入之前github中的之前使用的python项目到gitlab中。
在这里插入图片描述
2. 克隆gitlab上代码到本地。和上面一样使用http协议
1.git clone http://gitlab.example.com/root/docker_hub_flask_demo.git

# 构建镜像
docker build -t  flask-demo 
# 运行容器
docker run -d -p 5000:5000  flask-demo
# 检查风格
tox

2.2解决gitlab-ci的容器中不能访问gitlab的域名

1.找一台新的Linux host,装好Docker.然后在这台机器上,创建一个dnsmasq的容器,并运行。

docker pull andyshinn/dnsmasq
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
# 首先配置上行的真正的dns服务器地址,毕竟你只是个本地代理,不了解外部规则。创建文件:
vi /etc/resolv.dnsmasq
#添加内容:
nameserver 114.114.114.114
nameserver 8.8.8.8

# 配置本地解析规则,这才是我们的真实目的。新建配置文件
vi /etc/dnsmasqhosts
# 添加解析规则,其中192.168.211.10是gitlab服务器地址
192.168.211.10 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.99.100
  1. 测试一下是否成功。下面测试成功则证明。域名解析成功。(/etc/host中的解析去掉就行)
    1.在gitlab ci机器上修改 sudo vim /etc/resolv.conf 让DNS服务器解析域名。只保留
    nameserver 192.168.99.100
    2.192.168.99.100是DNS服务器地址。这时候在本地就可以ping通gitlab.example.com了
    3.测试是否解析成功: ping gitlab.example.com
    测试容器内可以不可以解析 docker pull busybox
    1)docker run -it --rm busybox sh
    2)ping gitlab.example.com

2.3 gitlab-ci中添加docker类型的runner

1.添加一个python2.7和一个python3.4的runner。

# 注册
sudo gitlab-ci-multi-runner register
# 1. 提示输入GitLab服务器
http://gitlab.example.com/
# 2. 输入gitlab-ci token查看 看下图
7s6AgGVqPMTo4QsYLyHV
# 3. 输入描述 随便输入 不写也行
# 4. 输入tag 提示逗号隔开 我们写两个
python2.7
# 5. 是否untags build 默认否 直接enter
# 6. 是否只为这一个工程服务 默认否 直接enter
# 7. 选择执行方式这里选shell。Please enter the executor: shell, ssh, virtualbox, docker-ssh+machine, kubernetes, docker, docker-ssh, parallels, docker+machine:
docker
# 8. 输入docker image
python2.7
# 注册成功 查看runner
sudo gitlab-ci-multi-runner list
sudo gitlab-ci-multi-runner verify
  1. 面板中启用runner
    在这里插入图片描述
  2. 在gitlab-ci中提前拉取镜像。
    1.docker pull python:2.7
    2.docker pull python:3.4
  3. 修改gitlab-ci.yml。触发CI pipline(如果失败,看看是不是下载python库的原因,如果是在Dockerfile 加上豆瓣源 -i https://pypi.douban.com/simple)
variables:
  GIT_SSL_NO_VERIFY: "1"

stages:
  - style
  - test

pep8:
  stage: style
  image: python:2.7
  script:
    - pip install tox -i https://pypi.douban.com/simple
    - tox -e pep8
  tags:
    - python27

unittest-py27:
  stage: test
  image: python:2.7
  script:
    - pip install tox -i https://pypi.douban.com/simple
    - tox -e py27
  tags:
    - python27

unittest-py34:
  stage: test
  image: python:3.4
  script:
    - pip install tox -i https://pypi.douban.com/simple
    - tox -e py34
  tags:
    - python34

2.4 README.md添加Badges

在这里插入图片描述

  1. setting -> General pipelines->Pipeline status 和 Coverage report
  2. 可以实时显示pipeline的状态和覆盖率。
    在这里插入图片描述

3 基于Java项目的CI

  1. 定义一个maven的runner。
  2. 直接运行就行了。(例子比较简单)
  3. 各种语言的CI案例:https://docs.gitlab.com/ee/ci/examples/README.html
# 注册
sudo gitlab-ci-multi-runner register
# 1. 提示输入GitLab服务器
http://gitlab.example.com/
# 2. 输入gitlab-ci token查看 看下图
7s6AgGVqPMTo4QsYLyHV
# 3. 输入描述 随便输入 不写也行
# 4. 输入tag 提示逗号隔开 我们写两个
maven
# 5. 是否untags build 默认否 直接enter
# 6. 是否只为这一个工程服务 默认否 直接enter
# 7. 选择执行方式这里选shell。Please enter the executor: shell, ssh, virtualbox, docker-ssh+machine, kubernetes, docker, docker-ssh, parallels, docker+machine:
docker
# 8. 输入docker image
maven:latest
# 注册成功 查看runner
sudo gitlab-ci-multi-runner list
sudo gitlab-ci-multi-runner verify

4 基于真实Python项目的部署和发布

4.1 CD持续部署

  1. 修改yml文件,加上部署阶段。 这个阶段使用shell容器demo来执行就可以啦。
  2. 需要判断 容器存不存在 如果存在删除,重新创建.
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

  1. 设置分支保护。不让任何人直接改动。为了让别人在自己分支上修改代码,并合并分支的方式提交代码,需要设置Merge requests
    在这里插入图片描述
    在这里插入图片描述
  2. 只有master分支变化,才允许重新部署。
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
————————————————
版权声明:本文为CSDN博主「道教儒佛电磁波」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aa18855953229/article/details/105883744
  1. 合入代码后自动再次出发pipline, 并进行部署。
  2. 我们这种部署是自己测试用的,部署在我们的CI服务器上。一般来说生产环境部署应该是基于发布部署的。

4.2 CD版本自动发布

  1. 之前我们曾经在docker hub上,通过tag版本更新出发镜像构建和部署。
  2. 首先搭建一个私有的docker registry
# 在上面安装docker的gitlab-DNS上运行 
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
# docker registry 绑定了到本地的80端口。 接下来我们配置DNS server,假如我们这台运行registry的机器地址是192.168.99.100,然后我们找到上次配置gitlab ci的那个dns container
docker exec -it dns-server /bin/sh
# 添加一条新的记录
# more /etc/dnsmasqhosts
192.168.211.10 gitlab.example.com
192.168.99.100 registry.example.com
# 然后重启container
docker restart dns-server
# 最后我们去gitlab-ci服务器,ping一下
ping registry.example.com
  1. 在gitlab-ci服务器上测试一下, 是否可以上传自己的镜像到私有仓库。
# 修改文件 指向自己的私有仓库 registry.example.com
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "insecure-registries":["registry.example.com:5000"] 
}
EOF
# 先拉去busybox
docker pull busybox
# 重新打上标签
docker tag busybox registry.example.com:5000/busybox
# 重启后生效 源文件修改生效
sudo systemctl restart docker
# 上传到自己的私有仓库 成功如下
#The push refers to repository [registry.example.com:5000/busybox]5b0d2d635df8: Pushed
# latest: digest: sha256:a2490cec4484ee6c1068ba3a05f89934010c85242f736280b35343483b2264b6 si
docker push registry.example.com:5000/busybox
  1. 修改gitlab-ci.yml文件, 让它实现下面功能。 加上一个阶段release
    1.只有打了新的tag (发布版本的时候),pipeline才 会触发release这个stage。 通过only标签
    2.在release这个stage,会对当前tag版本代表build一个相应tag的docker image
    3.CI_ COMMIT_TAG 是我们的release版本号(这个环境变量在下面链接中可以看到)
    4.http://gitlab.example.com/help/ci/variables/README.md#limiting-environment-scopes-of-environment-variables
docker-deploy:
	stage:deploy
	script :
		- docker build -t registry.example.com:5000/flask-demo .
		- docker push registry.example.com:5000/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
  1. 如果有些job, 不希望打tag时候重新跑一边。那么可以加上标签except 如下:
pep8:
  stage: style
  image: python:2.7
  script:
    - pip install tox -i https://pypi.douban.com/simple
    - tox -e pep8
  tags:
    - python27
  except:
  	- tags
  1. 打个标签,测试一下
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值