Gitlab+Gitlab-CI+Docker實現持續集成(CI)與持續部署(CD)

寫在前面

記錄一下,一個自動化開發部署項目的構建過程與簡單使用,實現真正的DevOpspython

gitlab安裝

步驟一:安裝依賴linux

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 postfixgit

步驟二:設置鏡像源github

設置清華鏡像源
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=1web

步驟三:yum正式安裝docker

yum -y install gitlab-ceshell

步驟四:修改配置文件
vim /etc/gitlab/gitlab.rb
從新加載配置文件進行啓動
gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-ctl statusjson

Gitlab -CI 服務器的安裝【這臺服務器中安裝好docker】

步驟一:下載配置yum repository信息:flask

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bashvim

步驟二:安裝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的基本操做使用了

相關文章
相關標籤/搜索