目錄
概述
為什么持續(xù)集成和發(fā)布可以提高效率
如何實現(xiàn)
1、在linux服務器安裝部署代碼倉庫
2、安裝jenkins
使用shell腳本實現(xiàn)CICD
使用pipeline實現(xiàn)CICD
使用Blue Ocean實現(xiàn)CICD
概述
持續(xù)集成(Continuous Integration,CI)和持續(xù)發(fā)布(Continuous Delivery,CD,又稱持續(xù)交付)是經常放在一起提及的兩個概念,專有詞組CI/CD Pipeline 用來描述他們同時存在的持續(xù)集成與發(fā)布自動化管線。
持續(xù)集成是一種編程實踐,它讓開發(fā)團隊通過實現(xiàn)對代碼一系列小的改動,高頻率地提交到版本管理源。現(xiàn)代程序需要依賴大量平臺與工具鏈,需要一種行之有效的方式去反復確認每個改動的正確性。持續(xù)集成在技術上的目標是建立一個自動化、工序穩(wěn)定一致的工作飾程。這種流程包括編譯代碼、打包編譯輸出,以及測試最終生成的結果。這種穩(wěn)定一致并可以反復執(zhí)行的流程,讓開發(fā)人員可以更加頻繁地提交改動,從而提升合作效率和代碼質量。通過持續(xù)集成,團隊可以快速的從一個功能到另一個功能,簡而言之,敏捷軟件開發(fā)很大一部分都要歸功于持續(xù)集成。
持續(xù)發(fā)布是在持續(xù)集成之后的一系列動作。持續(xù)發(fā)布自動化交付生成的產品到各個目標環(huán)境,如測試環(huán)境、審查環(huán)境和生產環(huán)境等,以用于不同的目的。除了生產環(huán)境外,多數(shù)的團隊都會面對各種不同的環(huán)境,如開發(fā)人員使用的開發(fā)環(huán)境、測試人員使用的測試環(huán)境。持續(xù)發(fā)布可以保證各種修改以一種穩(wěn)定、符合預期的方式交付到這些環(huán)境上。在發(fā)布的過程中,除了把持續(xù)集成的最終產物復制到目標環(huán)境外,持續(xù)交付通常還會跟外部的Web API、數(shù)據(jù)庫和其他服務通信,讓新的改動最終在目標環(huán)境生效。
為什么持續(xù)集成和發(fā)布可以提高效率
持續(xù)集成與發(fā)布有一套與之相伴的版本管理實踐來指導團隊之間的合作。而通過加入大量的自動化流程,持續(xù)集成與發(fā)布極大地減少了試錯的成本和人為的錯誤。
1.更加高效的合作模式:持續(xù)集成作為一種實踐,依賴于對工作流程的管理和自動化。當使用持續(xù)集成時,開發(fā)人員高頻率地提交他們的代碼到版本管理源中,有些團隊甚至會對提交的頻率作具體的要求,如每天一次。這種要求的原因是比起一大段需要數(shù)天甚至一個月寫成的代碼,一段段小規(guī)模的代碼改動更容易定位質量問題。另外,通常代碼是對整個團隊的人開放的,如果開發(fā)人員的提交周期非常短,那么就可以避免出現(xiàn)多人共同編輯同一段代碼,最終產生沖突的情況。當用戶實現(xiàn)持續(xù)集成時,通常用戶會從版本管理源的配置開始。雖然用戶高頻率地提交代碼,但是一個新特性或者一段對錯誤的修復往往由多次代碼提交組成,這些提交代碼的時間跨度有長有短。團隊需要通過版本管理和持續(xù)集成的結果來選擇和判斷哪些改動可以更新到生產環(huán)境。
? ? ? ? 能對多個并行開發(fā)的特性實施有效管理的其中一種方式是版本管理系統(tǒng)中的分支管理。分支策略有很多種,其中之一被稱為Git流程,它定義了一系列基于源碼分支的合作流程,如新的代碼應該放在什么分支,如何命名,如何合并入其他主干分支,如開發(fā)分支、測試分支和最終生產分支。對于需要長時間開發(fā)的特性,也會使用專門的副主干分支,用于其他更細小分支的并入。當一個新特性完整之后,這個新特性代表的分支將會被合并入主干分支。這種工作方式最大的挑戰(zhàn)是當大量特性在并行開發(fā)的時候,如何管理這些分支的合并。
2.減少試錯成本:在持續(xù)集成與發(fā)布的概念出現(xiàn)之前,對于代碼的改動,開發(fā)人員需要自行把編譯結果進行一系列的編譯打包操作,在業(yè)內缺乏統(tǒng)一的指導思想去優(yōu)化整體的流程。這些冗長的重復性勞動極大地打擊了開發(fā)人員的積極性,開發(fā)人員從而傾向于一次性提交大量的代碼,以減少測試和部署的頻率。由于測試的頻率降低了,一個錯誤往往要在更長的開發(fā)周期后才會被發(fā)現(xiàn),這種“一次性提交大量的代碼”的偏好反而又增加了開發(fā)人員的其他時間成本,被稱之為試錯成本。
3.減少人為錯誤:對于大量重復性的工作,在一些流程嚴謹?shù)墓纠?,也許會通過詳細的文檔來描述每一個步驟應該如何正確地執(zhí)行。但是這遠遠無法減少人為的錯誤。正如那句計算機領域的諺語“如果一個人工操作的步驟存在犯錯的可能,那么它必然會有犯錯的一天”。減少人為犯錯的空間,與盡可能自動化一切是兩個在工程領域相互關聯(lián)、相互促進的主題。
????????持續(xù)發(fā)布與集成,通過腳本和配置把所有的流程都完全自動化,最大限度地減少人為犯錯的空間。而且由于整個流程穩(wěn)定、可重復,對于流程或者具體腳本中出現(xiàn)的錯誤,用戶都可以輕易對其進行改進和測試,而不會出現(xiàn)人們“隨機犯錯”的情況。
如何實現(xiàn)
1、在linux服務器安裝部署代碼倉庫
持續(xù)集成需要一個代碼存儲庫,即需要版本控制軟件來保障代碼的可維護性,同時作為構建過程的素材庫,Gitlab是依賴于Git的遠程代碼倉庫,類似于GitHub、Gitee,不同的是GitHub、Gitee的公網上代碼倉庫, Gitlab是可以私有化部署的免費遠程代碼倉庫,官網:https://about.gitlab.com/
1、準備服務器
10.0.0.7 gitlab
2、下載安裝包
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-13.0.3-ce.0.el7.x86_64.rpm
3、安裝GitLab
# 安裝依賴包
[root@gitlab /opt]# yum install -y curl policycoreutils-python openssh-server perl
# 關閉防火墻
[root@gitlab /opt]# systemctl disable --now firewalld
# 關閉selinux
[root@gitlab /opt]# sed -i 's#enforcing#disabled#g' /etc/sysconfig/selinux
# 臨時關閉
[root@gitlab /opt]# setenforce 0
# 安裝
[root@gitlab /opt]# yum install gitlab-ce-13.0.3-ce.0.el7.x86_64.rpm
# 修改配置文件
[root@sean ~]# vim /etc/gitlab/gitlab.rb
external_url 'http://10.0.0.7'
nginx['listen_port'] = 80
# 刷新配置(默認啟動)
gitlab-ctl reconfigure
?安裝后訪問gitlab私庫http://10.0.0.7/,創(chuàng)建用戶組、用戶及項目,其中組內成員有如下幾種權限
1.Guest:可以創(chuàng)建issue、發(fā)表評論,不能讀寫版本庫
2.Reporter:可以克隆代碼,不能提交,QA、PM 可以賦予這個權限
3.Developer:可以克隆代碼、開發(fā)、提交、push,普通開發(fā)可以賦予這個權限
4.Maintainer:可以創(chuàng)建項目、添加tag、保護分支、添加項目成員、編輯項目,核心開發(fā)可以賦予這個 權限
5.Owner:可以設置項目訪問權限 - Visibility Level、刪除項目、遷移項目、管理組成員,開發(fā)組組 長可以賦予這個權限
2、安裝jenkins
持續(xù)集成需要一個持續(xù)集成服務器, Jenkins 就是一個配置簡單和使用方便的持續(xù)集成服務器。依賴于Java開發(fā)的,由各種組件組成的一個自動化部署工具。
Jenkins自由風格主要的部署步驟:參數(shù)化構建->源代碼管理->構建->構建后操作
1、安裝Java
[root@localhost opt]# yum install java-1.8.0-openjdk* -y
2、安裝Jenkins
[root@localhost opt]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
[root@localhost opt]# yum install -y jenkins-2.249.1-1.1.noarch.rpm
[root@localhost opt]# systemctl start jenkins
3、登陸密碼
[root@localhost opt]# cat /var/lib/jenkins/secrets/initialAdminPassword
edfcd0f0432a4a868dc32da0c34f7f3a
4、安裝插件
[root@localhost updates]# tar -xf /opt/plugins.tar.gz -C /var/lib/jenkins/
5、Jenkins 優(yōu)化
[root@localhost updates]# cd /var/lib/jenkins/updates
[root@localhost updates]# sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
[root@localhost updates]# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
# 最后,系統(tǒng)管理 --> 插件管理 --> 高級,把站點升級改為國內插件下載地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
?創(chuàng)建用戶
創(chuàng)建權限組
?分配權限
由于jenkins構建項目中的源碼是從git拉取,因此需要配置憑證方能拉取成功
- 系統(tǒng)管理 ---> ?Manage Credentials ---> 系統(tǒng)憑證 ---> 全局憑證 ---> 添加憑證 ---> Username with Password(遠程倉庫的用戶密碼)
- 系統(tǒng)管理 ---> ?Manage Credentials ---> 系統(tǒng)憑證 ---> 全局憑證 ---> 添加憑證 ---> ssh username with private key(需先在遠程倉庫設置中配置jenkins服務器公鑰,再填入jenkins服務器私鑰)
配置完后就可以拉取代碼到工作目錄,然后進行構建和發(fā)布,工作目錄默認在/var/lib/jenkins/workspace
如果是發(fā)布maven工程,需要在jenkins服務器安裝java,maven,并在全局工具配置java,在系統(tǒng)配置中配置maven,再安裝maven集成插件
?
持續(xù)集成需要一個自動構建過程,從檢出代碼、編譯構建、運行測試、結果記錄、測試統(tǒng)計等都是自動完成的,無需人工干預,如下幾種方式均可實現(xiàn)
使用shell腳本實現(xiàn)CICD
直接執(zhí)行腳本,在jenkins服務器進行編譯,在部署服務器進行發(fā)布,若批量部署,可以使用ansible
#!/bin/bash
set -xe
function process() {
if [ $1 -ne 0 ]; then
echo "deploy fail"
exit 1
fi
}
echo "構建開始"
git checkout $GIT_TAG
mvn clean package -D skipTests
process $?
sshpass -p '部署服務器密碼' scp target/*.jar root@10.0.0.7:/application
process $?
sshpass -p "部署服務器密碼" ssh -o StrictHostKeyChecking=no root@10.0.0.7 "cd /application;chmod 777 *.jar;kill -9 `ps -ef|grep java|grep 8081|awk '{print $2}'`;nohup java -jar *.jar --server.port=8081>deploy.log &"
process $?
echo "deploy success"
set +x
echo "構建結束"
?
使用pipeline實現(xiàn)CICD
創(chuàng)建一個流水線
編寫pipeline腳本
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/chenqianqi/web_demo.git']])
}
}
stage('code checking') {
steps {
script {
//引入SonarQubeScanner工具
scannerHome = tool 'SonarQube-Scanner'
}
//引入SonarQube的服務器環(huán)境
withSonarQubeEnv('sonarqube') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage('publish project') {
steps {
deploy adapters: [tomcat8(credentialsId: 'c4512fa0-4a20-41ff-a86b-4f38092baeea', path: '', url: 'http://10.0.0.7:8084/')], contextPath: null, war: 'target/*.war'
}
}
}
post {
always {
emailext(
subject: '構建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
body: '${FILE,path="email.html"}',
to: '291887741@qq.com'
)
}
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-452824.html
使用Blue Ocean實現(xiàn)CICD
文章來源地址http://www.zghlxwxcb.cn/news/detail-452824.html
到了這里,關于自動化運維CICD的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!