基于 Python 項(xiàng)目的 GitLab-CI 演示

1.創(chuàng)建一個(gè)python項(xiàng)目
使用github上開源的一個(gè)python的demo項(xiàng)目,地址為:https://github.com/imooc-course/docker-cloud-flask-demo
打開自己的gitlab,點(diǎn)擊New project,把項(xiàng)目導(dǎo)入。

2.手動(dòng)部署
把項(xiàng)目clone到本地,可以先測(cè)試一下手動(dòng)部署,build鏡像之后,然后啟動(dòng)
???[/Users/mac/PycharmProjects]?git?clone?http://gitlab.example.com/root/flask-demo.git
Cloning?into?'flask-demo'...
Username?for?'http://gitlab.example.com':?root
Password?for?'http://[email protected]':
remote:?Enumerating?objects:?111,?done.
remote:?Counting?objects:?100%?(111/111),?done.
remote:?Compressing?objects:?100%?(83/83),?done.
remote:?Total?111?(delta?29),?reused?103?(delta?25),?pack-reused?0
Receiving?objects:?100%?(111/111),?33.19?KiB?|?4.74?MiB/s,?done.
Resolving?deltas:?100%?(29/29),?done.
???[/Users/mac/PycharmProjects]?cd?flask-demo
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?ll
total?64
-rw-r--r--??1?mac??staff???220B??6?14?00:37?CONTRIBUTING.md
-rw-r--r--??1?mac??staff???252B??6?14?00:37?Dockerfile
-rw-r--r--??1?mac??staff???1.1K??6?14?00:37?LICENSE
-rw-r--r--??1?mac??staff???966B??6?14?00:37?README.md
drwxr-xr-x??5?mac??staff???160B??6?14?00:37?doc
-rw-r--r--??1?mac??staff???1.0K??6?14?00:37?manage.py
drwxr-xr-x??6?mac??staff???192B??6?14?00:37?migrations
-rw-r--r--??1?mac??staff???435B??6?14?00:37?requirements.txt
drwxr-xr-x??4?mac??staff???128B??6?14?00:37?scripts
drwxr-xr-x??5?mac??staff???160B??6?14?00:37?skeleton
-rw-r--r--??1?mac??staff????65B??6?14?00:37?test-requirements.txt
drwxr-xr-x??7?mac??staff???224B??6?14?00:37?tests
-rw-r--r--??1?mac??staff???1.5K??6?14?00:37?tox.ini
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?docker?build?-t?flask-demo?.
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?docker?run?-d?-p?5000:5000?flask-demo
3a40a2b60d345bb754e1c43b01ad2da9afd9ff81f648ab51f59c960dee75b68d
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?docker?ps?|grep?flask
3a40a2b60d34????????flask-demo??????????????????????"sh?scripts/dev.sh"??????11?seconds?ago??????Up?9?seconds???????????0.0.0.0:5000->5000/tcp??????????????????????????????distracted_babbage
瀏覽器輸入ip+prot
3.使用gitlab的CI/CD中pipelines進(jìn)行部署
整個(gè)持續(xù)集成和持續(xù)部署的流程如下:
1)創(chuàng)建該項(xiàng)目所需要的runner
有的時(shí)候我們不同的項(xiàng)目常常需要不同的包,為了避免我們的gitlab-ci服務(wù)器上的環(huán)境比較雜亂,因此我們可以使用docker來(lái)當(dāng)作runner的executor,因此我們給該項(xiàng)目創(chuàng)建了三個(gè)runner,需要用到python2和python3的環(huán)境,因?yàn)槲覀冏?cè)兩個(gè)不同tags的runner,另外還創(chuàng)建了一個(gè)tags為demo的shell的runner
???[/Users/mac]?gitlab-runner?register
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61621?revision=21cb397c?version=13.0.1
WARNING:?Running?in?user-mode.
WARNING:?Use?sudo?for?system-mode:
WARNING:?$?sudo?gitlab-runner...
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:
6-uZ1ndZ2NRGp8_TghnL
Please?enter?the?gitlab-ci?description?for?this?runner:
[Double-dong.local]:?gitlab-ci
Please?enter?the?gitlab-ci?tags?for?this?runner?(comma?separated):
python3.4
Registering?runner...?succeeded?????????????????????runner=6-uZ1ndZ
Please?enter?the?executor:?docker+machine,?kubernetes,?ssh,?virtualbox,?docker-ssh,?parallels,?shell,?docker-ssh+machine,?custom,?docker:
docker
Please?enter?the?default?Docker?image?(e.g.?ruby:2.6):
python:3.4
Runner?registered?successfully.?Feel?free?to?start?it,?but?if?it's?running?already?the?config?should?be?automatically?reloaded!
???[/Users/mac]?gitlab-runner?verify
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61635?revision=21cb397c?version=13.0.1
WARNING:?Running?in?user-mode.
WARNING:?Use?sudo?for?system-mode:
WARNING:?$?sudo?gitlab-runner...
Verifying?runner...?is?alive????????????????????????runner=NkYLeMbb
???[/Users/mac]?gitlab-runner?list
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61640?revision=21cb397c?version=13.0.1
Listing?configured?runners??????????????????????????ConfigFile=/Users/mac/.gitlab-runner/config.toml
gitlab-ci???????????????????????????????????????????Executor=docker?Token=NkYLeMbbpJ2NyuwxaVKG?URL=http://gitlab.example.com/
???[/Users/mac]?gitlab-runner?register
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61621?revision=21cb397c?version=13.0.1
WARNING:?Running?in?user-mode.
WARNING:?Use?sudo?for?system-mode:
WARNING:?$?sudo?gitlab-runner...
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:
6-uZ1ndZ2NRGp8_TghnL
Please?enter?the?gitlab-ci?description?for?this?runner:
[Double-dong.local]:?gitlab-ci
Please?enter?the?gitlab-ci?tags?for?this?runner?(comma?separated):
python2.7
Registering?runner...?succeeded?????????????????????runner=6-uZ1ndZ
Please?enter?the?executor:?docker+machine,?kubernetes,?ssh,?virtualbox,?docker-ssh,?parallels,?shell,?docker-ssh+machine,?custom,?docker:
docker
Please?enter?the?default?Docker?image?(e.g.?ruby:2.6):
python:2.7
Runner?registered?successfully.?Feel?free?to?start?it,?but?if?it's?running?already?the?config?should?be?automatically?reloaded!
???[/Users/mac]?gitlab-runner?verify
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61635?revision=21cb397c?version=13.0.1
WARNING:?Running?in?user-mode.
WARNING:?Use?sudo?for?system-mode:
WARNING:?$?sudo?gitlab-runner...
Verifying?runner...?is?alive????????????????????????runner=NkYLeMbb
Verifying?runner...?is?alive????????????????????????runner=zTq8vB36
???[/Users/mac]?gitlab-runner?list
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61640?revision=21cb397c?version=13.0.1
Listing?configured?runners??????????????????????????ConfigFile=/Users/mac/.gitlab-runner/config.toml
gitlab-ci???????????????????????????????????????????Executor=docker?Token=zTq8vB36pwz52sHLFygP?URL=http://gitlab.example.com/
gitlab-ci???????????????????????????????????????????Executor=docker?Token=NkYLeMbbpJ2NyuwxaVKG?URL=http://gitlab.example.com/
???[/Users/mac/flask-demo]?git:(master)?gitlab-runner?register
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=62471?revision=21cb397c?version=13.0.1
WARNING:?Running?in?user-mode.
WARNING:?Use?sudo?for?system-mode:
WARNING:?$?sudo?gitlab-runner...
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:
6-uZ1ndZ2NRGp8_TghnL
Please?enter?the?gitlab-ci?description?for?this?runner:
[Double-dong.local]:?gitlab-ci
Please?enter?the?gitlab-ci?tags?for?this?runner?(comma?separated):
demo,test
Registering?runner...?succeeded?????????????????????runner=6-uZ1ndZ
Please?enter?the?executor:?docker+machine,?docker-ssh+machine,?custom,?docker-ssh,?parallels,?virtualbox,?docker,?shell,?ssh,?kubernetes:
shell
Runner?registered?successfully.?Feel?free?to?start?it,?but?if?it's?running?already?the?config?should?be?automatically?reloaded!
???[/Users/mac]?gitlab-runner?verify
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61635?revision=21cb397c?version=13.0.1
WARNING:?Running?in?user-mode.
WARNING:?Use?sudo?for?system-mode:
WARNING:?$?sudo?gitlab-runner...
Verifying?runner...?is?alive????????????????????????runner=NkYLeMbb
Verifying?runner...?is?alive????????????????????????runner=zTq8vB36
Verifying?runner...?is?alive????????????????????????runner=T7QSUfHs
???[/Users/mac]?gitlab-runner?list
Runtime?platform????????????????????????????????????arch=amd64?os=darwin?pid=61640?revision=21cb397c?version=13.0.1
Listing?configured?runners??????????????????????????ConfigFile=/Users/mac/.gitlab-runner/config.toml
gitlab-ci???????????????????????????????????????????Executor=docker?Token=zTq8vB36pwz52sHLFygP?URL=http://gitlab.example.com/
gitlab-ci???????????????????????????????????????????Executor=docker?Token=NkYLeMbbpJ2NyuwxaVKG?URL=http://gitlab.example.com/
gitlab-ci???????????????????????????????????????????Executor=shell?Token=T7QSUfHsnLkgGs8HFbY4?URL=http://gitlab.example.com/
2)驗(yàn)證runner的狀態(tài)



