概念
持續(xù) (Continuous):不斷的獲取反饋骆膝,響應(yīng)反饋祭衩。
集成 (Integration):編譯、測(cè)試阅签、打包掐暮;
部署 (Deployment):應(yīng)用組件或基本設(shè)施的代碼或配置變更在產(chǎn)品環(huán)境生效稱為“部署”;
發(fā)布 (Release):具有業(yè)務(wù)影響的功能變化對(duì)最終用戶可見(jiàn)稱為“發(fā)布”政钟。
交付 (Delivery):可以理解為從 Deployment 到 Release之間的階段路克,更多的強(qiáng)調(diào)的是一種能力。開(kāi)發(fā)有能力頻繁的部署养交,業(yè)務(wù)有能力隨時(shí)發(fā)布精算。
相關(guān)連接:
知乎:如何理解持續(xù)集成、持續(xù)交付碎连、持續(xù)部署灰羽?
阮一峰:持續(xù)集成是什么?
使用Jenkins進(jìn)行持續(xù)集成
coding.net:ci
使用 Jenkins 構(gòu)建 Coding 項(xiàng)目
達(dá)到的目標(biāo)
名詞說(shuō)的那么多鱼辙,扯的天花亂墜也沒(méi)什么卵用廉嚼,達(dá)到實(shí)際的效果才行。
我要達(dá)到的目的:開(kāi)發(fā)人員提交代碼到git倒戏,剩下的事情軟件自動(dòng)完成怠噪,打開(kāi)瀏覽器可以直接看到程序界面
開(kāi)始搭建持續(xù)集成環(huán)境
這里講兩種,1.Java語(yǔ)言杜跷,Springboot框架為主開(kāi)發(fā)時(shí)Jenkins持續(xù)集成傍念,2.Js或Ts語(yǔ)言,以angualr框架或nodejs等為主開(kāi)發(fā)葱椭,Jenkins集成捂寿。
當(dāng)然持續(xù)集成軟件有很多,比如git-ci等等孵运,這里選Jenkins因?yàn)槿娑曳奖恪?/strong>
第一種:記錄使用Jenkins,Git私庫(kù)進(jìn)行持續(xù)集成一個(gè)Java語(yǔ)言項(xiàng)目
環(huán)境
Java版本:jdk8
框架:springboot
操作系統(tǒng): centos
協(xié)同開(kāi)發(fā):Git (私庫(kù))
關(guān)于環(huán)境題外話
版本控制現(xiàn)在用的比較多的就是svn和git秦陋。
推薦git,使用一次就再也不想用svn了治笨。
免費(fèi)好用的廠商提供的協(xié)同工具:
github :https://github.com/ 毋庸置疑驳概,老牌王牌赤嚼,缺點(diǎn)是國(guó)內(nèi)網(wǎng)速不好,且私有項(xiàng)目收費(fèi)顺又,聽(tīng)說(shuō)最近被微軟收購(gòu)了更卒,不知道會(huì)不會(huì)有大的改動(dòng)。
碼云:https://gitee.com/ 開(kāi)源中國(guó)git版稚照,國(guó)內(nèi)速度快蹂空,缺點(diǎn)是私有項(xiàng)目只能有5個(gè)人,超過(guò)收費(fèi)果录。
coding:https://coding.net/ 服務(wù)器在香港上枕,國(guó)內(nèi)外訪問(wèn)速度都挺好,私有項(xiàng)目可以達(dá)到20人弱恒,目前還是比較不錯(cuò)的選擇辨萍。小公司可以選擇這個(gè),基本不花錢(qián)返弹。
自建git锈玉,很多公司為了代碼安全,都是找臺(tái)服務(wù)器自建git服務(wù)义起。大公司或者純粹為了安全拉背,推薦這種。
安裝持續(xù)部署環(huán)境 Jenkins
創(chuàng)建新用戶
好習(xí)慣是給每一個(gè)特殊的服務(wù)提供一個(gè)新的linux用戶并扇,當(dāng)然你可以選擇root
-- 添加用戶
adduser ci
-- 修改密碼
passwd ci
-- 輸入密碼ci
--切換到ci默認(rèn)目錄
cd /home/ci
安裝jdk
有時(shí)候一天linux服務(wù)器可能跑多個(gè)版本的jdk去团,你可能會(huì)遇到抡诞,解決辦法有兩種穷蛹,第一,安裝最高版本的jdk昼汗,第二肴熏,安裝多個(gè)版本的jdk∏曛希考慮到你可能會(huì)遇到問(wèn)題蛙吏,這里記錄單系統(tǒng)裝多個(gè)版本jdk。
Linux 卸載JDK并安裝新版本JDK (rpm,tar)
ubuntu或者linux下卸載和安裝多個(gè)jdk版本鞋吉,1.6鸦做,1.7和1.8版本
oracle官網(wǎng)下載JDK地址
安裝jenkins
首先,我們從Jenkins官方網(wǎng)站https://jenkins.io/下載最新的war包谓着。雖然Jenkins提供了Windows泼诱、Linux、OS X等各種安裝程序赊锚,但是治筒,這些安裝程序都沒(méi)有war包好使屉栓。我從未見(jiàn)過(guò)Jenkins這樣把Java包做得如此簡(jiǎn)單的項(xiàng)目。只需要運(yùn)行命令:
java -jar jenkins.war
Jenkins就啟動(dòng)成功了耸袜!它的war包自帶Jetty服務(wù)器友多,剩下的工作我們?nèi)吭跒g覽器中進(jìn)行。
假如你想讓該程序后臺(tái)運(yùn)行
-- 設(shè)置為后臺(tái)運(yùn)行并修改端口
nohup java -jar jenkins.war --httpPort=8888 &
安裝過(guò)程
第一次啟動(dòng)Jenkins時(shí)堤框,出于安全考慮域滥,Jenkins會(huì)自動(dòng)生成一個(gè)隨機(jī)的按照口令。注意控制臺(tái)輸出的口令蜈抓,復(fù)制下來(lái)骗绕,然后在瀏覽器輸入:
http://IP地址:端口/
比如: http://localhost:8080/
運(yùn)行成功后,打開(kāi)瀏覽器资昧,一般要粘貼口令酬土,安裝插件,如果你第一次安裝不是懂的很多,這里選擇默認(rèn)的推薦安裝插件即可格带,安裝完成后可以在設(shè)置中增刪插件撤缴,登陸后創(chuàng)建用戶,一般是admin超級(jí)管理員即可叽唱,這里也是登陸成功后可以進(jìn)行用戶管理屈呕,不喜歡的后邊隨時(shí)可以改。然后點(diǎn)擊下一步下一步棺亭,基本就完成了安裝虎眨。
安裝成功后可以大體瀏覽下界面。
配置Springboot項(xiàng)目持續(xù)化集成
配置Maven插件
然后镶摘,在Jenkins首頁(yè)選擇“新建”嗽桩,輸入名字,選擇“構(gòu)建一個(gè)maven項(xiàng)目”:
在配置頁(yè)中凄敢,源碼管理選擇Git碌冶,填入地址:
私鑰配置
復(fù)制你私鑰的文本粘貼在此即可陌宿。
私鑰生成代碼:
一 椒拗、
設(shè)置Git的user name和email:
$ git config --global user.name "xuhaiyan"
$ git config --global user.email "haiyan.xu.vip@gmail.com"
二、生成SSH密鑰過(guò)程:
1.查看是否已經(jīng)有了ssh密鑰:cd ~/.ssh
如果沒(méi)有密鑰則不會(huì)有此文件夾读整,有則備份刪除
2.生存密鑰:
$ ssh-keygen -t rsa -C “haiyan.xu.vip@gmail.com”
按3個(gè)回車拒逮,密碼為空罐氨。
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:
………………
最后得到了兩個(gè)文件:id_rsa和id_rsa.pub
默認(rèn)使用master分支。如果需要口令滩援,在Credentials中添加用戶名/口令栅隐,或者使用SSH Key。
構(gòu)建觸發(fā)器指定了觸發(fā)一次構(gòu)建的條件。推薦使用最簡(jiǎn)單的配置“Poll SCM”约啊,它的意思是邑遏,定時(shí)檢查版本庫(kù),發(fā)現(xiàn)有新的提交就觸發(fā)構(gòu)建恰矩。這種方式對(duì)git记盒、SVN等所有版本管理系統(tǒng)都是通用的。
我們?cè)谌粘瘫碇刑钊耄?/p>
* * * * *
表示每分鐘檢查一次外傅。如果你覺(jué)得太頻繁纪吮,可以改成“每3分鐘檢查一次”:
*/3 * * * *
在“Build”中,默認(rèn)的Root POM是pom.xml
萎胰。如果pom.xml
不在根目錄下碾盟,就填入子目錄,例如:wxapi/pom.xml
技竟。
在Goals and options中冰肴,填入需要執(zhí)行的mvn命令:clean package
,Jenkins將執(zhí)行如下命令榔组,或者不填
mvn clean package
特殊參數(shù)也在這里填寫(xiě)熙尉,如`-DskipTests=true clean package`。
保存后搓扯,就可以執(zhí)行自動(dòng)化構(gòu)建了检痰。
點(diǎn)擊一個(gè)構(gòu)建任務(wù),可以在Console Output中看到控制臺(tái)詳細(xì)輸出锨推,便于出錯(cuò)排查:
如何部署
如果要部署構(gòu)建好的war包铅歼,可以在Post Steps中填上shell命令,直接用腳本部署换可。
另一種方式是創(chuàng)建另外一個(gè)構(gòu)建項(xiàng)目椎椰,手動(dòng)觸發(fā)部署。
無(wú)論用哪種方式锦担,都是為了確保編譯俭识、部署是通過(guò)CI服務(wù)器完成的慨削,而不是某臺(tái)開(kāi)發(fā)機(jī)器洞渔。
由于Springboot項(xiàng)目打包為jar,運(yùn)行非常方便缚态,這里就使用jar包發(fā)布磁椒。為了方便,我寫(xiě)了幾段腳本玫芦,腳本如下:
shell方式
--啟動(dòng)腳本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集成啟動(dòng)和停止的sh
#!/bin/bash
echo "停止應(yīng)用"
source ./stop.sh
echo "啟動(dòng)應(yīng)用"
source ./start.sh
--為jennkins專門(mén)使用浆熔,主要原因是他必須使用絕對(duì)路徑,run4jenkins 為jenkins的run.sh
#!/bin/bash
cd /home/ci/.jenkins/workspace/apidoc/target/classes/shell 這里是你的項(xiàng)目的絕對(duì)路徑
echo "停止應(yīng)用"
source ./stop.sh
echo "啟動(dòng)應(yīng)用"
source ./start.sh
-- 注意防止殺死進(jìn)程 and 必須用絕對(duì)路徑
BUILD_ID=DONTKILLME
sh /home/ci/.jenkins/workspace/apidoc/target/classes/shell/run4jenkins.sh
幾個(gè)注意點(diǎn)
jenkins運(yùn)行shell腳本必須使用絕對(duì)路徑桥帆,這個(gè)跟linux是一致的医增,如果你想用相對(duì)路徑慎皱,可以先cd切換到目錄下在運(yùn)行shell腳本。
jenkins啟動(dòng)的進(jìn)程會(huì)被默認(rèn)殺死叶骨,防止進(jìn)程被殺死可以加這個(gè)參數(shù)BUILD_ID=DONTKILLME
我第一構(gòu)建項(xiàng)目的時(shí)候茫多,由于項(xiàng)目為Maven多模塊,Jenkins不熟悉忽刽,構(gòu)建了36次才成功天揖,哈哈,所以你別急跪帝。編程開(kāi)發(fā)今膊,踩坑太正常了。
jenkins默認(rèn)工作路徑為/home/user/.jenkins伞剑,做遷移時(shí)斑唬,拷貝這個(gè)目錄即可。
記錄一個(gè)問(wèn)題黎泣,我這里使用阿里云服務(wù)器赖钞,默認(rèn)home文件夾為20G磁盤(pán)大小,后來(lái)磁盤(pán)滿了聘裁,做了一次遷移雪营。被耽誤好多時(shí)間。
修改Jenkins默認(rèn)工作路徑:
vim /etc/profile
-- 增加 JENKINS_HOME 即可
JENKINS_HOME=/local/jenkins
export JENKINS_HOME
如何創(chuàng)建Linux服務(wù)
有了Jenkins衡便,我們就可以在內(nèi)網(wǎng)或者租用一臺(tái)EC2服務(wù)器來(lái)搭建CI環(huán)境献起,每月費(fèi)用不到¥100。推薦Ubuntu Linux系統(tǒng)镣陕。因?yàn)槲覀儾幌朊看蔚卿浀絃inux去啟動(dòng)Jenkins谴餐,也不想寫(xiě)腳本來(lái)啟動(dòng)服務(wù)。推薦安裝JDK后呆抑,配合supervisor岂嗓,把Jenkins直接變成一個(gè)服務(wù)。
可以在Linux上創(chuàng)建一個(gè)ci
用戶鹊碍,然后厌殉,用supervisor啟動(dòng)并指定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默認(rèn)在當(dāng)前用戶的主目錄下創(chuàng)建.jenkins
目錄,所有的配置文件侈咕、數(shù)據(jù)庫(kù)都存放在里面公罕,只需要備份這個(gè)目錄就備份了整個(gè)CI配置。
這樣耀销,一個(gè)CI環(huán)境就搭建完畢楼眷。
構(gòu)建Angular等前端開(kāi)發(fā)項(xiàng)目的持續(xù)集成
安裝angular運(yùn)行環(huán)境
這里可以使用docker,一個(gè)命令就可以啟動(dòng)一個(gè)運(yùn)行環(huán)境,推薦使用罐柳。
我這臺(tái)服務(wù)器有其他用途掌腰,所以我安裝angular開(kāi)發(fā)環(huán)境。
安裝nodejs
centos6.5安裝nodejs有些坑张吉,我踩過(guò)了你就不要踩了辅斟。
1.yum源安裝,nodejs沒(méi)用最新版,angualr無(wú)非運(yùn)行
2.官方推薦下載源代碼芦拿,自動(dòng)編譯安裝士飒,但是centos6.5的c++變壓器版本過(guò)老,無(wú)法編譯最新版nodejs源碼蔗崎,需要替換c++編輯器酵幕,想想替換過(guò)程就操蛋。干脆放棄缓苛。
3.下載官方編譯好的安裝包芳撒。配置環(huán)境變量,我采用的這種
下載最新版 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
--配置環(huán)境變量
vim /etc/profile
--增加如下
# nodejs
export NODE_HOME=/local/nodejs/node-v8.11.2-linux-x64
export PATH=$NODE_HOME/bin:$PATH
保存退出未桥,刷新生效
source /etc/profile
--測(cè)試
node -v
npm -v
輸出版本信息笔刹,即安裝成功
做一些優(yōu)化配置
npm太慢, 淘寶npm鏡像使用方法
淘寶 npm 地址: http://npm.taobao.org/
如何使用 有很多方法來(lái)配置npm的registry地址冬耿,下面根據(jù)不同情境列出幾種比較常用的方法舌菜。以淘寶npm鏡像舉例:
1.臨時(shí)使用
npm --registry https://registry.npm.taobao.org install express
2.持久使用
npm config set registry https://registry.npm.taobao.org
- 配置后可通過(guò)下面方式來(lái)驗(yàn)證是否成功
npm config get registry
或npm info express
3.通過(guò)cnpm使用
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 使用
cnpm install express
安裝anglular-cli
anglular-cli是angular的開(kāi)發(fā)手腳架,使用cli開(kāi)發(fā)angular程序非常方便亦镶,不得不說(shuō)google的工程師真的是非常牛日月!
升級(jí)安裝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
看到如下信息表示成功
備注:
圖省事的話,其實(shí)就安裝nodejs和angular-cli即可
到此缤骨,angular運(yùn)行環(huán)境搭建完成爱咬。
配置Jenkins持續(xù)集成任務(wù)
新建一個(gè) ‘自由風(fēng)格的任務(wù)’
配置git
配置nodejs插件
配置觸發(fā)器和定時(shí)掃描,這里是每分鐘檢測(cè)git一次绊起,隨你改
保存精拟,然后構(gòu)建任務(wù)
等待輸出成功,查看日志打印如下
然后登陸linux虱歪,進(jìn)入jenkins的工作目錄蜂绎,類似這里
/local/jenkins/workspace/cloud_front
執(zhí)行項(xiàng)目初始化,這里跟angular開(kāi)發(fā)操作無(wú)異,不展開(kāi)細(xì)講
npm install
然后運(yùn)行項(xiàng)目
ng server
編譯成功后实蔽,訪問(wèn)http:ip:4200 查看沒(méi)什么錯(cuò)誤荡碾,就可以知道構(gòu)建腳本怎么寫(xiě)了
如果安裝失敗,請(qǐng)刪除node_modules局装,重寫(xiě)npm install
rm -rf node_modules/
-- 如果你使用了scss而不是css,安裝scss編譯環(huán)境可能會(huì)出錯(cuò)
請(qǐng)嘗試如下操作
-- 安裝node編譯c++擴(kuò)展的工具dode-gyp
npm install -g node-gyp
-- 安裝時(shí)嘗試跳過(guò)錯(cuò)誤
npm install --unsafe-perm
--測(cè)試是否成功,可以單獨(dú)安裝node-scss
刪除
npm uninstall node-sass
重新安裝
npm install node-sass
-- node-sass安裝失敗铐尚,多少是網(wǎng)絡(luò)原因拨脉,國(guó)內(nèi)被墻了
首先要知道的是,安裝 node-sass 時(shí)在 node scripts/install 階段會(huì)從 github.com 上下載一個(gè) .node 文件宣增,
大部分安裝不成功的原因都源自這里玫膀,因?yàn)?GitHub Releases 里的文件都托管在 s3.amazonaws.com 上面,
而這個(gè)網(wǎng)址在國(guó)內(nèi)總是網(wǎng)絡(luò)不穩(wěn)定爹脾,所以我們需要通過(guò)第三方服務(wù)器下載這個(gè)文件
嘗試cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
# cnpm install node-sass@4.5.3 --save
或者在項(xiàng)目下建一個(gè)文件.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安裝報(bào)錯(cuò)可能要帶這個(gè)參數(shù) -unsafe-perm
踩坑和問(wèn)題
enkins下執(zhí)行 ng build 命令會(huì)提示“命令未找到”帖旨,但是執(zhí)行如 ls 等原生命令沒(méi)有任何問(wèn)題。在Linux主機(jī)是通過(guò)修改 /etc/profile 文件來(lái)配置環(huán)境變量灵妨,則問(wèn)題可能是Jenkins在執(zhí)行shell腳本時(shí)沒(méi)有加載 /etc/profile 文件解阅,因此找不到 ng 命令,會(huì)提示“命令未找到”泌霍。
● Jenkins默認(rèn)情況下執(zhí)行shell腳本是使用非登錄方式货抄,然而非登錄方式不會(huì)加載 /etc/profile 文件,在 Execute shell 中 添加如 #!/bin/sh -l 命令修改為登錄方式即可解決問(wèn)題朱转。
搞了好久蟹地,還是報(bào)錯(cuò)命令找不到,各種費(fèi)勁藤为。于是機(jī)智的我把這個(gè)問(wèn)題跳過(guò)了怪与,先湊合用吧。
這段你就當(dāng)看不到就行了
啊缅疟,呸琼梆,讓你費(fèi)勁,我跳過(guò)這一步窿吩。
分析:angular-cli提供了各種方便的編譯環(huán)境茎杂,我為什么不能用一下。
比如使用其下優(yōu)勢(shì):
1.自動(dòng)代理插件 纫雁,解決跨域問(wèn)題
2.服務(wù)器功能煌往,解決另外部署服務(wù)器功能
3.自動(dòng)檢測(cè)文件改動(dòng),自動(dòng)編譯后拉起瀏覽器轧邪。使用這個(gè)功能刽脖,就不需要jenkins構(gòu)建完了執(zhí)行shell腳本了。直接ng server后忌愚,有文件更新cli會(huì)自動(dòng)編譯曲管,萬(wàn)一有重大更新,比如增加了node 的依賴庫(kù)或者依賴插件硕糊,那么登陸服務(wù)器執(zhí)行如下腳本即可
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
運(yùn)行的日志就在run.log中院水,如果你想查看可以tail
tail -f run.log
# 機(jī)智如我腊徙,呵呵。啊檬某,呸撬腾,浪費(fèi)我兩個(gè)小時(shí)解決命令行找不到
-- 擴(kuò)展命令
查看關(guān)閉/后臺(tái)任務(wù)
jobs
kill %job進(jìn)程號(hào)
4.記得修改端口,防止占用或沖突恢恼,綜上所述民傻,ng腳本如下
ng serve --port 4201 --base-href --proxy-config proxy.conf.json --host 0.0.0.0
2018年6月18號(hào)補(bǔ)充
服務(wù)器阿里云 npm不穩(wěn)定,我猜測(cè)是網(wǎng)絡(luò)的問(wèn)題场斑,比如node-sass經(jīng)常安裝失敗漓踢,切換淘寶源也不行,隨改為yarn漏隐,相關(guān)腳本記錄如下
關(guān)于yarn https://yarn.bootcss.com/
yarn
# 殺死進(jìn)程
PID=$(netstat -nlp | grep :4203 | awk '{print $7}' | awk -F"/" '{ print $1 }')
if [ -z "$PID" ]
then
echo Application is already stopped
else
echo kill $PID
kill $PID
fi
#啟動(dòng)
nohup yarn start-prod >log.log 2>1 &
jenkins maven構(gòu)建速度慢
加大jvm內(nèi)存
-Xms800m -Xmx800m -XX:MaxNewSize=512m -XX:MaxPermSize=512m