项目开发完成后,难免要部署上线。纯手工操作,登录、拉代码、更改配置、清缓存、重启各种服务等一气呵成,宝贵的生命分分钟就这样过去了。而且,手动操作非常容易出错,漏掉一些步骤可能会导致一些恶果。所以我很早就开始寻找一种方法来轻松部署Laravel项目。Laravel的官方文档中介绍了Envoy。之前用过,可以满足大部分场景,但还是有一些局限性。直到后来看到了deployer,有种相见恨晚的感觉!deployer的好处是解放双手,一条命令即可完成部署。在部署过程中,项目仍然可以正常访问。只有在部署成功完成后才切换到新版本。可以很方便的回滚。丰富的任务钩子和预设任务可以灵活组合完成各种任务,如进行前端依赖安装搭建等。其他的姿势等着你去发现...使用deployer的前提是本机(也就是你执行dep命令的机器)可以SSH连接到目标机器(代码所在的机器)部署后,无论是在线云主机还是局域网)虚拟机)都有权限登录目标机器并调整一些设置,或者让负责人协助调整。(在使用过程中可能会遇到问题,需要调整一些设置,后面会提到)目标主机有拉取项目仓库的权限。(这些你应该都有,还是开玩笑?)够大胆,够细心,够耐心……deployer的使用先说明个人的实际使用场景。我使用的是win10系统,使用Homestead作为PHP项目的开发环境(vagrantv2.1.1,homesteadv7.4.1,virtualboxv5.2.8,homestead的virtualbox版本是v5.2)。本地开发可以完成大部分的开发和测试任务,但是在部署到生产机上之前还是需要先部署到开发机上进行测试。线上测试和生产使用青云的云主机,Ubuntu16系统。以下操作均在homestead虚拟机中进行!installcd/path/to/your/projectcomposerrequiredeployer/deployer--dev用于将其安装为项目依赖,当然也可以根据需要或个人喜好全局安装。初始化deployer配置文件vendor/bin/depinit因为我用的是laravel,输入projecttype1回车,然后会有一个git仓库,可以让你设置git仓库。默认是对应项目的git远程仓库。如果不需要修改,确认OK。完成以上初始化后,项目主目录下会出现一个deploy.php文件,部署器的配置依赖于它。初始配置如下,展示了一些基本的配置。set('deploy_path','~/{{application}}');//Tasks//这是一个自定义任务的例子task('build',function(){run('cd{{release_path}}&&build');});//[可选]如果部署失败自动解锁.//如果部署失败,自动解锁部署锁状态,以免影响下次执行数据库迁移,建议删除,迁移虽然好,但毕竟风险大,只推荐开发环境使用。之前('部署:符号链接','数据库:迁移');肯定不能修改配置的默认配置,目标主机还不知道。直接在下面粘贴你使用的配置,并添加一些说明。stage('production')->user('root')->port(22)->set('branch','master')//最新的master分支部署到生产机器上->set('deploy_path','/data/wwwroot/xxx')->identityFile('/home/vagrant/.ssh/id_rsa')->forwardAgent(true)->multiplexing(true)->set('http_user','www')//这与nginx中的配置->addSshOption('UserKnownHostsFile','/dev/null')->addSshOption('StrictHostKeyChecking','no');//用于测试的主机host('172.16.3.2')->stage('debug')->user('root')->port(22)->set('branch','develop')//develop分支一般是放在测试机上测试,没问题后再合并->set('deploy_path','/data/wwwroot/xxx')->identityFile('/home/vagrant/.ssh/id_rsa')->forwardAgent(true)->multiplexing(true)->set('http_user','www')->addSshOption('UserKnownHostsFile','/dev/null')->addSshOption('StrictHostKeyChecking','no');//自定义任务:重置opcache缓存任务('opcache_reset',function(){run('{{bin/php}}-r\'opcache_reset();\'');});//自定义任务:重启php-fpm服务task('php-fpm:restart',function(){run('systemctlrestartphp-fpm.service');});//自定义任务:supervisorreloadtask('supervisor:reload',function(){run('sudosupervisorctlreload');});//自定义任务:使用bearychat给老板和自己发消息task('send_message',function(){run('{{bin/php}}{{release_path}}/artisandeployed');});//自定义任务:缓存路由,recipe/laravel.phpdefault过程中没有this,所以添加,需要after('artisan:config:cache','artisan:route:cache');//执行自定义任务,注意时间点是当前有成功链接到新部署after('deploy:symlink','php-fpm:restart');after('deploy:symlink','supervisor:reload');//部署成功后重置opcacheafter('deploy:symlink','opcache_reset');//部署成功后调用laravel命令行发送通知after('success','send_message');//【可选】如果部署失败自动unlock.after('deploy:失败','部署:解锁');代码修改完成后,运行部署。修改完成后,记得提交并推送代码到远程仓库,然后执行以下命令部署:vendor/bin/depdeploydebug//部署到测试机vendor/bin/depdeployproduction//如果部署到生产机时提示输入密码,输入密码即可登录目标主机。或者找到一种方法来设置SSH密钥以进行免密码登录。首次部署后设置.env并配置nginx站点默认情况下,首次部署后不会自动创建.env文件,需要自行创建修改,nginx站点配置也需要由你自己完成。对于.env文件,将它们存储在目标主机的/path/to/project/shared/目录中。修改.env后,记得重新缓存配置phpartisanconfig:cache另外需要注意的是,在配置nginx站点的时候,站点的根目录应该是/path/to/project/current/public。如果使用supervisor之类的,在配置的时候也要注意相关的目录。部署后目录结构及相关说明在部署的目标目录下执行ls-la,可以看到如下结果:说明:|projectname|---@current->releases/
