記錄一下,一個自動化開發部署項目的構建過程與簡單使用,實現真正的DevOpspython
步驟一:安裝依賴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
步驟一:下載配置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,
容器中是不能找到的
【新機器】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
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
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
重點:吧唧的配置
》HelloWorld》settings>CI/CD>General pipelines settings
複製到ReadMe.md文件中去
目的:本地提交代碼到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的基本操做使用了