可以看到兩個(gè)三個(gè)不同tags的runners已經(jīng)創(chuàng)建好了
3)創(chuàng)建.gitlab-ci.yml
在該項(xiàng)目中添加.gitlab-ci.yml文件,使用pipelines進(jìn)行流水線部署
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?vim?.gitlab-ci.yml
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
4)ci階段演示
在上面我們只添加了style和test,代碼風(fēng)格和單元測(cè)試兩個(gè)階段,我們只需要把改文件提交到master上則會(huì)自動(dòng)觸發(fā)pipelines的動(dòng)作中定義的兩個(gè)階段
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)???git?add?.
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)???git?commit?-m?"add?.gitlan-ci.yml"
[master?19652a3]?add?.gitlan-ci.yml
?1?file?changed,?8?insertions(+)
???[/Users/mac/flask-demo]?git:(master)?git?push?-u?origin?master
Enumerating?objects:?5,?done.
Counting?objects:?100%?(5/5),?done.
Delta?compression?using?up?to?8?threads
Compressing?objects:?100%?(3/3),?done.
Writing?objects:?100%?(3/3),?334?bytes?|?334.00?KiB/s,?done.
Total?3?(delta?2),?reused?0?(delta?0)
To?http://gitlab.example.com/root/flask-demo.git
???000dd08..19652a3??master?->?master
Branch?'master'?set?up?to?track?remote?branch?'master'?from?'origin'.
打開gitlab-ci服務(wù)器,可以看到
打開CI/CD里面的pipelines可以看到每一個(gè)job的運(yùn)行情況和日志,當(dāng)我們看到日志中有如下情況時(shí),則證明python2.7的運(yùn)行環(huán)境已經(jīng)準(zhǔn)備好了

