云效(原RDC)如何构建一个基于Composer的PHP项目
最近在將公司的持續(xù)集成架構(gòu)做一個(gè)系統(tǒng)的調(diào)整,調(diào)整過程中受到了RDC團(tuán)隊(duì)大量的幫助,所以利用國(guó)慶時(shí)間寫了幾篇RDC的分享,希望能讓更多的人了解和用好RDC這個(gè)產(chǎn)品。
我會(huì)把我最近3個(gè)月的使用體會(huì)分成5個(gè)部分:使用RDC的動(dòng)機(jī)、PHP項(xiàng)目集成、JS項(xiàng)目集成、JAVA項(xiàng)目集成、Docker類項(xiàng)目集成這5個(gè)分支來寫
因?yàn)榻赗DC的迭代比較頻繁,所以我的分享會(huì)比較的淺,點(diǎn)到為止,僅供參考,目錄:
1、RDC如何耦合進(jìn)我們的業(yè)務(wù)
2、如何構(gòu)建一個(gè)基于Composer的PHP項(xiàng)目
3、如何構(gòu)建一個(gè)基于NodeJS的前后端項(xiàng)目
4、如何構(gòu)建一個(gè)基于Maven的Java項(xiàng)目
5、RDC + 容器服務(wù)完成持續(xù)集成
一、RDC基礎(chǔ)操作
在開始一切之前您需要熟悉RDC的一些基礎(chǔ)操作,創(chuàng)建一個(gè)項(xiàng)目,然后在這個(gè)項(xiàng)目中創(chuàng)建一個(gè)應(yīng)用,然后讓這個(gè)應(yīng)用關(guān)聯(lián)某個(gè)代碼分支。這樣基礎(chǔ)工作就完成了,我這里不再贅述了,因?yàn)楸容^簡(jiǎn)單,只需要注冊(cè)個(gè)阿里云賬號(hào),然后去 rdc.aliyun.com 創(chuàng)建/加入個(gè)企業(yè)就行了。
本文所有的體驗(yàn)均基于【自由模式】的應(yīng)用。
值得一提的是,應(yīng)用代碼源目前支持的是阿里云的代碼倉(cāng)庫,基于gitlab,地址是 code.aliyun.com,從我2年的使用經(jīng)驗(yàn)來看,還算好用,也不收費(fèi),較為靠譜。
在創(chuàng)建應(yīng)用時(shí),我們需要選擇對(duì)應(yīng)的配置,如下圖:
創(chuàng)建完應(yīng)用后,進(jìn)入【項(xiàng)目】--》【流水線】,找到剛才創(chuàng)建應(yīng)用的【同名流水線】
點(diǎn)擊流水線名稱可以看到具體的流水線運(yùn)行情況和對(duì)應(yīng)節(jié)點(diǎn),如下圖:
可以看到有4個(gè)面板:構(gòu)建、日常、預(yù)發(fā)、正式。
分別對(duì)應(yīng)的是:構(gòu)建打包、發(fā)布到日常環(huán)境、發(fā)布到預(yù)發(fā)環(huán)境、發(fā)布到正式環(huán)境。
RDC在創(chuàng)建應(yīng)用時(shí)自動(dòng)的為你生成了一個(gè)標(biāo)準(zhǔn)模板流水線,但是我們一般用不著,所以需要對(duì)流水線進(jìn)行修改,去除無用的節(jié)點(diǎn),添加我們自己的配置。點(diǎn)擊界面上的【編輯流水線】按鈕就可以進(jìn)入修改界面。
我們先從構(gòu)建開始,所以先暫時(shí)刪除日常、預(yù)發(fā)、正式這3個(gè)部署節(jié)點(diǎn),僅保留構(gòu)建這一個(gè)節(jié)點(diǎn)即可。下面的配置暫時(shí)不進(jìn)行調(diào)整。刪除完畢后保存流水線即可,效果如下:
至此我們已經(jīng)完成了基礎(chǔ)的準(zhǔn)備工作,下一步就開始進(jìn)行PHP代碼的構(gòu)建工作了。
在開始下一步工作之前,請(qǐng)重新git pull一下您的代碼到本地,會(huì)看到一個(gè)由RDC服務(wù)自動(dòng)生成的配置文件:==xxx.release== 這個(gè)文件相當(dāng)重要,請(qǐng)注意,下面將會(huì)說明如何通過此文件完成個(gè)性化構(gòu)建。
二、基于Composer的PHP項(xiàng)目構(gòu)建
有人可能會(huì)問,PHP不是動(dòng)態(tài)腳本語言嗎,為什么需要構(gòu)建?
這是因?yàn)镻HP的一些第三方類、開源框架等代碼需要通過Composer包管理來進(jìn)行安裝及維護(hù),如果你的代碼里沒有使用到Composer,請(qǐng)?zhí)^本章節(jié)。
因?yàn)镃omposer并不推薦將vendor文件夾上傳到代碼倉(cāng)庫,所以我們通常只在本地保留vendor文件夾用于開發(fā)和調(diào)試。
但是這個(gè)文件夾里的代碼是線上運(yùn)行必須的,所以我們需要通過一個(gè)構(gòu)建的過程來安裝所有PHP項(xiàng)目依賴庫,也就是生成vendor文件夾。
這里需要找到我們上一章節(jié)中提到的:==xxx.release== 文件,xxx代表你的應(yīng)用名,所以我這里看到的文件名是:ms-autotags.release
這個(gè)文件的配置規(guī)范可以參考:==https=//help.aliyun.com/document_detail/59293.html==
打開這個(gè)文件可以看到,已經(jīng)有一些預(yù)先定義好的配置:
# 構(gòu)建源碼語言類型 code.language=scripts# 應(yīng)用部署腳本 deploy.appctl.path=deploy.sh# Docker鏡像構(gòu)建之后push的倉(cāng)庫地址 docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced上面的配置是不能用的,我們需要將其修改為如下內(nèi)容:
# 語言類型,需要改為PHP,否則無法調(diào)用對(duì)應(yīng)的構(gòu)建環(huán)境 code.language=php7.0# 代碼構(gòu)建基礎(chǔ)鏡像 build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1#構(gòu)建命令 build.command=sh build.sh# 應(yīng)用部署腳本,先注釋掉,暫時(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的同學(xué),那么應(yīng)該比較好理解,RDC的構(gòu)建是通過Docker容器技術(shù)實(shí)現(xiàn)的,類似于配置好環(huán)境的jenkins構(gòu)建機(jī),RDC團(tuán)隊(duì)針對(duì)各種語言準(zhǔn)備了不同的鏡像作為構(gòu)建宿主。
build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1# 可根據(jù)你的需要切換使用下面這個(gè)構(gòu)建環(huán)境# build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php5.6
代表使用一個(gè)特定的鏡像作為構(gòu)建環(huán)境,用戶暫時(shí)無法自定義鏡像并在RDC中使用。目前你看到的這個(gè)配置值是因?yàn)镽DC團(tuán)隊(duì)在迭代更重要的功能沒有精力維護(hù)PHP版本的打包環(huán)境,所以我代為生成并提交了2個(gè)PHP版本作為臨時(shí)構(gòu)建環(huán)境,相對(duì)官方的構(gòu)建環(huán)境我的更全面些,支持git、php的大部分?jǐn)U展、mongo擴(kuò)展、composer、phpunit等。
因?yàn)橛行┑谌綆彀惭b時(shí),需要檢測(cè)php擴(kuò)展的,所以必須開啟,否則沒辦法安裝第三方庫。
build.command=sh build.sh
這一行的意思是,使用一個(gè)特定的腳本來進(jìn)行自定義構(gòu)建,因?yàn)闃?gòu)建有時(shí)候需要處理的東西很多,一行命令解決不了,所以需要一個(gè)自定義構(gòu)建腳本,此處我設(shè)置的腳本在代碼根目錄下,創(chuàng)建一個(gè)build.sh腳本。如果你的構(gòu)建只有1句話,可以直接寫在“=”號(hào)后面,使用自定義腳本是為了更清晰和更靈活。
↓↓↓↓ build.sh腳本內(nèi)容:
echo "##### delete vendor dir" rm -rf ./vendorecho "##### composer to china" composer config -g repo.packagist composer https://packagist.phpcomposer.comecho "##### php composr install" composer install --no-dev逐句解釋:
rm -rf ./vendor先刪除掉目錄中已有的vendor文件夾,主要原因是:
1.防止你不小心向git提交了這個(gè)文件夾,先刪掉防止沖突和污染。
2.防止RDC的構(gòu)建有緩存,強(qiáng)行刪除后每次構(gòu)建重新生成。
composer config -g repo.packagist composer https://packagist.phpcomposer.com讓composer使用中國(guó)區(qū)鏡像,目的就是為了構(gòu)建快一些,按個(gè)人喜好,你用美國(guó)和日本鏡像也沒事,就是會(huì)很慢,因?yàn)镽DC目前暫時(shí)不支持海外構(gòu)建。
composer install最核心的一句話,安裝所有php第三方庫依賴,這一句執(zhí)行后如果正確,就會(huì)生成vendor文件夾了。也意味著如果你使用開源PHP框架,你的tp5、yii2、lumen、laravel等框架就安裝成功了。
提一下,如果你需要構(gòu)建更快,可以嘗試使用 composer install --no-dev ,不安裝開發(fā)依賴。
我們已經(jīng)完成了應(yīng)用的創(chuàng)建+流水線的修改,那么我們運(yùn)行一次構(gòu)建試一下,只需要點(diǎn)擊【運(yùn)行流水線】按鈕即可,運(yùn)行后等幾秒刷新一下頁面,效果如下:
可以看到執(zhí)行時(shí)間、版本號(hào)、日志、操作人等信息。
如果構(gòu)建失敗了,可以通過構(gòu)建流程----日志詳情面板看到具體的錯(cuò)誤原因,有日志排查起來不太難,但是RDC的構(gòu)建還是偏向黑盒,所以盡量熟練或在本地先把相關(guān)命令跑通后再上傳到==xxx.release==文件里去進(jìn)行RDC構(gòu)建。
可以看到初始的版本號(hào)是:v0.0.1-1,如果你的構(gòu)建一直失敗,版本號(hào)會(huì)變成v0.0.1-3、v0.0.1-8、v0.0.1-18、v0.0.1-N。
如果你的流水線全流程跑完了,則會(huì)自動(dòng)疊加一個(gè)小版本號(hào)變?yōu)関0.0.2-1,所以這種構(gòu)建方式清晰明了,還算好用。
三、如何輸出為一個(gè)Docker鏡像
我們已經(jīng)完成了PHP依賴的安裝,下一步我們需要把完整的代碼封裝成一個(gè)Docker鏡像,我們需要對(duì)==xxx.release==文件做如下改動(dòng):
# 語言類型,需要改為PHP,否則無法調(diào)用對(duì)應(yīng)的構(gòu)建環(huán)境 code.language=php7.0# 代碼構(gòu)建基礎(chǔ)鏡像 build.image=registry.cn-hangzhou.aliyuncs.com/lxepoo/php-autobuild:php7.1#構(gòu)建命令 build.command=sh build.sh# Docker 構(gòu)建配置 docker.file=Dockerfile# Docker鏡像構(gòu)建之后push的倉(cāng)庫地址 docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abceddocker.tag=ci-${PACKAGE_LABEL} # 應(yīng)用部署腳本,先注釋掉,暫時(shí)用不上 # deploy.appctl.path=deploy.sh相對(duì)于單純的構(gòu)建,如果需要生成Docker鏡像則需要補(bǔ)充幾個(gè)配置項(xiàng),拆解說明如下:
docker.file=Dockerfile指明dockerfile文件的位置和文件名,默認(rèn)就是根目錄下的Dockerfile文件。
docker.repo=registry.cn-hangzhou.aliyuncs.com/xxx/abced
指定你的docker鏡像倉(cāng)庫,建議使用阿里云提供的倉(cāng)庫,免費(fèi),速度快,可以加速docker hub的內(nèi)容,無縫對(duì)接RDC服務(wù),地址是 dev.aliyun.com ,此處的xxx對(duì)應(yīng)的是你的名稱空間,abced對(duì)應(yīng)的是你的鏡像名稱。
docker.tag=ci-${PACKAGE_LABEL}-${TIMESTAMP}
這里指定你的docker鏡像的tag名,使用了環(huán)境變量進(jìn)行拼接。
${PACKAGE_LABEL}代表的是包名,這個(gè)參數(shù)在流水線配置里可以改,默認(rèn)是default。
${TIMESTAMP}代表的是當(dāng)前時(shí)間戳,格式是:20171008224350 這種樣子。
有的項(xiàng)目一份代碼可能產(chǎn)生多個(gè)docker鏡像就需要通過這種方式來動(dòng)態(tài)生成tag名,防止覆蓋,也便于回滾。
關(guān)于構(gòu)建傳參,可以參考這個(gè)文章: https://help.aliyun.com/document_detail/59297.html
那么此處最終生成的tag名是這樣的: ci-default-20171008224350
結(jié)合倉(cāng)庫名和鏡像名,最終會(huì)生成鏡像tag地址為:
registry.cn-hangzhou.aliyuncs.com/xxx/abced:ci-default-20171008224350
四、后記
PHP構(gòu)建 + Docker構(gòu)建就說到這里,因?yàn)橹饕菫榱私榻BRDC,所以Docker部分就挑重點(diǎn)講了,如何編寫Dockerfile文件請(qǐng)自行學(xué)習(xí)。
輸出成Docker鏡像后,如何使用RDC部署到容器相關(guān)問題我會(huì)單獨(dú)開一個(gè)文章來分享。
總結(jié)
以上是生活随笔為你收集整理的云效(原RDC)如何构建一个基于Composer的PHP项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server:使用 PIVOT
- 下一篇: timestamp与timedelta,