持續整合、持續部署、持續交付、持續釋出
概念
持續 (Continuous):不斷的獲取反饋,響應反饋。
整合 (Integration):編譯、測試、打包;
部署 (Deployment):應用元件或基本設施的程式碼或配置變更在產品環境生效稱為“部署”;
釋出 (Release):具有業務影響的功能變化對終端使用者可見稱為“釋出”。
交付 (Delivery):可以理解為從 Deployment 到 Release之間的階段,更多的強調的是一種能力。開發有能力頻繁的部署,業務有能力隨時釋出。
相關連線:
知乎:如何理解持續整合、持續交付、持續部署?
阮一峰:持續整合是什麼?
使用Jenkins進行持續整合
coding.net:ci
使用 Jenkins 構建 Coding 專案
達到的目標
名詞說的那麼多,扯的天花亂墜也沒什麼卵用,達到實際的效果才行。
我要達到的目的:開發人員提交程式碼到git,剩下的事情軟體自動完成,開啟瀏覽器可以直接看到程式介面
開始搭建持續整合環境
這裡講兩種,1.Java語言,Springboot框架為主開發時Jenkins持續整合,2.Js或Ts語言,以angualr框架或nodejs等為主開發,Jenkins整合。
當然持續整合軟體有很多,比如git-ci等等,這裡選Jenkins因為全面而且方便。
第一種:記錄使用Jenkins,Git私庫進行持續整合一個Java語言專案
環境
Java版本:jdk8
框架:springboot
作業系統: centos
協同開發:Git (私庫)
關於環境題外話
版本控制現在用的比較多的就是svn和git。
推薦git,使用一次就再也不想用svn了。
免費好用的廠商提供的協同工具:
github :https://github.com/ 毋庸置疑,老牌王牌,缺點是國內網速不好,且私有專案收費,聽說最近被微軟收購了,不知道會不會有大的改動。
碼雲:https://gitee.com/ 開源中國git版,國內速度快,缺點是私有專案只能有5個人,超過收費。
coding:https://coding.net/ 伺服器在香港,國內外訪問速度都挺好,私有專案可以達到20人,目前還是比較不錯的選擇。小公司可以選擇這個,基本不花錢。
自建git,很多公司為了程式碼安全,都是找臺伺服器自建git服務。大公司或者純粹為了安全,推薦這種。
安裝持續部署環境 Jenkins
建立新使用者
好習慣是給每一個特殊的服務提供一個新的linux使用者,當然你可以選擇root
-- 新增使用者
adduser ci
-- 修改密碼
passwd ci
-- 輸入密碼ci
--切換到ci預設目錄
cd /home/ci
安裝jdk
有時候一天linux伺服器可能跑多個版本的jdk,你可能會遇到,解決辦法有兩種,第一,安裝最高版本的jdk,第二,安裝多個版本的jdk。考慮到你可能會遇到問題,這裡記錄單系統裝多個版本jdk。
Linux 解除安裝JDK並安裝新版本JDK (rpm,tar)
ubuntu或者linux下解除安裝和安裝多個jdk版本,1.6,1.7和1.8版本
oracle官網下載JDK地址
安裝jenkins
首先,我們從Jenkins官方網站https://jenkins.io/下載最新的war包。雖然Jenkins提供了Windows、Linux、OS X等各種安裝程式,但是,這些安裝程式都沒有war包好使。我從未見過Jenkins這樣把Java包做得如此簡單的專案。只需要執行命令:
java -jar jenkins.war
Jenkins就啟動成功了!它的war包自帶Jetty伺服器,剩下的工作我們全部在瀏覽器中進行。
假如你想讓該程式後臺執行
-- 設定為後臺執行並修改埠
nohup java -jar jenkins.war --httpPort= 8888 &
安裝過程
第一次啟動Jenkins時,出於安全考慮,Jenkins會自動生成一個隨機的按照口令。注意控制檯輸出的口令,複製下來,然後在瀏覽器輸入:
http://IP地址:埠/
比如: http://localhost:8080/
執行成功後,開啟瀏覽器,一般要貼上口令,安裝外掛,如果你第一次安裝不是懂的很多,這裡選擇預設的推薦安裝外掛即可,安裝完成後可以在設定中增刪外掛,登陸後建立使用者,一般是admin超級管理員即可,這裡也是登陸成功後可以進行使用者管理,不喜歡的後邊隨時可以改。然後點選下一步下一步,基本就完成了安裝。
安裝成功後可以大體瀏覽下介面。
配置Springboot專案持續化整合
配置Maven外掛
然後,在Jenkins首頁選擇“新建”,輸入名字,選擇“構建一個maven專案”:
在配置頁中,原始碼管理選擇Git,填入地址:
私鑰配置
複製你私鑰的文字貼上在此即可。
私鑰生成程式碼:
一 、
設定Git的user name和email:
$ git config --global user.name "xuhaiyan"
$ git config --global user.email "haiyan.xu.vip@gmail.com"
二、生成SSH金鑰過程:
1.檢視是否已經有了ssh金鑰:cd ~/.ssh
如果沒有金鑰則不會有此資料夾,有則備份刪除
2.生存金鑰:
$ ssh-keygen -t rsa -C “haiyan.xu.vip@gmail.com”
按3個回車,密碼為空。
Your identification has been saved in /home/tekkub/.ssh/id_rsa.
Your public key has been saved in /home/tekkub/.ssh/id_rsa.pub.
The key fingerprint is:
………………
最後得到了兩個檔案:id_rsa和id_rsa.pub
預設使用master分支。如果需要口令,在Credentials中新增使用者名稱/口令,或者使用SSH Key。
構建觸發器指定了觸發一次構建的條件。推薦使用最簡單的配置“Poll SCM”,它的意思是,定時檢查版本庫,發現有新的提交就觸發構建。這種方式對git、SVN等所有版本管理系統都是通用的。
我們在日程表中填入:
* * * * *
表示每分鐘檢查一次。如果你覺得太頻繁,可以改成“每3分鐘檢查一次”:
*/3 * * * *
在“Build”中,預設的Root POM是pom.xml
。如果pom.xml
不在根目錄下,就填入子目錄,例如:wxapi/pom.xml
。
在Goals and options中,填入需要執行的mvn命令:clean package
,Jenkins將執行如下命令,或者不填
mvn clean package
特殊引數也在這裡填寫,如`-DskipTests=true clean package`。
儲存後,就可以執行自動化構建了。
點選一個構建任務,可以在Console Output中看到控制檯詳細輸出,便於出錯排查:
如何部署
如果要部署構建好的war包,可以在Post Steps中填上shell命令,直接用指令碼部署。
另一種方式是建立另外一個構建專案,手動觸發部署。
無論用哪種方式,都是為了確保編譯、部署是通過CI伺服器完成的,而不是某臺開發機器。
由於Springboot專案打包為jar,執行非常方便,這裡就使用jar包釋出。為了方便,我寫了幾段指令碼,指令碼如下:
shell方式
--啟動指令碼start.sh
#!/bin/bash
nohup java -jar ../../apidoc-1.0.0.jar &
--停止指令碼stop.sh
#!/bin/bash
PID=$(ps -ef | grep apidoc-1.0.0.jar | grep -v grep | awk `{ print $2 }`)
if [ -z "$PID" ]
then
echo Application is already stopped
else
echo kill $PID
kill $PID
fi
--run.sh整合啟動和停止的sh
#!/bin/bash
echo "停止應用"
source ./stop.sh
echo "啟動應用"
source ./start.sh
--為jennkins專門使用,主要原因是他必須使用絕對路徑,run4jenkins 為jenkins的run.sh
#!/bin/bash
cd /home/ci/.jenkins/workspace/apidoc/target/classes/shell 這裡是你的專案的絕對路徑
echo "停止應用"
source ./stop.sh
echo "啟動應用"
source ./start.sh
-- 注意防止殺死程式 and 必須用絕對路徑
BUILD_ID=DONTKILLME
sh /home/ci/.jenkins/workspace/apidoc/target/classes/shell/run4jenkins.sh
幾個注意點
jenkins執行shell指令碼必須使用絕對路徑,這個跟linux是一致的,如果你想用相對路徑,可以先cd切換到目錄下在執行shell指令碼。
jenkins啟動的程式會被預設殺死,防止程式被殺死可以加這個引數BUILD_ID=DONTKILLME
我第一構建專案的時候,由於專案為Maven多模組,Jenkins不熟悉,構建了36次才成功,哈哈,所以你別急。程式設計開發,踩坑太正常了。
jenkins預設工作路徑為/home/user/.jenkins,做遷移時,拷貝這個目錄即可。
記錄一個問題,我這裡使用阿里雲伺服器,預設home資料夾為20G磁碟大小,後來磁碟滿了,做了一次遷移。被耽誤好多時間。
修改Jenkins預設工作路徑:
vim /etc/profile
-- 增加 JENKINS_HOME 即可
JENKINS_HOME=/local/jenkins
export JENKINS_HOME
如何建立Linux服務
有了Jenkins,我們就可以在內網或者租用一臺EC2伺服器來搭建CI環境,每月費用不到¥100。推薦Ubuntu Linux系統。因為我們不想每次登入到Linux去啟動Jenkins,也不想寫指令碼來啟動服務。推薦安裝JDK後,配合supervisor,把Jenkins直接變成一個服務。
可以在Linux上建立一個ci
使用者,然後,用supervisor啟動並指定9001埠:
# /etc/supervisor/conf.d/ci.conf
[program:ci]
command=java -jar /home/ci/jenkins.war --httpPort=9001
user=ci
autostart=true
autorestart=true
startsecs=30
startretries=5
Jenkins預設在當前使用者的主目錄下建立.jenkins
目錄,所有的配置檔案、資料庫都存放在裡面,只需要備份這個目錄就備份了整個CI配置。
這樣,一個CI環境就搭建完畢。
構建Angular等前端開發專案的持續整合
安裝angular執行環境
這裡可以使用docker,一個命令就可以啟動一個執行環境,推薦使用。
我這臺伺服器有其他用途,所以我安裝angular開發環境。
安裝nodejs
centos6.5安裝nodejs有些坑,我踩過了你就不要踩了。
1.yum源安裝,nodejs沒用最新版,angualr無非執行
2.官方推薦下載原始碼,自動編譯安裝,但是centos6.5的c++變壓器版本過老,無法編譯最新版nodejs原始碼,需要替換c++編輯器,想想替換過程就操蛋。乾脆放棄。
3.下載官方編譯好的安裝包。配置環境變數,我採用的這種
下載最新版 https://nodejs.org/en/download/
cd /local/src
mkdir nodejs
cd nodejs
wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz
-- 解壓
xz -d ***.tar.xz
tar -xvf ***.tar
--配置環境變數
vim /etc/profile
--增加如下
# nodejs
export NODE_HOME=/local/nodejs/node-v8.11.2-linux-x64
export PATH=$NODE_HOME/bin:$PATH
儲存退出,重新整理生效
source /etc/profile
--測試
node -v
npm -v
輸出版本資訊,即安裝成功
做一些優化配置
npm太慢, 淘寶npm映象使用方法
淘寶 npm 地址: http://npm.taobao.org/
如何使用 有很多方法來配置npm的registry地址,下面根據不同情境列出幾種比較常用的方法。以淘寶npm映象舉例:
1.臨時使用
npm --registry https://registry.npm.taobao.org install express
2.持久使用
npm config set registry https://registry.npm.taobao.org
- 配置後可通過下面方式來驗證是否成功
npm config get registry
或npm info express
3.通過cnpm使用
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 使用
cnpm install express
安裝anglular-cli
anglular-cli是angular的開發手腳架,使用cli開發angular程式非常方便,不得不說google的工程師真的是非常牛!
升級安裝npm
npm install npm -g
檢視npm版本
npm -v
安裝TypeScript
npm install -g typescript
檢視TypeScript版本
tsc -v
安裝 angular-cli
npm install -g @angular/cli
檢視angular-cli 版本
ng -v
看到如下資訊表示成功
備註:
圖省事的話,其實就安裝nodejs和angular-cli即可
到此,angular執行環境搭建完成。
配置Jenkins持續整合任務
新建一個 ‘自由風格的任務’
配置git
配置nodejs外掛
配置觸發器和定時掃描,這裡是每分鐘檢測git一次,隨你改
儲存,然後構建任務
等待輸出成功,檢視日誌列印如下
然後登陸linux,進入jenkins的工作目錄,類似這裡/local/jenkins/workspace/cloud_front
執行專案初始化,這裡跟angular開發操作無異,不展開細講
npm install
然後執行專案
ng server
編譯成功後,訪問http:ip:4200 檢視沒什麼錯誤,就可以知道構建指令碼怎麼寫了
如果安裝失敗,請刪除node_modules,重寫npm install
rm -rf node_modules/
-- 如果你使用了scss而不是css,安裝scss編譯環境可能會出錯
請嘗試如下操作
-- 安裝node編譯c++擴充套件的工具dode-gyp
npm install -g node-gyp
-- 安裝時嘗試跳過錯誤
npm install --unsafe-perm
--測試是否成功,可以單獨安裝node-scss
刪除
npm uninstall node-sass
重新安裝
npm install node-sass
-- node-sass安裝失敗,多少是網路原因,國內被牆了
首先要知道的是,安裝 node-sass 時在 node scripts/install 階段會從 github.com 上下載一個 .node 檔案,
大部分安裝不成功的原因都源自這裡,因為 GitHub Releases 裡的檔案都託管在 s3.amazonaws.com 上面,
而這個網址在國內總是網路不穩定,所以我們需要通過第三方伺服器下載這個檔案
嘗試cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
# cnpm install node-sass@4.5.3 --save
或者在專案下建一個檔案.npmrc 輸入如下程式碼
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
phantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjs/
electron_mirror=https://npm.taobao.org/mirrors/electron/
registry=https://registry.npm.taobao.org
# 或者這樣解決
npm install --registry http://registry.npmjs.org/ -unsafe-perm
mac或者linux安裝報錯可能要帶這個引數 -unsafe-perm
踩坑和問題
enkins下執行 ng build 命令會提示“命令未找到”,但是執行如 ls 等原生命令沒有任何問題。在Linux主機是通過修改 /etc/profile 檔案來配置環境變數,則問題可能是Jenkins在執行shell指令碼時沒有載入 /etc/profile 檔案,因此找不到 ng 命令,會提示“命令未找到”。
● Jenkins預設情況下執行shell指令碼是使用非登入方式,然而非登入方式不會載入 /etc/profile 檔案,在 Execute shell 中 新增如 #!/bin/sh -l 命令修改為登入方式即可解決問題。
搞了好久,還是報錯命令找不到,各種費勁。於是機智的我把這個問題跳過了,先湊合用吧。
這段你就當看不到就行了
啊,呸,讓你費勁,我跳過這一步。
分析:angular-cli提供了各種方便的編譯環境,我為什麼不能用一下。
比如使用其下優勢:
1.自動代理外掛 ,解決跨域問題
2.伺服器功能,解決另外部署伺服器功能
3.自動檢測檔案改動,自動編譯後拉起瀏覽器。使用這個功能,就不需要jenkins構建完了執行shell指令碼了。直接ng server後,有檔案更新cli會自動編譯,萬一有重大更新,比如增加了node 的依賴庫或者依賴外掛,那麼登陸伺服器執行如下指令碼即可
cd /local/jenkins/workspace/cloud_front
npm install
nohup sh run.sh >run.log 2>1 &
其中run.sh指令碼如下
#!/bin/sh -l
ng serve --port 4201 --base-href --proxy-config proxy.conf.json --host 0.0.0.0
執行的日誌就在run.log中,如果你想檢視可以tail
tail -f run.log
# 機智如我,呵呵。啊,呸,浪費我兩個小時解決命令列找不到
-- 擴充套件命令
檢視關閉/後臺任務
jobs
kill %job程式號
4.記得修改埠,防止佔用或衝突,綜上所述,ng指令碼如下
ng serve --port 4201 --base-href --proxy-config proxy.conf.json --host 0.0.0.0
相關文章
- 對持續整合、 持續交付、持續部署和持續釋出的介紹
- 持續整合、持續交付、持續部署簡介
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- 淺談持續整合(CI)、持續交付(CD)、持續部署(CD)
- 談談持續整合,持續交付,持續部署之間的區別
- 從持續整合到持續交付——DockerCloud概覽DockerCloud
- 我們正在路上—從持續整合到持續釋出
- 持續整合、持續交付和持續部署有什麼區別?0基礎學習linux技能Linux
- 通過Docker容器執行持續整合/持續部署Docker
- SAP開源的持續整合-持續交付的解決方案
- 使用流水線外掛實現持續整合、持續部署
- iOS 持續整合iOS
- Jenkins持續部署-Windows環境持續部署探究1JenkinsWindows
- 整合持續整合工具
- 持續整合及部署利器:GoGo
- 以 egg.js 為例的持續整合(CI)、持續部署(CD)JS
- iOS 持續交付之 FastlaneiOSAST
- vue + webpack 前端專案持續釋出整合部署VueWeb前端
- Jenkins持續整合Jenkins
- CI/CD 持續整合部署實踐
- 微服務容器部署與持續整合微服務
- 微服務、容器與持續交付微服務
- 前端專案基於GitLab-CI的持續整合/持續部署(CI/CD)前端Gitlab
- HTTP非持續連線和持續連線HTTP
- 釋出 Spinnaker 1.0:持續的雲交付平臺
- 持續整合配置之Nuget
- Taro 小程式持續整合
- 持續整合JenkinsBlueOcean初探Jenkins
- Jenkins持續整合配置Jenkins
- Cruise:持續整合及釋出管理系統UI
- 淺談持續整合的理解以及實現持續整合,需要做什麼?
- JVM(持續更新。。。)JVM
- FastApi持續更新ASTAPI
- 持續學習
- SpringBoot+Docker+Git+Jenkins實現簡易的持續整合和持續部署Spring BootDockerGitJenkins
- Flutter web 持續整合實踐FlutterWeb
- Jenkens+Docker+Git 持續整合DockerGit
- jenkins+docker 持續整合JenkinsDocker