開發人員本地提交代碼,本地使用容器模擬生產環境測試,測試經過提交到git master 分支,就會觸發pipeline執行集成構建。集成工具: gitlab-vi,travis,或Jenkins。自動構建docker鏡像並push到倉庫,利用docker cloud,k8s等持續部署到web服務器。而後配置發佈服務器從倉庫拉取鏡像,刪除舊的版本,從新run新的版本。就完成了一次自動集成部署。html
不一樣的項目可能須要不一樣的測試環境,若是直接在CI服務器上面部署測試,多個項目可能會形成紊亂錯誤。python
利用docker 容器,將項目build 成docker 容器,再進行測試,測試成功再push到docker registry 服務器。即便在一個CI服務器,也能夠部署多個測試環境,以供使用。大大精簡測試和部署的流程。linux
# 安裝 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 sudo usermod -aG docker gitlab-runner sudo service docker restart sudo gitlab-ci-multi-runner restart # 本地gitlab地址 http://gitlab.example.com/
# 註冊runner sudo gitlab-ci-multi-runner register gitlab-ci 集成服務器註冊runner(即不一樣的集成環境供gitlab調用) token 在項目的CI選項裏面,能夠找到 通常不要把runner 綁定到一個項目,這樣其餘項目也能夠調用。(除特殊項目需綁定以保護) [root@jenkins vagrant]# sudo gitlab-ci-multi-runner register Running in system-mode. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): http://gitlab.example.com Please enter the gitlab-ci token for this runner: gWCZZjwskFtS5n4XT6kV Please enter the gitlab-ci description for this runner: [jenkins]: gitlab-ci Please enter the gitlab-ci tags for this runner (comma separated): python3.4 Whether to run untagged builds [true/false]: [false]: Whether to lock Runner to current project [true/false]: [false]: Registering runner... succeeded runner=gWCZZjws Please enter the executor: docker, shell, ssh, kubernetes, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine: docker Please enter the default Docker image (e.g. ruby:2.1): python:3.4 Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
查看 [root@jenkins vagrant]# sudo gitlab-ci-multi-runner list Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml jenkins Executor=shell Token=d790b6db10f7f7d3b8547519818948 URL=http://10.0.0.190/ gitlab-ci Executor=shell Token=ad11a86454c6552424fbf0d6c8b029 URL=http://gitlab.example.com gitlab-ci Executor=docker Token=0304db778d4e040d25234594dbe363 URL=http://gitlab.example.com gitlab-ci Executor=docker Token=b57303fbaf1623a5d8c42723606aad URL=http://gitlab.example.com [root@jenkins vagrant]# sudo gitlab-ci-multi-runner verify Running in system-mode. Verifying runner... is alive runner=ad11a864 Verifying runner... is alive runner=0304db77 Verifying runner... is alive runner=b57303fb
projects 的導入,能夠經過github,url等導入到gitlabgit
在項目根目錄下建立 .gitlab-ci.yml 並配置。 Python 的 tox 測試github
.gitlab-ci.yml stages: - style - test - deploy - release pep8: stage: style script: - pip install tox - tox -e pep8 tags: - python2.7 except: - tags unittest-py27: stage: test script: - pip install tox - tox -e py27 tags: - python2.7 except: - tags unittest-py34: stage: test script: - pip install tox - tox -e py34 tags: - python3.4 except: - tags 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 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
項目根目錄下的集成文件 .gitlab-ci.yml 配置集成和部署的步驟 (pipeline) tags: # 執行環境 - runner except: # 排除,tags不觸發 - tags only: # 只有master更改才觸發 - master stages: # 流程,有哪些步驟 - style - test - dploy - release job name: #job名稱 ,屬於某一個流程
gitlab 能夠 實現代碼倉庫託管,直接拉取倉庫集成測試。這塊比較好,並且天生支持分佈式。web
CI的部署,可是runner公有的有限,仍是得要有本身的測試runner,能夠在本地本身搭建linux gitlab runner ,配置好環境,並註冊,供gitlab CI 測試調度。而後發佈到正式服務器。
gitlab-ci 自己就支持分佈式,能夠再多臺機器上執行runner 供gitlab 調用測試sql
要注意保護 master 分支 ,不能被隨意修改,
在 CI 設置裏有 master protect 選項 和 parallel 檢查設置
只有push-->merge request-->pipline 測試經過 --> commit
docker
.travis.yml # travis集成環境的環境配置文件 https://travis-ci.org/ 一個CI網站 ,開源項目免費,私有項目要錢。shell
language: python env: - TOXENV=py27 - TOXENV=py34 - TOXENV=pep8 - TOXENV=docs install: - pip install tox - pip install coveralls script: - tox after_success: coveralls --verbose
提交觸發後 pipeline 的執行流程,能夠點不一樣job 進行查看執行狀況json
注意要給項目分配 runner
當runner 環境爲shell等非docker 時,要拉取本身搭建的gitlab 倉庫,只須要配置hosts文件便可。
可當用runner 是 docker 時,每次拉取代碼時,docker並不知道宿主機上的host文件,又不可能手動加進去,那樣太麻煩。因此會出現沒法訪問本身的gitlab倉庫。
這時候就須要,搭建DNS解析服務器,讓docker可以解析到倉庫。
配置一個DNS服務器,能讓其餘容器解析到 gitlab.example.com
首先,在gitlab ci服務器上把 gitlab.example.com 從/etc/hosts裏刪除
這時候在gitlab ci服務器上是 ping 不通 gitlab.example.com的。
找一臺新的Linux host,裝好Docker,建立一個dnsmasq的容器,並運行。
docker-dns 服務器搭建 docker-host docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq 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.205.160是本地 gitlab 服務器地址 192.168.205.160 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.205.15
搭建完dns服務器後,要修改成gitlab ci 服務器DNS服務器的ip ---> nameserver 192.168.205.15
[vagrant@ci ~]$ more /etc/resolv.conf # Generated by NetworkManager #nameserver 10.0.2.3 nameserver 192.168.205.15
這時候 docker 就能訪問到gitlab服務器。
docker hub 上傳的鏡像,屬於公開狀態,docker cloud 有要錢,還好能夠搭建本身的docker registry服務器。這樣push pull就方便多了。
這裏將docker registry 服務器安裝在dns同一臺機器上。
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
配置 dns-server
執行
docker exec-it dns-server/bin/sh
添加一條新的記錄
/ # more /etc/dnsmasqhosts
192.168.205.160 gitlab.example.com
192.168.205.15 reqistry.example.com
docker restart dns-server
ci 服務器 測試push 時 報錯 [root@jenkins vagrant]# docker push registry.example.com:5000/flask-demo:V10 The push refers to repository [registry.example.com:5000/flask-demo] Get https://registry.example.com:5000/v2/: http: server gave HTTP response to HTTPS client docker-registry 服務器爲http協議 客戶端設置默認是HTTPS 協議取push 因此要特別更改/etc/docker/daemon.json "insecure-registries":["http://registry.example.com:5000"]
[root@jenkins vagrant]# more /etc/docker/daemon.json { "registry-mirrors": ["https://6qcpzbml.mirror.aliyuncs.com"], "insecure-registries":["http://registry.example.com:5000"] }
查看push到registry的鏡像版本
http://registry.example.com:5000/v2/flask-demo/tags/list
查看push的鏡像 registry
[root@docker-host ~]# ls /opt/registry/docker/registry/v2/repositories/
flask-demo
在測試經過須要將最新的image push 到倉庫
同時 部署容器時,要判斷是否有舊的版本容器須要刪除,而後再run新版本的容器
$CI_CONMMIT_TAG 是gitlab-ci 的環境變量。具體能夠查看幫助文件
一有版本發佈或是提交時會自動測試,管理員檢查合併到master分支後,就會觸發pipeline執行集成構建,build的最新鏡像會被push 到倉庫。
而後配置發佈服務器從倉庫拉取鏡像,刪除舊的版本,從新run新的版本。就完成了一次自動集成部署。