銀狐NetDevOps-GitLab+Nornir3.1完成CI/CD測試+生產(chǎn)環(huán)境自動化流水線

image.png

前言

前面分享很多python內(nèi)容方面,但python僅僅是NetDevOps中比較重要的編程語言伦仍,并不代表其全部获搏,整個(gè)網(wǎng)絡(luò)自動化體系還有方方面面虑粥。比如正規(guī)企業(yè)都有DevOps流程如孝,研發(fā)人員要在開發(fā)環(huán)境提交代碼到Git代碼倉庫,要在測試環(huán)境進(jìn)行代碼集成和測試娩贷,測試正常要將代碼合并到預(yù)發(fā)/生產(chǎn)環(huán)境第晰,并在預(yù)發(fā)/生產(chǎn)環(huán)境進(jìn)行部署。這其中的精髓就是DevOps中的CI/CD彬祖,持續(xù)集成茁瘦,持續(xù)部署。

而NetDevOps在某些場景下也需要這些思想的融入储笑,所以自己又專門用Gitlab和Nornir走了一遍坑甜熔,幫助大家實(shí)踐一下Gitlab+Nornir的CI/CD流水線。本章節(jié)內(nèi)容盡可能做到保姆式教程南蓬,但還是需要有一點(diǎn)點(diǎn)Linux和Dokcer的基礎(chǔ)纺非,不然看起來稍有費(fèi)勁哑了。

1. 基礎(chǔ)環(huán)境準(zhǔn)備

1.1. CentOS 7安裝docker

#使用 root 權(quán)限登錄 Centos。確保 yum 包更新到最新烧颖。
sudo yum update

#卸載舊版本(如果安裝過舊版本的話)
sudo yum remove docker  docker-common docker-selinux docker-engine

#安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

#設(shè)置yum源
sudo yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>

#可以查看所有倉庫中所有docker版本弱左,并選擇特定版本安裝
yum list docker-ce --showduplicates | sort -r

#安裝docker
$ sudo yum install docker-ce  #由于repo中默認(rèn)只開啟stable倉庫,故這里安裝的是最新穩(wěn)定版17.12.0
$ sudo yum install <FQPN>  # 例如:sudo yum install docker-ce-17.12.0.ce

#啟動并加入開機(jī)啟動
$ sudo systemctl start docker
$ sudo systemctl enable docker

#驗(yàn)證安裝是否成功(有client和service兩部分表示docker安裝啟動都成功了)
docker version
Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:58:10 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:56:35 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.6
  GitCommit:        d71fcd7d8303cbf684402823e425e9dd2e99285d
 runc:
  Version:          1.0.0-rc95
  GitCommit:        b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

1.2. 安裝GitLab(最少預(yù)留2G內(nèi)存)

#拉取gitlab鏡像(ce免費(fèi))
docker pull gitlab/gitlab-ce

#運(yùn)行g(shù)itlab-ce容器炕淮,通常會將 GitLab 的配置 (etc) 拆火、 日志 (log) 、數(shù)據(jù) (data)放到容器之外涂圆, 便于日后升級们镜。
mkdir docker/gitlab
....(創(chuàng)建剩余文件夾忽略,最終文件目錄如下所示)
[root@localhost docker]# tree /root/docker/ -L 2
/root/docker/
└── gitlab
    ├── config
    ├── data
    └── logs

#設(shè)置環(huán)境變量
export GITLAB_HOME=$HOME/docker/gitlab

#啟動gitlab(docker)
sudo docker run --detach \\
  --publish 443:443 --publish 80:80 --publish 222:22 \\
  --name gitlab \\
  --restart always \\
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \\
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \\
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \\
  gitlab/gitlab-ce

2. 配置gitlab

2.1. 修改gitlab.rb文件

#默認(rèn)使用docker id生成url润歉,需要改為服務(wù)器IP地址
vim $HOME/gitlab/config/gitlab.rb
external_url '<http://192.168.137.108>'
gitlab_rails['gitlab_ssh_host'] = '<http://192.168.137.108>'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run時(shí)22端口映射的222端口

#重啟容器
docker restart gitlab

