前兩個月給公司搭建了一套持續集成,用的是阿里雲的「雲效」,「雲效」有免費一個月的試用版,有興趣的朋友能夠玩一玩,開闊一下知識範圍。開始以前你須要簡單瞭解一下 雲效文檔哦php
持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。它的好處主要有兩個。html
流程的第一步,是開發者向代碼倉庫提交代碼。全部後面的步驟都始於本地代碼的一次提交(commit)。git
所謂構建,指的是將源碼轉換爲能夠運行的實際代碼,好比安裝依賴,配置各類資源(樣式表、JS腳本、圖片)等等。shell
全面測試,單元測試和集成測試都要跑,有條件的話,也要作端對端測試。全部測試以自動化爲主,少數沒法自動化的測試用例,就要人工跑。數據庫
經過了第二輪測試,當前代碼就是一個能夠直接部署的版本(artifact)。將這個版本的全部文件打包( tar filename.tar * )存檔,發到生產服務器。bootstrap
生產服務器將打包文件,解包成本地的一個目錄,再將運行路徑的符號連接(symlink)指向這個目錄,而後從新啓動應用。這方面的部署工具備 Ansible,Chef,Puppet 等。bash
一旦當前版本發生問題,就要回滾到上一個版本的構建結果。最簡單的作法就是修改一下符號連接,指向上一個版本的目錄。服務器
更詳細的說明:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html微信
在雲效後臺中,首先爲項目註冊應用,而且關聯代碼庫:composer
新建項目以後,選擇當前建立的項目:
點擊左側流水線欄目,註冊一條項目流水線
將流水線關聯到當前項目的代碼庫之中,而且選擇代碼推送後觸發流水線的分支
點擊流水線第一個階段,通常爲名稱設爲「構建」,選項解釋以下:
<應用名稱>.release
文件,進行構建打包工做,以便隨後流水線上的部署任務進行部署 release 全部配置選項。在下面的高級配置之中有個「包」的概念,其意思就是構建的時候根據你配置的包生成多個環境,如配圖中會生成「Testing 測試環境」「Staging 預發佈環境」
包標籤中的參數會在阿里雲虛擬主機構建的時候生成系統環境變量,而後 Shell 獲取
PS:構建成功以後,阿里雲虛擬主機會把項目壓縮打包成 tgz 格式,而後上傳到一個資源空間之中,以便部署階段下載壓縮包
下一個階段爲部署階段,固然你能夠在流水線中新增其餘階段如「測試階段」,在部署階段選擇對應的包標籤配置、應用、環境便可
至此流水線配置結束 流水線幫助文檔
點擊部署環境
在部署配置之中咱們須要作以下事情,「部署流程將按照下面排序進行」
私密配置項,有時候涉及一些私密信息,不適合放在代碼庫中如數據庫配置,以包標籤前綴區分環境配置 私密配置概念
至此雲效後臺配置完成
構建的時候阿里雲虛擬機,會以 <應用名>.release 文件執行構建方式「這個文件會放到項目根目錄」
Build Shell 腳本,在此腳本中將倉庫代碼構建成一個完整可運行的項目
#!/bin/bash echo "開始構建 ${PACKAGE_LABEL} 環境" # Git 構建 git pull origin ${ENV_BRANCH} git submodule init git submodule update echo "結束構建 ${ENV_BRANCH}" # 安裝依賴 echo "開始安裝依賴" composer config -g repo.packagist composer https://packagist.phpcomposer.com composer install echo "結束安裝依賴" # 設置配置 echo "開始配置項目" cp .env.example.${PACKAGE_LABEL} .env S_DB_PASSWORD=`./find.sh ${PACKAGE_LABEL}_DB_PASSWORD` S_DB_USERNAME=`./find.sh ${PACKAGE_LABEL}_DB_USERNAME` S_DB_DATABASE=`./find.sh ${PACKAGE_LABEL}_DB_DATABASE` S_DB_HOST=`./find.sh ${PACKAGE_LABEL}_DB_HOST` echo "數據庫配置讀取成功......" sed -i -e "s/DB_HOST=127.0.0.1/DB_HOST=${S_DB_HOST}/g" .env sed -i -e "s/DB_DATABASE=homestead/DB_DATABASE=${S_DB_DATABASE}/g" .env sed -i -e "s/DB_USERNAME=homestead/DB_USERNAME=${S_DB_USERNAME}/g" .env sed -i -e "s/DB_PASSWORD=secret/DB_PASSWORD=${S_DB_PASSWORD}/g" .env echo "數據庫配置 Done" # 正式服務器 Redis 配置 if [ "${PACKAGE_LABEL}" == 'production' ]; then sed -i -e "s/REDIS_HOST=127.0.0.1/REDIS_HOST=${ENV_REDIS_HOST}/g" .env sed -i -e "s/REDIS_PASSWORD=null/REDIS_PASSWORD=${ENV_REDIS_PASSWORD}/g" .env echo "Redis 服務配置完成" fi # 百度地圖配置 sed -i -e "s/Baidu_Map_API_KEY=/Baidu_Map_API_KEY=${ENV_BAIDU_MAP_API_KEY}/g" .env echo "百度地圖配置完成" sed -i -e "s/WECHAT_PAYMENT_APPID=/WECHAT_PAYMENT_APPID=${ENV_WECHAT_PAYMENT_APPID}/g" .env sed -i -e "s/WECHAT_PAYMENT_MCH_ID=/WECHAT_PAYMENT_MCH_ID=${ENV_WECHAT_PAYMENT_MCH_ID}/g" .env sed -i -e "s/WECHAT_PAYMENT_KEY=/WECHAT_PAYMENT_KEY=${ENV_WECHAT_PAYMENT_KEY}/g" .env echo "微信配置 Done" sed -i -e "s/WECHAT_OPEN_PLATFORM_APPID=/WECHAT_OPEN_PLATFORM_APPID=${ENV_WECHAT_OPEN_PLATFORM_APPID}/g" .env sed -i -e "s/WECHAT_OPEN_PLATFORM_SECRET=/WECHAT_OPEN_PLATFORM_SECRET=${ENV_WECHAT_OPEN_PLATFORM_SECRET}/g" .env sed -i -e "s/WECHAT_OPEN_PLATFORM_TOKEN=/WECHAT_OPEN_PLATFORM_TOKEN=${ENV_WECHAT_OPEN_PLATFORM_TOKEN}/g" .env sed -i -e "s/WECHAT_OPEN_PLATFORM_AES_KEY=/WECHAT_OPEN_PLATFORM_AES_KEY=${ENV_WECHAT_OPEN_PLATFORM_AES_KEY}/g" .env echo "微信開放平臺配置 Done" sed -i -e "s/OSS_ID=/OSS_ID=${ENV_OSS_ID}/g" .env sed -i -e "s/OSS_KEY=/OSS_KEY=${ENV_OSS_KEY}/g" .env sed -i -e "s/OSS_BUCKET=/OSS_BUCKET=${ENV_OSS_BUCKET}/g" .env sed -i -e "s/OSS_ENDPOINT=/OSS_ENDPOINT=${ENV_OSS_ENDPOINT}/g" .env sed -i -e "s/OSS_SSL=/OSS_SSL=${ENV_OSS_SSL}/g" .env sed -i -e "s/OSS_IS_CNAME=/OSS_IS_CNAME=${ENV_OSS_IS_CNAME}/g" .env echo "OSS 配置 Done" sed -i -e "s/APP_ENV=local/APP_ENV=${PACKAGE_LABEL}/g" .env php artisan key:generate composer du chmod -R 777 storage chmod -R 777 bootstrap echo "${PACKAGE_LABEL} 環境構建成功!"
這裏有個小技巧,有可能不一樣環境的 .env 的配置項 KEY 不同,如:測試服務器中用 QINIU 正式服務器中用 OSS,那麼能夠把 .env.example
修改成對應環境的 .env.example.testing
,以後就能夠獲取不一樣環境的 .env 文件
cp .env.example.${PACKAGE_LABEL} .env
就是咱們在部署環境中指定的腳本
項目中這兩個腳本分別作了以下操做
clear_old.sh
#!/bin/bash rm -rf /var/www/CI/yydy-rms echo 'old project clear !'
init.sh
#!/bin/bash cd /var/www/CI/yydy-rms php artisan migrate composer du echo 'project is ready!'
固然上面只是一個簡單的刪除老項目拷貝新項目,大家能夠根據本身項目實際需求初始化項目。
如今推送流水線設置的分支會自動觸發「流水線工做」,若是流水線某個階段工做失敗可到後臺查看失敗緣由方便排除錯誤
最後附上一張公司實際流水線圖
Good Job Done !