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

image.png

前言

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

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

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

1.1. CentOS 7安裝docker

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

#卸載舊版本(如果安裝過(guò)舊版本的話)
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>

#可以查看所有倉(cāng)庫(kù)中所有docker版本,并選擇特定版本安裝
yum list docker-ce --showduplicates | sort -r

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

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

#驗(yàn)證安裝是否成功(有client和service兩部分表示docker安裝啟動(dòng)都成功了)
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容器,通常會(huì)將 GitLab 的配置 (etc) 、 日志 (log) 、數(shù)據(jù) (data)放到容器之外, 便于日后升級(jí)。
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

#啟動(dòng)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)賬號(hào):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頁(yè)面,查看代碼是否push成功

image.png

2.5. 創(chuàng)建測(cè)試環(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ù)的每次提交都會(huì)觸發(fā)CI流水線( pipeline )的執(zhí)行。
  • .gitlab-ci.yml 文件告訴運(yùn)行器需要做哪些事情,默認(rèn)情況下,流水線有 build 、testdeploy 三個(gè)階段,即 構(gòu)建 、測(cè)試部署 ,未被使用的階段將會(huì)被自動(dòng)忽略。
  • 如果一切運(yùn)行正常(沒(méi)有非零返回值),您將獲得與提交相關(guān)聯(lián)的漂亮綠色復(fù)選標(biāo)記(如下圖所示)。這樣可以在查看代碼之前輕松查看提交是否導(dǎo)致任何測(cè)試失敗。
#增加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注冊(cè)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在后期的流水線配置中很重要,不能胡寫。

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

image.png

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

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

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

image.png

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

# 該ci pipeline適合的場(chǎng)景
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流水線的核心就是通過(guò)這個(gè)yaml文件的編寫,來(lái)實(shí)現(xiàn)自動(dòng)化流程。

其中不同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)目?jī)?nèi)創(chuàng)建),gitlab發(fā)現(xiàn)內(nèi)容有變動(dòng)會(huì)執(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. 合并分支

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

image.png

分支合并請(qǐng)求正常需要上級(jí)審批,測(cè)試教程審批給自己就好。

image.png

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

image.png

可看到生產(chǎn)環(huán)境狀態(tài)是passed,合并的測(cè)試環(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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容