可以在gitlab-ci服務(wù)器上看到多出來(lái)兩個(gè)容器
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?docker?ps?|grep?runner
CONTAINER?ID????????IMAGE???????????????????????????COMMAND??????????????????CREATED?????????????STATUS?????????????????PORTS???????????????????????????????????????????????NAMES
1899fa281a09????????68e7be49c28c????????????????????"sh?-c?'if?[?-x?/usr…"???4?minutes?ago???????Up?4?minutes???????????????????????????????????????????????????????????????runner-ztq8vb36-project-1-concurrent-0-73db69ec5150d95e-build-4
6243008edbc4????????8c62b065252f????????????????????"sh?-c?'if?[?-x?/usr…"???4?minutes?ago???????Up?4?minutes???????????????????????????????????????????????????????????????runner-nkylembb-project-1-concurrent-0-441aa6544001fab6-build-4
等待所有階段都完成之后可以看到passed的狀態(tài),則證明整個(gè)ci階段是通過(guò)的
4 完整的CI/CD流程

我們?cè)?gitlab-ci.yml中增加一個(gè)delpoy階段來(lái)進(jìn)行項(xiàng)目的部署,但是我們?yōu)榱藢?duì)master進(jìn)行保護(hù),必須要?jiǎng)?chuàng)建一個(gè)dev或者test分支,只有當(dāng)分支通過(guò)了代碼檢查和單元測(cè)試才能合并到master進(jìn)行部署,因此我們需要進(jìn)行如下設(shè)置
master分支保護(hù)
不允許任何人push
分支合并要求
必須pipeline成功通過(guò)之后才能合并
創(chuàng)建一個(gè)dev分支

