1. 程式人生 > 其它 >三. 基於Jenkins與Gitlab的CI/CD及DevOps實戰 -2

三. 基於Jenkins與Gitlab的CI/CD及DevOps實戰 -2

基於Jenkins與Gitlab的CI/CD及DevOps實戰

DevOps 介紹:
 OPS部分職責:
  1.通過監控、告警、人工值守等方式保證應用程式的7*24的可用性。
     2.系統選型、基礎環境初始化、web服務高可用架構設計及落地、網路配置、監控系統部署、日誌收集系統部署、鏈路追蹤系統部署、CICD系統部署、運維工具或自動化運維平臺開發及維護等。
     3.監控及告警配置、故障處理、故障報告整理及彙報、故障文件總結、故障覆盤、優化方案及故障跟進等。
     4.資料庫、ES、kafka、redis、zookeeper等中介軟體的叢集部署、監控配置、故障處理、效能優化及維護。
   5.對資源利用率進行統計、提交資源使用匯總清單、提交下財年IT預算等。

   DEV部分職責:
  1.業務架構設計、開發語言及框架選型、中介軟體選型、資料庫表結構設計及資料庫初始化等。
  2.業務程式碼編寫,使用java、python、go等語言,編寫專案中的各服務。
  3.提高程式碼質量,基於監控工具試下鏈路效能分析,對響應慢的服務或頁面進行優化、提高程式碼質量。
  4.APP客戶端相容性(安卓、IOS等),相容IE瀏覽器、手機瀏覽器、各型號手機等。
  5.bug修復及新功能開發,基於監控工具、APP探針、URL監控工具、日誌收集工具等收集、統計並分析bug,並進行修復,在618、雙十一等節假日開發新的功能。


CI/CD 介紹:

持續整合:
  CI-Continuous integration,持續整合是指企業中的多名開發者在開發同一個專案的不同功能程式碼的過程當中,可以頻繁的將程式碼提交到統一的程式碼倉庫併合併到一起、切相互不影響工作的工作模式。
持續部署:
  CD-continuous deployment,持續部署是指基於某種工具或平臺等方式能實現程式碼自動化的構建、打包、測試和部署到測試或生產等環境以實現程式碼的快速迭代更新,持續部署在某種程度上代表了一個開發團隊的更新迭代速率(工作效率)。
