使用deployer部署工具配合阿里云RDC完成部署,持续交付及开发应用的四层环境

首先需要了解一下,开发应用的四层环境

  1. 开发环境(Development)
    这个环境可以是一个独立开发者使用,也可以是较少的几个人一起使用.这个环境中对
    代码的任何改动都不会影响其他人,所以可以随便改.
  2. 集成环境(Integration)
    各个开发者开发的不同功能代码都会提交到这个环境进行整合,进行测试,以保证进入预发布环境没有问题.根据实际开发情况,集成环境和开发环境也可以使用同一个环境,具体会在下文的实践中介绍.
  3. 预演环境(Staging)
    预发布环境需要尽可能的和生产环境一样.连接测试数据库,这个环境也可作为演示和培训.
  4. 生产环境(Production)
    就是正式上线的环境了,项目可能部署在服务器集群上.

我实际使用的环境是:production/staging/testing/integration

  • production:上线的正式环境(多服务器部署)
  • staging:连接着staging对应的数据库,尽量模拟正式环境数据.(多服务器部署,因为当时刚开始弄多服务器* 部署/负载/redis等,所以这个也是为了测试项目对接各种服务是否正常;另外因为正式环境数据多,数据种类多,所以可能一些情况会在这个环境发现)
  • testing:连接测试数据库
  • integration:连接测试数据库,日常的开发集成环境,直接上传修改的文件到服务器.其他三个环境需要走部署流程.

(此外还有个人电脑上的本地环境)


正式开始

在阿里云RDC中创建项目之后,创建应用,分支选择自由模式.

创建应用的时候需要关联分支,会自动在master分支下给你创建好发布配置文件,名字是[应用名].release.如下:

# 请参考 https://help.aliyun.com/document_detail/59293.html 了解更多关于release文件的编写方式 

# 构建源码语言类型
code.language=php7.0

# 应用部署脚本
deploy.appctl.path=deploy.sh

deploy.appctl.path=deploy.sh是你源码中的部署脚本,详见在代码库中存储部署脚本.
我之前用RDC的时候还没这个东西,所以我项目release的配置都是:

# 构建源码语言类型
code.language=scripts
# 要部署到服务器上的文件,我在里面放了deployer脚本
build.output=deploy/
Screen Shot 2017-10-27 at 7.01.11 PM.png

然后配置应用的环境:

Screen Shot 2017-10-27 at 6.47.16 PM.png

你需要配置的地方有:资源管理/部署策略/部署配置

资源管理:配置要部署的机器.我是日常环境配置一台.预发和正式配置多台.因为当时刚开始使用多服务器运行项目,我怕出问题,所以需要有一个给我测试多服务运行状态的环境.
部署策略:我都选的是分批发布不暂停
部署配置:

Screen Shot 2017-10-27 at 7.02.08 PM.png

下载路径中的文件就是发布配置文件中设置的build.output参数.

这个RDC脚本部署执行起来的流程就是:

  1. 将源码中的build.output设置的文件打包传到服务器的下载路径
  2. 执行stop命令,我用它创建了部署文件的目录..很奇葩,因为当时还没有deploy.sh文件,我需要解压目录保证存在,不然部署会失败(我假设部署的是一台之后基本软件环境的新系统,没有创建该目录).我没写应该有的stop命令,因为我项目目前的情况用不到.
  3. 解压步骤1中的包到指定目录

如果你现在写配置话,建议把命令放在deploy.appctl.path=deploy.sh,我没有改我之前的配置,因为RDC想在还经常升级迭代...我不着急弄...

配置流水线

我是develop分支对应一条流水线:对应环境日常环境和预发环境;
master分支对应一条流水线:对应正式环境

Screen Shot 2017-10-27 at 7.19.32 PM.png
Screen Shot 2017-10-27 at 7.20.03 PM.png
Screen Shot 2017-10-27 at 7.20.18 PM.png

我的一个deploy.php,测试环境用的部署文件:
deployer

<?php
namespace Deployer;

require 'recipe/laravel.php';

use Symfony\Component\Console\Input\InputOption;


//dep -vv deploy --first true  --branch develop -- test


option('first', null, InputOption::VALUE_OPTIONAL, 'If first deploy.');

// Configuration
set('repository', 'git@code.aliyun.com:mall-to/easy-admin.git');
set('allow_anonymous_stats', false);
set('default_timeout', 600);

localhost()
    ->stage('test')
    ->set("branch", "develop")
    ->set('deploy_path', '/app/back_end/easy_admin/test');


// Tasks

desc('first deploy');
task('deploy:first', function () {
    if (input()->hasOption('first')) {
        $first = input()->getOption('first');
        if ($first) {
            run('{{bin/php}} {{release_path}}/artisan tool:install');
            run('{{bin/php}} {{release_path}}/artisan admin:install');
            run('{{bin/php}} {{release_path}}/artisan user:install');
            run('{{bin/php}} {{release_path}}/artisan mall:install');
            run('{{bin/php}} {{release_path}}/artisan activity:install');
            //生成的key需要各个地方一样
//            run('{{bin/php}} {{release_path}}/artisan passport:install');
//            run('{{bin/php}} {{release_path}}/artisan passport:keys');
            run('{{bin/php}} {{release_path}}/artisan passport:client --personal');
        }
    }
});

desc('update');
task('deploy:update',function(){
    run('yes|{{bin/php}} {{release_path}}/artisan tool:update');
    run('yes|{{bin/php}} {{release_path}}/artisan admin:update');
    run('yes|{{bin/php}} {{release_path}}/artisan user:update');
    run('yes|{{bin/php}} {{release_path}}/artisan mall:update');
    run('yes|{{bin/php}} {{release_path}}/artisan activity:update');
});

desc('copy env');
task('deploy:cp_env', 'cp .env.{{stage}} .env');

desc('copy composer');
task('deploy:cp_composer', 'cp composer.json.circle composer.json');

desc('Restart PHP-FPM service');
task('php-fpm:restart', function () {
    // The user must have rights for restart service
    // /etc/sudoers: username ALL=NOPASSWD:/bin/systemctl restart php-fpm.service
    run('sudo systemctl restart php-fpm.service');
});

task("artisan:vendor", '
        php artisan queue:restart;
    ');

after('deploy:symlink', 'php-fpm:restart');
after('deploy:update_code', 'deploy:cp_env');
after('deploy:update_code', 'deploy:cp_composer');


// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');

// first deploy run
after('artisan:vendor', 'deploy:first');
// plugin install
after('artisan:vendor', 'deploy:update');
// publish vendor
before('deploy:symlink', 'artisan:vendor');

// Migrate database before symlink new release.
before('deploy:symlink', 'artisan:migrate');

参考链接

deployer
阿里云RDC/云效
Traditional Development/Integration/Staging/Production Practice for Software Development
Amazon为何能做到持续交付
谈谈持续集成,持续交付,持续部署之间的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容