#等待一段時(shí)間(可能需要幾分鐘)模狭,查看容器狀態(tài)是**healthy**時(shí)gitlab可使用。
[root@localhost docker]# docker ps
CONTAINER ID   IMAGE              COMMAND             CREATED      STATUS                 PORTS                                                                                                           NAMES
3a79b89a2ad5   gitlab/gitlab-ce   "/assets/wrapper"   3 days ago   Up 5 hours (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp   gitlab

2.2. 登錄gitlab(external_url )

image.png
#默認(rèn)賬號:root
#默認(rèn)密碼:1234567890

#如果默認(rèn)密碼錯(cuò)誤可按如下步驟踩衩,修改GitLab的root密碼:
#進(jìn)入docker
docker exec -it gitlab bash

gitlab-rails console -e production
user = User.where(id: 1).first
user.password="12345678"
user.password_confirmation="12345678"
user.save!

#root密碼修改為12345678嚼鹉,然后進(jìn)行web登錄

2.3. 創(chuàng)建gitlab項(xiàng)目

image.png

創(chuàng)建項(xiàng)目后按照git操作指南和本地代碼(vscode/pycharm)關(guān)聯(lián),git基本操作可自行度娘驱富。

image.png

2.4. 本地代碼git遠(yuǎn)端

#本地代碼(IDE:vscode)git push到遠(yuǎn)端
(py3venv) PS D:\\venv_project\\py3venv\\01-devnet\\cicd_nornir> ls

    目錄: D:\\venv_project\\py3venv\\01-devnet\\cicd_nornir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        2021/6/30     11:41                inventory
-a----         2021/7/5     12:16            224 config.yaml
-a----         2021/7/5     12:16           1198 nornir.log
-a----         2021/7/5     12:16           1019 nornir_config.py
-a----         2021/7/2     12:11              0 README.md
-a----         2021/7/5     14:27           1087 requirements.txt

git add .
git commit -m "add. "
git push

登錄gitlab的web頁面锚赤,查看代碼是否push成功

image.png

2.5. 創(chuàng)建測試環(huán)境代碼,并進(jìn)行遠(yuǎn)程push

創(chuàng)建分支

image.png

繼承之前master代碼

image.png

查看test_branch代碼是否繼承

image.png

2.6. 部署gitlab-runner

  • GitLab提交持續(xù)集成服務(wù)褐鸥,當(dāng)你在項(xiàng)目根目錄中添加 .gitlab-ci.yml 文件线脚,并配置項(xiàng)目的運(yùn)行器( GitLab Runner ),那么后續(xù)的每次提交都會觸發(fā)CI流水線( pipeline )的執(zhí)行叫榕。
  • .gitlab-ci.yml 文件告訴運(yùn)行器需要做哪些事情浑侥,默認(rèn)情況下,流水線有 build 翠霍、test 锭吨、deploy 三個(gè)階段,即 構(gòu)建 寒匙、測試 零如、部署 ,未被使用的階段將會被自動忽略锄弱。
  • 如果一切運(yùn)行正常(沒有非零返回值)考蕾,您將獲得與提交相關(guān)聯(lián)的漂亮綠色復(fù)選標(biāo)記(如下圖所示)。這樣可以在查看代碼之前輕松查看提交是否導(dǎo)致任何測試失敗会宪。
#增加yum源
curl -L <https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh> | sudo bash

#安裝gitlab-runner
yum install gitlab-ci-multi-runner -y

#向GitLab-CI注冊runner
[root@localhost docker]# gitlab-ci-multi-runner register
Running in system-mode.                            

Please enter the gitlab-ci coordinator URL (e.g. <https://gitlab.com/>):
<http://192.168.137.108/>
Please enter the gitlab-ci token for this runner:
hwWzwM_9ujesGffmP4vB
Please enter the gitlab-ci description for this runner:
[localhost.localdomain]: nornir_test_new
Please enter the gitlab-ci tags for this runner (comma separated):
nornir_test_new
Whether to run untagged builds [true/false]:
[false]: 
Whether to lock Runner to current project [true/false]:
[false]: 
Registering runner... succeeded                     runner=hwWzwM_9
Please enter the executor: kubernetes, docker-ssh, shell, ssh, virtualbox, docker-ssh+machine, docker, parallels, docker+machine:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

#gitlab-ci tags表示后續(xù)調(diào)用gitlab runner的名稱肖卧,最好和description保持一致,tags在后期的流水線配置中很重要掸鹅,不能胡寫塞帐。

注冊時(shí)需要提供url和token拦赠,在setting-CI/CD-runner中查看,我們需要分布在測試和生產(chǎn)環(huán)境中創(chuàng)建runners葵姥,tag分別為nornir_test荷鼠、nornir_deploy。注冊完成后榔幸,我們便可以在runner欄下看到注冊成功的runner允乐,其中綠色的表示runner正常:

image.png

2.7. 執(zhí)行GitLab-CI/CD流水線

2.7.1. 配置.gitlab-ci.yml文件

代碼倉庫根目錄下創(chuàng)建.gitlab-ci.yml文件,名稱固定且必須在根目錄下削咆,這個(gè)文件是CI/CD流水線關(guān)鍵牍疏。

image.png

.gitlab-ci.yml文件內(nèi)容如下:

# 該ci pipeline適合的場景
stages:
  - install
  - deploy

job1-test:
  stage: install
  # 所需執(zhí)行的腳本
  only:
    - test_branch
  # 僅test_branch分支執(zhí)行
  script:
    - pip3 install -r requirements.txt --user
  # 指定哪個(gè)ci runner跑該工作
  tags:
    - nornir

job1-master:
  stage: install
  # 所需執(zhí)行的腳本
  only:
    - master
  # 僅master分支執(zhí)行
  script:
    - pip3 install -r requirements.txt --user
  # 指定哪個(gè)ci runner跑該工作
  tags:
    - nornir_deploy

job2-test:
  stage: deploy
  # 所需執(zhí)行的腳本
  only:
    - test_branch
  # 僅test_branch分支執(zhí)行
  script:
    - echo "starting"
    - pip3 freeze
    - python3 nornir_config.py
    - echo "finished"
  # 指定哪個(gè)ci runner跑該工作
  after_script:
  - sleep 5s

  tags:
    - nornir

job2-master:
  stage: deploy
  # 所需執(zhí)行的腳本
  only:
    - master
  # 僅master分支執(zhí)行
  script:
    - python3 nornir_config.py
  # 指定哪個(gè)ci runner跑該工作
  after_script:
  - sleep 5s
  tags:
    - nornir_deploy

CI/CD流水線的核心就是通過這個(gè)yaml文件的編寫,來實(shí)現(xiàn)自動化流程拨齐。

其中不同stage是串行執(zhí)行的鳞陨,比如上面的2個(gè)stage就是先進(jìn)行install內(nèi)容,在進(jìn)行deploy內(nèi)容瞻惋,而每個(gè)stage內(nèi)可以有多個(gè)jobs炊邦,這些內(nèi)容都是并行的,當(dāng)我們從本地把gitlab-ci文件push到gitlab上(或者直接在gitlab的項(xiàng)目內(nèi)創(chuàng)建)熟史,gitlab發(fā)現(xiàn)內(nèi)容有變動會執(zhí)行查看gitlab-ci文件,并進(jìn)行流水線操作窄俏。

2.7.2. 查看流水線內(nèi)容

image.png

可以看到流水線先進(jìn)行install內(nèi)容的操作蹂匹, 在進(jìn)行deploy內(nèi)容的操作。

安裝pip包

image.png

執(zhí)行nornir的python腳本

image.png

2.7.3. 合并分支

測試環(huán)境代碼執(zhí)行正常凹蜈,我們可以把整體代碼和文件合并到master分支限寞,在生產(chǎn)環(huán)境執(zhí)行。

image.png

分支合并請求正常需要上級審批仰坦,測試教程審批給自己就好履植。

image.png

點(diǎn)擊合并,會觸發(fā)生產(chǎn)環(huán)境的流水線

image.png

可看到生產(chǎn)環(huán)境狀態(tài)是passed悄晃,合并的測試環(huán)境分支

image.png

參考文獻(xiàn):
https://meigit.readthedocs.io/en/latest/gitlab_ci_.gitlab-ci.yml_detail.html
https://docs.gitlab.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玫霎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子妈橄,更是在濱河造成了極大的恐慌庶近,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷蚓,死亡現(xiàn)場離奇詭異鼻种,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沙热,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門叉钥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罢缸,“玉大人,你說我怎么就攤上這事投队》憬” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵蛾洛,是天一觀的道長养铸。 經(jīng)常有香客問我,道長轧膘,這世上最難降的妖魔是什么钞螟? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮谎碍,結(jié)果婚禮上鳞滨,老公的妹妹穿的比我還像新娘。我一直安慰自己蟆淀,他們只是感情好拯啦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熔任,像睡著了一般褒链。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疑苔,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天甫匹,我揣著相機(jī)與錄音,去河邊找鬼惦费。 笑死兵迅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薪贫。 我是一名探鬼主播恍箭,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞧省!你這毒婦竟也來了扯夭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鞍匾,失蹤者是張志新(化名)和其女友劉穎勉抓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體候学,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藕筋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隐圾。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伍掀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暇藏,到底是詐尸還是另有隱情蜜笤,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布盐碱,位于F島的核電站把兔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓮顽。R本人自食惡果不足惜县好,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暖混。 院中可真熱鬧缕贡,春花似錦、人聲如沸拣播。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贮配。三九已至谍倦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泪勒,已是汗流浹背剂跟。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酣藻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓鳍置,卻偏偏與公主長得像辽剧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子税产,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容