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的名字】😒【環境變量】 .
- docker build -t registry.csylh.cn:5000/flask-demo:$CI_COMMIT_TAG .
- docker push registry.csylh.cn:5000/flask-demo:$CI_COMMIT_TAG
tags:
- demo
only:
- tags # 只有打了標簽的了才會觸發這個階段

提交更改之后,
訪問 registry.csylh.cn:5000/v2/flask-demo/tags/list

可以新建一個tag
HelloWorld》Repository >tags 進行new tags
,新建之后,就是會觸發一次新的pypelines
查看HelloWorld》CI/CD 》pipelines 會觸發一次新的操作

再次刷新訪問: registry.csylh.cn:5000/v2/flask-demo/tags/list

====穩定版本的部署:
部署到docker swarm k8s 等

定義階段

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 registry.csylh.cn:5000/flask-demo .
- docker push registry.csylh.cn:5000/flask-demo
- if [ $(docker ps -aq --filter name=web) ]; then docker rm -rf web;fi
- docker run -d -p 5000:5000 --name web registry.csylh.cn:5000/flask-demo
tags:
- demo # demo是shell類型的runner
only:
- master # 只有master分支變化,才做CD部署操作

docker-inage-release:
stage:release
script:
# - docker build -t 【tag的名字】/【image的名字】😒【環境變量】 .
- docker build -t registry.csylh.cn:5000/flask-demo:$CI_COMMIT_TAG .
- docker push registry.csylh.cn:5000/flask-demo:$CI_COMMIT_TAG
tags:
- demo
only:
- tags # 只有打了標簽的了才會觸發這個階段

到這里,應該就差不多了解cicd的基本操作使用了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM