持續整合、持續部署、持續交付、持續釋出

大括號啊發表於2018-05-21

概念

持續 (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了。
免費好用的廠商提供的協同工具:

githubhttps://github.com/ 毋庸置疑,老牌王牌,缺點是國內網速不好,且私有專案收費,聽說最近被微軟收購了,不知道會不會有大的改動。

碼雲https://gitee.com/ 開源中國git版,國內速度快,缺點是私有專案只能有5個人,超過收費。

codinghttps://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外掛

2833665-21c6978f10adb94b.png

2833665-afda2d0e8138a177.png

然後,在Jenkins首頁選擇“新建”,輸入名字,選擇“構建一個maven專案”:

2833665-29ec9ae879598ff2
new-job

在配置頁中,原始碼管理選擇Git,填入地址:

2833665-e8839baeb9abf478
git-config

私鑰配置

複製你私鑰的文字貼上在此即可。
私鑰生成程式碼:

一 、

設定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


2833665-97e94a8ffc31949a.png

2833665-bb88db181836ce29.png

預設使用master分支。如果需要口令,在Credentials中新增使用者名稱/口令,或者使用SSH Key。

構建觸發器指定了觸發一次構建的條件。推薦使用最簡單的配置“Poll SCM”,它的意思是,定時檢查版本庫,發現有新的提交就觸發構建。這種方式對git、SVN等所有版本管理系統都是通用的。

我們在日程表中填入:

* * * * *

2833665-f1772c699a282afa
trigger

表示每分鐘檢查一次。如果你覺得太頻繁,可以改成“每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中看到控制檯詳細輸出,便於出錯排查:

2833665-08530bccf4e5dbcc
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 
2833665-2ce67a006818bd69.png

幾個注意點

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
2833665-953d8731d9f8a86c.png

如何建立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/

2833665-bd1f80cb6e019e6b.png

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 registrynpm 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

看到如下資訊表示成功


2833665-1041868469ffc07c.png

備註:

圖省事的話,其實就安裝nodejs和angular-cli即可
到此,angular執行環境搭建完成。

配置Jenkins持續整合任務

新建一個 ‘自由風格的任務’


2833665-0c83a2cc930ae6e8.png

配置git


2833665-f4935e6df62426eb.png

配置nodejs外掛

2833665-a1a048ede32c982a.png

2833665-d8fa0646eed075f3.png
2833665-b242385a53e77951.png

2833665-5bfeba75a9758b96.png

配置觸發器和定時掃描,這裡是每分鐘檢測git一次,隨你改


2833665-7208bebfd5127ce5.png

儲存,然後構建任務

等待輸出成功,檢視日誌列印如下

2833665-516d51ba2de59734.png

然後登陸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

2018年6月18號補充

伺服器阿里雲 npm不穩定,我猜測是網路的問題,比如node-sass經常安裝失敗,切換淘寶源也不行,隨改為yarn,相關指令碼記錄如下

關於yarn https://yarn.bootcss.com/

yarn
# 殺死程式
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

#啟動
 nohup  yarn start-prod >log.log 2>1 & 

jenkins maven構建速度慢

加大jvm記憶體
-Xms800m -Xmx800m -XX:MaxNewSize=512m  -XX:MaxPermSize=512m

2833665-dc76d4158886e335.png
image.png

相關文章