镜像地址(掘金)php+Laravel实现部署自动化所谓自动化部署,我的理解是在用户保证代码质量的前提下,将代码快速自动部署到目标服务器的一种手段。实现原理是本地推送代码->代码库->webhook通知服务器->自动拉取代码库代码生成并部署公钥具体步骤参考配置SSH公钥1)生成公钥#使用给定的emailtogeneratepublic/privatersakey#IfTouseanon-defaultaddress,youneedtoconfigure.ssh/config$ssh-keygen-trsa-b4096-C"your_email@example.com"2)添加公共密钥输出到编码在git管理端部署public$catcoding.pub部分部署公钥3)配置配置文件编辑~/.ssh/config文件Hostgit.coding.netUserxxxx@email.comPreferredAuthenticationspublickeyIdentityFile~/.ssh/coding_rsa//生成的非默认公钥存储点4)测试是否可以链接到git@git.coding.net服务器#注意git.coding.net是连接CDN的,所以会解析多个不同的主机ip$ssh-Tgit@git.coding.net主机'git.coding.net(123.59.85.184)'无法建立。RSA密钥指纹为98:ab:2b:30:60:00:82:86:bb:85:db:87:22:c4:4f:b1.您确定要继续连接吗(是/否)?#这里我们输入yesWarning:Permanentlyadded'git.coding.net,123.59.85.184'(RSA)tothelistofknownhosts.编码提示:你好duoli,你已经连接通过SSH访问Coding.net。这是部署密钥。Duoli,你好,你已经通过SSH协议对Coding.net服务进行了认证。这是一个部署公钥设置webhook,让代码库在收到通知更新时通知服务器接收代码。此webhook方法用于接收可部署请求。这里的请求使用post方法php来接收和部署。因为php脚本代码执行的时候可能会出现服务中断(比如执行时间),可能不现实,所以打算用脚本来调用。接收请求->存入队列->脚本监听处理队列。由于使用的是laravel框架,收到通知后,存放在队列中,因为队列使用的是命令行监控,所以命令行执行不会有中断。在此之前,需要配置运行代码的用户有访问git服务器的权限。也就是说,如果你的代码以www-data运行,你需要使用www-data的角色来访问git@git.coding。网络服务器。否则会因为key不匹配,没有获取内容的权限,无法部署。1)队列代码设置app/JobsshellPath=dirname(dirname(__DIR__));}/***执行作业。*@returnvoid*/publicfunctionhandle(){如果(!env('LM_DEPLOY_BRANCH')){echo'ERR>'.'没有分支集'。"\n";}$shell="/bin/bash".base_path('resources/shell/deploy.sh')。''。基础路径()。''。env('LM_DEPLOY_BRANCH','master');$process=newProcess($shell);$进程->开始();$process->wait(function($type,$buffer){if(Process::ERR===$type){echo'ERR>'.$buffer;}else{echo'OUT>'.$buffer;}});}}2)触发队列调度(newWebDeploy());3)部署shell脚本#!/bin/bashaim_path=$1branch=$2cd${aim_path}echo$PWD/usr/bin/gitpullorigin${branch}>/dev/null2>&1if[$?-eq0];thenecho"OK"else/usr/bin/gitfetch-f/usr/bin/gitreset--hard/usr/bin/gitpullorigin${branch}fi4)使用supervisor来监控队列执行,监控队列任务文件位置/etc/supervisord.d/project.ini[program:project_name]process_name=%(program_name)s_%(process_num)02dcommand=php/path/to/project/artisanqueue:work--sleep=3--tries=3--daemonautostart=trueautorestart=trueuser=apachenumprocs=1redirect_stderr=truestdout_logfile=/webdata/logs/project.logenvironment=QUEUE_DRIVER=数据库注意事项和同事一起研究了很长时间的自动化部署,对于PHP是否具备这个功能还有一些疑惑。在局域网部署之前,代码部署是可以的,但是其余时间,都是失败的。.这次我改变了这个方法,找到了运行脚本的方法。理论上,在我看到以下错误之前不会执行失败:OUT>/webdata/www/sour-lemon.comERR>Couldnotcreatedirectory'/usr/share/httpd/.ssh'。ERR>主机密钥验证失败。ERR>致命:无法从远程存储库读取。请确保您拥有正确的访问权限并且存储库存在。因为当前shell运行的用户是apache,所以调用时会以apache的身份调用请求,所以会出现“Couldnotcreatedirectory'/usr/share/httpd/.ssh',所以考虑使用apache权限设置ssh自动化部署。由于不允许apache用户登录,所以需要先允许其登录,然后设置相应的sshkey。更改文件/etc/passwd允许用户登录#之前是/sbin/nologinapache:x:48:48:Apache:/usr/share/httpd:/bin/bash然后切换到apache用户设置sshkey,测试通过。参考文章Github访问出现Permissiondenied(publickey)ConfigureSSHpublickeyhttps://gist.github.com/jexch...https://www.freebsd.org/cgi/m...https://help.github.com/artic...http://callmepeanut.blog.51ct...http://www.huamanshu.com/wall...http://walle-web.io/https://github.com/meolu/wall...https://www.phptesting.org/in...
