前两个月给公司搭建了一套持续集成,用的是阿里云的「云效」,「云效」有免费一个月的试用版,有兴趣的朋友能够玩一玩,开阔一下知识范围。开始以前你须要简单了解一下 云效文档哦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 !