RDC如何構建一個基於Composer的PHP項目
最近在將公司的持續集成架構做一個係統的調整,調整過程中受到了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個部署節點,僅保留構建這一個節點即可。下麵的配置暫時不進行調整。刪除完畢後保存流水線即可,效果如下:
至此我們已經完成了基礎的準備工作,下一步就開始進行PHP代碼的構建工作了。
在開始下一步工作之前,請重新git pull一下您的代碼到本地,會看到一個由RDC服務自動生成的配置文件:==xxx.release== 這個文件相當重要,請注意,下麵將會說明如何通過此文件完成個性化構建。
二、基於Composer的PHP項目構建
有人可能會問,PHP不是動態腳本語言嗎,為什麼需要構建?
這是因為PHP的一些第三方類、開源框架等代碼需要通過Composer包管理來進行安裝及維護,如果你的代碼裏沒有使用到Composer,請跳過本章節。
因為Composer並不推薦將vendor文件夾上傳到代碼倉庫,所以我們通常隻在本地保留vendor文件夾用於開發和調試。
但是這個文件夾裏的代碼是線上運行必須的,所以我們需要通過一個構建的過程來安裝所有PHP項目依賴庫,也就是生成vendor文件夾。
這裏需要找到我們上一章節中提到的:==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
上麵的配置是不能用的,我們需要將其修改為如下內容:
# 語言類型,需要改為PHP,否則無法調用對應的構建環境
code.language=php7.0
# 代碼構建基礎鏡像
build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1
#構建命令
build.command=sh build.sh
# 應用部署腳本,先注釋掉,暫時用不上
# deploy.appctl.path=deploy.sh
↓↓↓↓ 配置說明:
code.language=php7.0
代表使用的是php7作為代碼語言類型。支持以下枚舉:
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.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1
# 可根據你的需要切換使用下麵這個構建環境
# build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php5.6
代表使用一個特定的鏡像作為構建環境,用戶暫時無法自定義鏡像並在RDC中使用。目前你看到的這個配置值是因為RDC團隊在迭代更重要的功能沒有精力維護PHP版本的打包環境,所以我代為生成並提交了2個PHP版本作為臨時構建環境,相對官方的構建環境我的更全麵些,支持git、php的大部分擴展、mongo擴展、composer、phpunit等。
因為有些第三方庫安裝時,需要檢測php擴展的,所以必須開啟,否則沒辦法安裝第三方庫。
build.command=sh build.sh
這一行的意思是,使用一個特定的腳本來進行自定義構建,因為構建有時候需要處理的東西很多,一行命令解決不了,所以需要一個自定義構建腳本,此處我設置的腳本在代碼根目錄下,創建一個build.sh腳本。如果你的構建隻有1句話,可以直接寫在“=”號後麵,使用自定義腳本是為了更清晰和更靈活。
↓↓↓↓ build.sh腳本內容:
echo "##### delete vendor dir"
rm -rf ./vendor
echo "##### composer to china"
composer config -g repo.packagist composer https://packagist.phpcomposer.com
echo "##### php composr install"
composer install --no-dev
逐句解釋:
rm -rf ./vendor
先刪除掉目錄中已有的vendor文件夾,主要原因是:
1.防止你不小心向git提交了這個文件夾,先刪掉防止衝突和汙染。
2.防止RDC的構建有緩存,強行刪除後每次構建重新生成。
composer config -g repo.packagist composer https://packagist.phpcomposer.com
讓composer使用中國區鏡像,目的就是為了構建快一些,按個人喜好,你用美國和日本鏡像也沒事,就是會很慢,因為RDC目前暫時不支持海外構建。
composer install
最核心的一句話,安裝所有php第三方庫依賴,這一句執行後如果正確,就會生成vendor文件夾了。也意味著如果你使用開源PHP框架,你的tp5、yii2、lumen、laravel等框架就安裝成功了。
提一下,如果你需要構建更快,可以嚐試使用 composer install --no-dev
,不安裝開發依賴。
我們已經完成了應用的創建+流水線的修改,那麼我們運行一次構建試一下,隻需要點擊【運行流水線】按鈕即可,運行後等幾秒刷新一下頁麵,效果如下:
可以看到執行時間、版本號、日誌、操作人等信息。
如果構建失敗了,可以通過構建流程----日誌詳情麵板看到具體的錯誤原因,有日誌排查起來不太難,但是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鏡像
我們已經完成了PHP依賴的安裝,下一步我們需要把完整的代碼封裝成一個Docker鏡像,我們需要對==xxx.release==文件做如下改動:
# 語言類型,需要改為PHP,否則無法調用對應的構建環境
code.language=php7.0
# 代碼構建基礎鏡像
build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1
#構建命令
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
四、後記
PHP構建 + Docker構建就說到這裏,因為主要是為了介紹RDC,所以Docker部分就挑重點講了,如何編寫Dockerfile文件請自行學習。
輸出成Docker鏡像後,如何使用RDC部署到容器相關問題我會單獨開一個文章來分享。
最後更新:2017-10-10 10:33:54