持續交付:
  CD-Continuous Delivery,持續交付是能夠以可持續的方式、安全、快速地將所有型別的變更(如新增新功能、配置更改、bug修復)等投入生產或交到使用者手中、即可以被使用者使用(交付是產品價值的一種交付,是產品價值的一種盈利的實現。

jenkins簡介:

是一個開源的持續部署工具,https://www.jenkins.io/zh/。
基於java語言開發,https://www.jenkins.io/zh/doc/book/installing/。
支援MacOS、linux及windows 等系統。
安裝簡單支援rpm/deb包、war包等多種安裝方式。
圖形化的介面,簡單易用、方便維護、執行穩定。
支援master/slave工作模式,分散式構建實現效能橫向擴容。
支援外掛化,可通過外掛支援gitlab、svn、webhook等功能、方便功能擴充套件及二次開發。
支援構建成功或失敗的郵件通知。
支援pipline,實現流水線形式的視覺化程式碼部署流程。
可以結合SonarQube等第三方工具實現程式碼質量檢測並生成視覺化報告。
豐富的使用案例,大量的使用文件及解決方案。

常見的業務環境:

開發環境(Development、dev環境):
  軟體研發工程師(Software Development Engineer)專用於程式碼開發的機器,必須本地辦公PC或公司會給程式設計師分配虛擬機器專用於本人做程式碼開發。
測試環境(Test):
  首次將程式碼合併及構建後進行統一的集中功能與效能等意向的專用測試環境,會存在一些未知的bug(漏洞、功能缺陷)等需要迭代修復,不對使用者開放。
UAT環境(User Acceptance Test):
  使用者接受度測試,即最終的驗收合格測試環境,UAT環境主要用於測試或交付人員進行驗收測試,也不對客戶開放。
灰度環境(preview、pre環境):
  灰度環境,是生產環境的一小部分伺服器,外部使用者可以訪問,主要在此環境對新版本進行小規模釋出與測試,即便有bug或功能缺陷問題也隻影響一小部分使用者。
生產環境:
  正式對使用者開放的業務環境,是經過層層測試的最終相對穩定的程式碼程式,比如我們訪問的www.jd.com主要就是訪問的生產環境。


常見的程式碼部署方式:
開發自己ssh到伺服器上傳:
  最原始的部署方式,效率低而且容易出錯
開發給運維手動上傳:
  運維自己手動部署
運維使用指令碼複製:
  手動批量部署,需要到時候手動執行並驗證
結合web介面一鍵部署:
  自動部署、自動驗證、自動上線

常見的程式碼部署方案:
藍綠部署:
  藍綠部署是指有兩套一樣的業務環境,然後有一套在線上執行一套是離線的,在進行程式碼部署的時候不停止老版本程式碼(完全不影響上一個版本訪問),而是在另外一套離線環境部署新版本然後進行測試,在測試通過後再將使用者請求流量切到新版本,其特點為業務無中斷,升級風險相對較小。
A/B測試:
  A/B測試也是同時執行兩個業務環境,但是藍綠部署完全是兩碼事,A/B 測試是用來測試應用功能表現的方法,例如業務功能可用性、業務受歡迎程度等等,藍綠部署的目的是安全穩定地釋出新版本應用,並在必要時回滾,即和藍綠部署的區別是藍綠部署是一套正式環境環境線上,而A/B測試是兩套環境同事線上並進行(內部團隊競爭)。
滾動釋出:
  滾動釋出一般是分幾批次部署,先取出一個或一部分伺服器從負載均衡下線、然後逐個停止服務,然後逐個執行更新,最後更新完成後、再重新新增到負載均衡使用,周而復始,直到叢集中所有的例項都更新成新版本。
金絲雀/灰度:
  金絲雀釋出也叫灰度釋出,是指從當前版本升級到新版本,能夠實現平滑升級和過渡的一種釋出方式,灰度釋出是增量釋出的一種型別,灰度釋出是在原有版本可用的情況下,同時部署一個新版本應用作為“金絲雀”(小白鼠),測試新版本的效能和表現,以保障整體系統穩定的情況下,儘早發現、調整問題。


Gitlab簡介、安裝、賬戶與許可權管理、專案管理
gitlab下載:
  下載地址:
  https://docs.gitlab.com/ee/install/requirements.html #安裝依賴
  https://packages.gitlab.com/gitlab/gitlab-ce #官方下載地址
  https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ #清華大學映象源

gitlab安裝:
 # dpkg -i gitlab-ce_15.4.3-ce.0_amd64.deb
 # vim /etc/gitlab/gitlab.rb
 # grep -v "#" /etc/gitlab/gitlab.rb | grep -v "^$" #驗證配置檔案
 external_url 'http://192.168.106.200'
 gitlab_rails['smtp_enable'] = true
 gitlab_rails['smtp_address'] = "smtp.qq.com"
 gitlab_rails['smtp_port'] = 465
 gitlab_rails['smtp_user_name'] = "[email protected]"
 gitlab_rails['smtp_password'] = "abcdabcdabcd"
 gitlab_rails['smtp_domain'] = "qq.com"
 gitlab_rails['smtp_authentication'] = :login
 gitlab_rails['smtp_enable_starttls_auto'] = true
 gitlab_rails['smtp_tls'] = true
 gitlab_rails['gitlab_email_from'] = "[email protected]"
 user["git_user_email"] = "[email protected]"
 # gitlab-ctl reconfigure #重新配置服務

瀏覽器登入 http://192.168.106.200/
1.個人-偏好設定-語言-簡體中文  (可不更改)
2.通知-設定郵箱-改成自己郵箱 (預設是[email protected]
3.更改密碼
4.管理員-設定-通用-註冊限制-取消註冊功能

gitlab專案與賬戶許可權:

賬戶許可權分類:
  Guest-訪客,可以建立issue、發表評論,不能讀寫版本庫
  Reporter-Git專案測試人員,可以克隆程式碼,不能提交,QA、PM可以賦予這個許可權
  Developer-Git專案開發人員,可以克隆程式碼、開發、提交、push,RD(Research and Development engineer,研發工程師)可以賦予此許可權
  Master-Git專案管理員,可以建立專案、新增tag、保護分支、新增專案成員、編輯專案,核心RD負責人可以賦予此許可權
  Owner-Git系統管理員即Administrator,可以設定專案訪問許可權、刪除專案、遷移專案、管理組成員,研發組leader可以賦予此許可權
專案許可權分類:
   Private:私有 專案、只有組內成員才能看到
   Internal:內部專案、只有登入的使用者就能看到
   Public:公開專案、所有人都能看到

gitlab基礎管理:
安裝目錄:
 /etc/gitlab #配置檔案目錄
 /run/gitlab #執行pid目錄
 /opt/gitlab #安裝目錄
 /var/opt/gitlab #資料目錄
 /var/log/gitlab #日誌目錄

關閉賬戶註冊
建立group
    group-對應於公司的專案
    user-對應公司的研發人員
    project-對應公司專案的中的服務
建立使用者

建立project

對使用者授權project許可權

測試使用者clone與push許可權
  分支:目前main=之前的master
  git add .  #添加當前目錄下所有變化過的內容到暫存區
  git commit -m "xxx" #將程式碼提交到本地倉庫
  git push #上傳到gitlab伺服器
    (192.168.106.193)
    root@web1:/data/app1#
    git clone http://192.168.106.200/laimiya/app1.git
    vi index.html
    git add .
    git commit -m "add index.html"
    git config --global user.email "[email protected]"
    git config --global user.name "root"
    git push
git #分散式的版本控制系統
gitlab  #基於git的一個有ce版和ee版本的版本控制系統、ce是免費的私有版本控制系統
github  #基於git的公有程式碼倉庫,企業版是付費的


gitlab基礎管理:
# gitlab-rake #資料備份恢復等資料操作
# gitlab-ctl #客戶端命令列操作行
# gitlab-ctl stop #停止gitlab
# gitlab-ctl start #啟動gitlab
# gitlab-ctl restar #重啟gitlab
# gitlab-ctl status #檢視元件執行狀態
# gitlab-ctl tail nginx #檢視某個元件的日誌

gitlab工作流程:
工作區:clone到本地辦公PC的程式碼或者開發自己編寫的程式碼檔案所在的目錄,通常是編寫的程式碼所在的目錄名稱。
暫存區:用於儲存在工作區中對程式碼進行修改後的檔案所儲存的地方,使用git add命令新增。
本地倉庫:用於提交儲存在工作區和暫存區中改過的檔案地方,使用git commit 命令提交。
遠端倉庫:多個開發共同協作提交程式碼的倉庫,即gitlab伺服器。

gitlab常用命令:
    git客戶端常用基礎命令:
  git clone #克隆程式碼到本地
  git push #提交程式碼到伺服器
  git pull #更新原生代碼
  git add index.html、abc/、 . #新增指定檔案、目錄或當前目錄下所有資料到暫存區
  git commit -m “xx“ #提交檔案到工作區
  git status #檢視工作區的狀態
  git reset --hard HEAD^^ #git版本回滾, HEAD為當前版本,加一個^為上一個,^^為上上一個版本
  git reflog # #獲取每次提交的ID,可以使用--hard根據提交的ID進行版本回退
  git reset --hard 5ae4b06 #回退到指定id的版本
  git config --global user.name “NAME” #設定全域性使用者名稱
  git config --global user.email [email protected] #設定全域性郵箱
  git config --global --list #列出使用者全域性設定
  # git branch #檢視當前所處的分支
  #git checkout -b develop #建立並切換到一個新分支
  #git checkout develop #切換分支
  git log #檢視操作日誌
  vim .gitignore #定義忽略檔案上傳至gitlab

gitlab資料備份與恢復:
備份:
 root@gitlab:~# gitlab-ctl stop unicorn sidekiq
 root@gitlab:~# gitlab-rake gitlab:backup:create #在任意目錄即可備份當前gitlab資料
 /var/opt/gitlab/nginx/conf #nginx配置檔案
 /etc/gitlab/gitlab.rb #gitlab配置檔案
 /etc/gitlab/gitlab-secrets.json #key檔案
 root@gitlab:~# gitlab-ctl start unicorn sidekiq
刪除或誤提交資料
恢復:
 檢視要恢復的檔案:
 root@gitlab:~# ll /var/opt/gitlab/backups/ # 檢視Gitlab資料備份目錄
 -rw------- 1 git git 399360 Oct 24 10:04 1666577054_2022_10_24_15.4.3_gitlab_backup.tar
 root@gitlab:~# gitlab-ctl stop unicorn sidekiq #停止服務
 root@gitlab:~# gitlab-rake gitlab:backup:restore BACKUP=1666577054_2022_10_24_15.4.3 #unix時間戳、備份年月日、版本號
 root@gitlab:~# gitlab-ctl start unicorn sidekiq #啟動服務

gitlab分支合併:(略)
建立使用者user1
建立使用者user2
使用user1建立develop分支並進行程式碼提交
使用user1申請分支develop合併至main分支,並指派給user2
使用user2批准程式碼合併
驗證程式碼合併


Jenkins功能、特性、架構體系及工作機制
jenkins簡介:
    Jenkins的前身是Hudson,Hudson是基於java語言開發。
    Hudson由Sun公司在2004年立項,第一個版本於2005年釋出。
    2007年開始Hudson逐漸取代早期其他的開源構建工具,成為主流工具。
    2009年4月20日,Oracle宣佈將以每股9.50美元,總計74億美金收購sun。
    Oracle在2010年12月宣告擁有Hudson名稱並申請商標的擁有權利。
    2011年1月11日,原Hudson主要專案維護者要求投票將專案名稱從“Hudson”改為“Jenkins”,並在2011年1月29日,該建議得到社群投票的批准後建立了Jenkins專案。
    後Jenkins專案得到了全球開發愛好者的擁護並快速迭代,2013年後就全面超越了Hudson專案。
jenkins功能特點:
    安裝簡單
    強大的圖形功能
    支援構建Email通知
    支援分散式構建
    外掛化便於二次開發及功能擴充套件
    支援piplinie流水線
Jenkins分散式構建:
    jenkins master節點負責job的建立、管理與觸發。
    job在執行時分配給特定的jenkins slave節點執行
    job執行成功後由jenkins master傳送郵件通知。
    基於jenkins分散式架構可以快速橫向擴容jenkins的構建併發能力。
    
Jenkins安裝、外掛管理、作業型別及各自的特性
  Jenkins安裝:
安裝依賴:
 https://www.jenkins.io/zh/doc/book/installing/
 CPU、記憶體、磁碟

安裝Java 8、在2.361.1及以上版本開始要求Java 11
 root@jenkins:~# apt update && apt install openjdk-11-jdk

java war包:
二進位制安裝包:
 # dpkg -i jenkins_2.361.2_all.deb && systemctl stop jenkins
 # vim /etc/default/jenkins
 JENKINS_USER=root
 JENKINS_GROUP=root
 root@jenkins:~# vim /lib/systemd/system/jenkins.service
 User=root
 Group=root
 JAVA_ARGS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true" #關閉跨站請求偽造保護(CSRF)保護
 # systemctl daemon-reload && systemctl restart jenkins.service

http://192.168.106.190:8080/
1.安裝推薦外掛
2.建立管理員賬號  jenkinsadmin
3.重啟jenkins 登入

Jenkins外掛管理:
線上安裝外掛:
 Blue Ocean #強大的pipliine UI管理介面
 GitLab #支援gitlab遠端觸發jenkins任務構建
解除安裝外掛:
離線安裝外掛:
 http://updates.jenkins-ci.org/download/plugins/ #外掛下載地址

Jenkins 更換國內外掛源
方法一:
    Jenkins > Manage Jenkins > Plugin Manager、點選Available並等待頁面完全載入完成、這樣做是為了把jenkins官方的外掛列表下載到本地、接著修改地址檔案、替換為國內外掛地址
1.替換國內外掛下載地址
    進入外掛檔案目錄
    cd /var/lib/jenkins/updates/
    cp default.json  default.json.bak
    #sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
    #sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
    sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json
2.替換國內外掛更新地址
替換外掛更新地址、將國外官方地址替換為國內清華大學jenkins外掛地址
Jenkins > Manage Jenkins > Plugin Manager、點選Advanced頁面替換Update Site的url、並submit
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
重啟jenkins

方法二:
    1.在jenkins伺服器 配置hosts
     updates.jenkins.io   Nginx所在機器的ip
    2.Nginx機器做rewrite  updates.jenkins.io  跳轉到mirrors.tuna.tsinghua.edu.cn

jenkins 郵件通知配置
    Jenkins—系統管理—系統設定:
        Jenkins Location
            系統管理員郵件地址
        郵件通知(最下面)    
            
jenkins 任務型別:
構建一個自由風格的軟體專案:
    自定義任務流程
流水線:
    支援pipline流水線語法