本地拉取分支
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?git?fetch
From?http://gitlab.example.com/root/flask-demo
?*?[new?branch]??????dev????????->?origin/dev
???[/Users/mac/PycharmProjects/flask-demo]?git:(master)?git?checkout?dev
Branch?'dev'?set?up?to?track?remote?branch?'dev'?from?'origin'.
Switched?to?a?new?branch?'dev'
???[/Users/mac/PycharmProjects/flask-demo]?git:(dev)?ll?-a
total?96
drwxr-xr-x??20?mac??staff???640B??6?14?15:53?.
drwxr-xr-x+?69?mac??staff???2.2K??6?14?17:28?..
-rw-r--r--???1?mac??staff???252B??6?14?15:19?.coveragerc
drwxr-xr-x??14?mac??staff???448B??6?14?17:28?.git
-rw-r--r--???1?mac??staff???1.0K??6?14?15:19?.gitignore
-rw-r--r--???1?mac??staff???379B??6?14?15:53?.gitlab-ci.yml
-rw-r--r--???1?mac??staff???196B??6?14?15:19?.travis.yml
-rw-r--r--???1?mac??staff???220B??6?14?15:19?CONTRIBUTING.md
-rw-r--r--???1?mac??staff???252B??6?14?15:19?Dockerfile
-rw-r--r--???1?mac??staff???1.1K??6?14?15:19?LICENSE
-rw-r--r--???1?mac??staff???966B??6?14?15:19?README.md
drwxr-xr-x???5?mac??staff???160B??6?14?15:19?doc
-rw-r--r--???1?mac??staff???1.0K??6?14?15:19?manage.py
drwxr-xr-x???6?mac??staff???192B??6?14?15:19?migrations
-rw-r--r--???1?mac??staff???435B??6?14?15:19?requirements.txt
drwxr-xr-x???4?mac??staff???128B??6?14?15:19?scripts
drwxr-xr-x???5?mac??staff???160B??6?14?15:19?skeleton
-rw-r--r--???1?mac??staff????65B??6?14?15:19?test-requirements.txt
drwxr-xr-x???7?mac??staff???224B??6?14?15:19?tests
-rw-r--r--???1?mac??staff???1.5K??6?14?15:19?tox.ini
創(chuàng)建一個(gè)私有的registry倉(cāng)庫(kù)
使用docker啟動(dòng)
???[/Users/mac/PycharmProjects/flask-demo]?git:(dev)???docker?run?-d?-v?~/registry:/var/lib/registry?-p?5001:5000?--restart=always?--name?registry?registry:2
???[/Users/mac/flask-demo]?git:(dev)???docker?ps?|grep?registry
5e97715c2f59????????registry:2??????????????????????"/entrypoint.sh?/etc…"???8?minutes?ago???????Up?About?a?minute??????????????????????0.0.0.0:5001->5000/tcp??????????????????????????????registry
##添加本地host解析
???[/Users/mac/flask-demo]?git:(dev)???sudo?vim?/etc/hosts
##
#?Host?Database
#
#?localhost?is?used?to?configure?the?loopback?interface
#?when?the?system?is?booting.??Do?not?change?this?entry.
##
127.0.0.1???????localhost
255.255.255.255?broadcasthost
::1?????????????localhost
192.168.0.160???gitlab.example.com?registry.example.com
修改docker配置文件,然后重啟

測(cè)試
???[/Users/mac/flask-demo]?git:(dev)???docker?tag?busybox?registry.example.com:5001/busybox
???[/Users/mac/flask-demo]?git:(dev)???docker?push?registry.example.com:5001/busybox
The?push?refers?to?repository?[registry.example.com:5001/busybox]
1be74353c3d0:?Pushed
latest:?digest:?sha256:fd4a8673d0344c3a7f427fe4440d4b8dfd4fa59cfabbd9098f9eb0cb4ba905d0?size:?527
修改dev中的.gitlab-ci.yml
???[/Users/mac/PycharmProjects/flask-demo]?git:(dev)?vim?.gitlab-ci.yml
stages:
????-?style
????-?test
????-?delpoy
????-?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
提交dev分支代碼
???[/Users/mac/flask-demo]?git:(dev)???git?add?.
???[/Users/mac/flask-demo]?git:(dev)???git?commit?-m?"change?.gitlab-ci.yml"
???[/Users/mac/flask-demo]?git:(dev)?git?push?origin?dev
Enumerating?objects:?7,?done.
Counting?objects:?100%?(7/7),?done.
Delta?compression?using?up?to?8?threads
Compressing?objects:?100%?(4/4),?done.
Writing?objects:?100%?(4/4),?794?bytes?|?794.00?KiB/s,?done.
Total?4?(delta?2),?reused?0?(delta?0)
remote:
remote:?To?create?a?merge?request?for?dev,?visit:
remote:???http://gitlab.example.com/root/flask-demo/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To?http://gitlab.example.com/root/flask-demo.git
???19652a3..ae05ae2??dev?->?dev
5.CI實(shí)現(xiàn)版本發(fā)布
在.gitlab-ci.yml中加入release階段,只需要給測(cè)試環(huán)境部署沒有問(wèn)題的master分支打上一個(gè)版本號(hào)tags,就會(huì)重新構(gòu)建鏡像,然后推送到私有倉(cāng)庫(kù),最終的一個(gè)交付物就是一個(gè)穩(wěn)定的鏡像版本,實(shí)現(xiàn)了版本發(fā)布
???[/Users/mac/PycharmProjects/flask-demo]?git:(dev)?vim?.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-images-release:
????stage:?release
????script:?
??????-?docker?build?-t?registry.example.com:5001/flask-demo:$CI_COMMIT_TAG?.
??????-?docker?push?registry.example.com:5001/flask-demo:$CI_COMMIT_TAG
????tags:?
??????-?demo
????only:
??????-?tags
本文來(lái)自作者:Double冬,運(yùn)維開發(fā)故事,愛生活,愛運(yùn)維?
github:https://github.com/orgs/sunsharing-note/dashboard
長(zhǎng)按掃碼添加“Python小助手”
▼點(diǎn)擊成為社區(qū)會(huì)員? ?喜歡就點(diǎn)個(gè)在看吧
