CI 持續集成 - 阿里云云效

file

前兩個月給公司搭建了一套持續集成,用的是阿里雲的「雲效」,「雲效」有免費一個月的試用版,有興趣的朋友能夠玩一玩,開闊一下知識範圍。開始以前你須要簡單瞭解一下 雲效文檔哦php

概念

持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。它的好處主要有兩個。html

  1. 快速發現錯誤。每完成一點更新,就集成到主幹,能夠快速發現錯誤,定位錯誤也比較容易。
  2. 防止分支大幅偏離主幹。若是不是常常集成,主幹又在不斷更新,會致使之後集成的難度變大,甚至難以集成。

持續集成大體流程

提交

流程的第一步,是開發者向代碼倉庫提交代碼。全部後面的步驟都始於本地代碼的一次提交(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

file

新建項目以後,選擇當前建立的項目:

file

流水線配置

點擊左側流水線欄目,註冊一條項目流水線

file

將流水線關聯到當前項目的代碼庫之中,而且選擇代碼推送後觸發流水線的分支

file

點擊流水線第一個階段,通常爲名稱設爲「構建」,選項解釋以下:

  1. 分支名稱:這裏的分支名稱是在阿里雲虛擬主機中構建時拉取的分支,請根據當前部署環境選擇對應的分支
  2. 構建配置:有時咱們須要構建產生不一樣內容的包,用於不一樣的運行環境(好比集成測試環境和生產環境)雲效流水線上的構建任務根據指定 Git 庫源代碼根目錄下的 <應用名稱>.release 文件,進行構建打包工做,以便隨後流水線上的部署任務進行部署 release 全部配置選項

file

在下面的高級配置之中有個「包」的概念,其意思就是構建的時候根據你配置的包生成多個環境,如配圖中會生成「Testing 測試環境」「Staging 預發佈環境」

file

包標籤中的參數會在阿里雲虛擬主機構建的時候生成系統環境變量,而後 Shell 獲取
PS:構建成功以後,阿里雲虛擬主機會把項目壓縮打包成 tgz 格式,而後上傳到一個資源空間之中,以便部署階段下載壓縮包

下一個階段爲部署階段,固然你能夠在流水線中新增其餘階段如「測試階段」,在部署階段選擇對應的包標籤配置、應用、環境便可

file

至此流水線配置結束 流水線幫助文檔

部署環境配置

點擊部署環境

file

在部署配置之中咱們須要作以下事情,「部署流程將按照下面排序進行」

  1. 下載路徑:設置下載路徑,其意是將資源空間之中的壓縮包下載到你企業關聯的服務器上
  2. Stop:此項設置一個 Shell 或其餘操做腳本,通常須要把老項目清理掉
  3. 解壓目錄:將下載後的項目壓縮包解壓到指定的目錄
  4. Start:此項設置一個 Shell 或其餘操做腳本,通常狀況是在阿里雲服務器上面初始化項目,如「數據遷移」
  5. 執行用戶:在阿里雲服務器的最大權限用戶通常爲:root

私密配置項,有時候涉及一些私密信息,不適合放在代碼庫中如數據庫配置,以包標籤前綴區分環境配置 私密配置概念

file

file

至此雲效後臺配置完成

代碼庫中構建配置腳本

構建的時候阿里雲虛擬機,會以 <應用名>.release 文件執行構建方式「這個文件會放到項目根目錄」

  1. code.language 是阿里雲虛擬機須要的環境配置,配圖中爲 php 7.0
  2. build.command 爲構建時自定義的 Shell 命令,配圖中執行了一個 Shell 腳本

file

Build Shell 腳本,在此腳本中將倉庫代碼構建成一個完整可運行的項目

  1. 在這次可獲取「包標籤」中自定義的環境變量
  2. 獲取包標籤環境表裏爲「PACKAGE_LABEL」
  3. 私密配置項的內容會在構建時生成一個文件其名稱固定爲「rdc_security_config.properties」放在項目根目錄下,可讀取文件中的配置來填入 .env 中
  4. 注意 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 文件

file

cp .env.example.${PACKAGE_LABEL} .env

服務器中部署配置腳本

就是咱們在部署環境中指定的腳本

file

項目中這兩個腳本分別作了以下操做

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!'

固然上面只是一個簡單的刪除老項目拷貝新項目,大家能夠根據本身項目實際需求初始化項目。

PS

如今推送流水線設置的分支會自動觸發「流水線工做」,若是流水線某個階段工做失敗可到後臺查看失敗緣由方便排除錯誤

file

最後附上一張公司實際流水線圖

file

雲效地址
雲效文檔

Good Job Done !

相關文章
相關標籤/搜索