28
人物
RDC如何構建一個基於NodeJS的前後端項目
最近在將公司的持續集成架構做一個係統的調整,調整過程中受到了RDC團隊大量的幫助,所以利用國慶時間寫了幾篇RDC的分享,希望能讓更多的人了解和用好RDC這個產品。
我會把我最近3個月的使用體會分成5個部分:使用RDC的動機、PHP項目集成、JS項目集成、JAVA項目集成、Docker類項目集成這5個分支來寫
因為近期RDC的迭代比較頻繁,所以我的分享會比較的淺,點到為止,僅供參考,目錄:
1、RDC如何耦合進我們的業務
2、如何構建一個基於Composer的PHP項目
3、如何構建一個基於NodeJS的前後端項目
4、如何構建一個基於Maven的Java項目
5、RDC + 容器服務完成持續集成
一、RDC基礎操作
在開始一切之前您需要熟悉RDC的一些基礎操作,創建一個項目,然後在這個項目中創建一個應用,然後讓這個應用關聯某個代碼分支。這樣基礎工作就完成了,我這裏不再贅述了,因為比較簡單,隻需要注冊個阿裏雲賬號,然後去 rdc.aliyun.com 創建/加入個企業就行了。
本文所有的體驗均基於【自由模式】的應用。
值得一提的是,應用代碼源目前支持的是阿裏雲的代碼倉庫,基於gitlab,地址是 code.aliyun.com,從我2年的使用經驗來看,還算好用,也不收費,較為靠譜。
在創建應用時,我們需要選擇對應的配置,如下圖:
創建完應用後,進入【項目】--》【流水線】,找到剛才創建應用的【同名流水線】
點擊流水線名稱可以看到具體的流水線運行情況和對應節點,如下圖:
可以看到有4個麵板:構建、日常、預發、正式。
分別對應的是:構建打包、發布到日常環境、發布到預發環境、發布到正式環境。
RDC在創建應用時自動的為你生成了一個標準模板流水線,但是我們一般用不著,所以需要對流水線進行修改,去除無用的節點,添加我們自己的配置。點擊界麵上的【編輯流水線】按鈕就可以進入修改界麵。
我們先從構建開始,所以先暫時刪除日常、預發、正式這3個部署節點,僅保留構建這一個節點即可。下麵的配置暫時不進行調整。刪除完畢後保存流水線即可,效果如下:
至此我們已經完成了基礎的準備工作,下一步就開始進行代碼的構建工作了。
在開始下一步工作之前,請重新git pull一下您的代碼到本地,會看到一個由RDC服務自動生成的配置文件:==xxx.release== 這個文件相當重要,請注意,下麵將會說明如何通過此文件完成個性化構建。
二、基於NodeJS的前後端項目構建
因為node類項目一般都通過NPM來維護第三方庫,並且一般會通過webpack來進行構建、合並、壓縮,所以在RDC構建時需要完成依賴包下載及webpack編譯的相關工作。
這裏需要找到我們上一章節中提到的:==xxx.release== 文件,xxx代表你的應用名,所以我這裏看到的文件名是:ms-autotags.release
這個文件的配置規範可以參考:==https://help.aliyun.com/document_detail/59293.html==
打開這個文件可以看到,已經有一些預先定義好的配置:
# 構建源碼語言類型
code.language=scripts
# 應用部署腳本
deploy.appctl.path=deploy.sh
# Docker鏡像構建之後push的倉庫地址
docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced
上麵的配置是不能用的,我們需要將其修改為如下內容:
# 語言類型,需要修改,否則無法調用對應的構建環境
code.language=node8.x
#構建命令
build.command=sh build.sh
# 應用部署腳本,先注釋掉,暫時用不上
# deploy.appctl.path=deploy.sh
↓↓↓↓ 配置說明:
code.language=nodejs
代表使用的是nodejs作為代碼語言類型。支持以下枚舉:
php5.6,php7.0,node6.x,node7.x,node8.x,oracle-jdk1.7,oracle-jdk1.8, oracle-jdk1.9,scripts
如果有使用過jenkins的同學,那麼應該比較好理解,RDC的構建是通過Docker容器技術實現的,類似於配置好環境的jenkins構建機,RDC團隊針對各種語言準備了不同的鏡像作為構建宿主。
build.command=sh build.sh
這一行的意思是,使用一個特定的腳本來進行自定義構建,因為構建有時候需要處理的東西很多,一行命令解決不了,所以需要一個自定義構建腳本,此處我設置的腳本在代碼根目錄下,創建一個build.sh腳本。如果你的構建隻有1句話,可以直接寫在“=”號後麵,使用自定義腳本是為了更清晰和更靈活。
↓↓↓↓ build.sh腳本內容:
echo "##### npm to taobao"
npm install -g cnpm --registry=https://registry.npm.taobao.org
echo "##### cnpm install --save"
cnpm install --save
echo "##### cnpm build"
cnpm run build
逐句解釋:
npm install -g cnpm --registry=https://registry.npm.taobao.org
使用npm的中國全量資源,cnpm由淘寶維護,國內最快的鏡像站點。切換的目的就是為了構建快一些,因為RDC目前暫時不支持海外構建,所以不改可能會導致構建很慢。
cnpm install --save
最核心的一句話,安裝所有第三方庫依賴,這一句執行後如果正確,就會生成node_modules文件夾了。也意味著如果你使用開源框架,你的angularjs、vue等框架就安裝成功了。
cnpm run build
這句話是使用webpack完成打包工作,前端項目通常是生成dist文件夾,此文件夾為項目的產出物。
我們已經完成了應用的創建+流水線的修改,那麼我們運行一次構建試一下,隻需要點擊【運行流水線】按鈕即可,運行後等幾秒刷新一下頁麵,效果如下:
可以看到執行時間、版本號、日誌、操作人等信息。
如果構建失敗了,可以通過構建流程----日誌詳情麵板看到具體的錯誤原因,有日誌排查起來不太難,但是RDC的構建還是偏向黑盒,所以盡量熟練或在本地先把相關命令跑通後再上傳到==xxx.release==文件裏去進行RDC構建。
可以看到初始的版本號是:v0.0.1-1,如果你的構建一直失敗,版本號會變成v0.0.1-3、v0.0.1-8、v0.0.1-18、v0.0.1-N。
如果你的流水線全流程跑完了,則會自動疊加一個小版本號變為v0.0.2-1,所以這種構建方式清晰明了,還算好用。
三、如何輸出為一個Docker鏡像
我們已經完成了代碼的打包編譯工作,下一步我們需要把完整的代碼封裝成一個Docker鏡像,我們需要對==xxx.release==文件做如下改動:
# 語言類型,需要修改,否則無法調用對應的構建環境
code.language=node8.x
#構建命令
build.command=sh build.sh
# Docker 構建配置
docker.file=Dockerfile
# Docker鏡像構建之後push的倉庫地址
docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced
docker.tag=ci-${PACKAGE_LABEL}
# 應用部署腳本,先注釋掉,暫時用不上
# deploy.appctl.path=deploy.sh
相對於單純的構建,如果需要生成Docker鏡像則需要補充幾個配置項,拆解說明如下:
docker.file=Dockerfile
指明dockerfile文件的位置和文件名,默認就是根目錄下的Dockerfile文件。
docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced
指定你的docker鏡像倉庫,建議使用阿裏雲提供的倉庫,免費,速度快,可以加速docker hub的內容,無縫對接RDC服務,地址是 dev.aliyun.com ,此處的**xxx**對應的是你的名稱空間,**abced**對應的是你的鏡像名稱。
docker.tag=ci-${PACKAGE_LABEL}-${TIMESTAMP}
這裏指定你的docker鏡像的tag名,使用了環境變量進行拚接。
${PACKAGE_LABEL}代表的是包名,這個參數在流水線配置裏可以改,默認是default。
${TIMESTAMP}代表的是當前時間戳,格式是:20171008224350 這種樣子。
有的項目一份代碼可能產生多個docker鏡像就需要通過這種方式來動態生成tag名,防止覆蓋,也便於回滾。
關於構建傳參,可以參考這個文章: https://help.aliyun.com/document_detail/59297.html
那麼此處最終生成的tag名是這樣的: ci-default-20171008224350
結合倉庫名和鏡像名,最終會生成鏡像tag地址為:
registry.cn-hangzhou.aliyuncs.com/xxx/abced:ci-default-20171008224350
四、後記
NodeJS構建 + Docker構建就說到這裏,因為主要是為了介紹RDC,所以Docker部分就挑重點講了,如何編寫Dockerfile文件請自行學習。
輸出成Docker鏡像後,如何使用RDC部署到容器相關問題我會單獨開一個文章來分享。
最後更新:2017-10-11 11:04:08
上一篇:
黑客通過雲計算提供DDoS攻擊服務
下一篇:
2012年五個最致命的移動惡意軟件排行
Selenium的PageFactory & PageObject 在大型項目中的應用
Tomcat啟動報錯:java.lang.IllegalArgumentException: Can't convert argument:null
軟件事務內存導論(六)配置Akka事務
如何在 Linux 中重置 MySQL 或者 MariaDB 的 root 密碼
傳感器在安防智能化發展中的重大作用
LINUX常用命令整理
順應大數據時代創新社會治理
Java SSM 客戶管理 庫存管理 銷售報表 項目源碼 商戶管理係統
使用inotify實現實時文件同步shell腳本
分布式數據庫和集群項目