当前位置: 首页 > 后端技术 > PHP

PHP+Laravel实现部署自动化_0

时间:2023-03-30 03:14:04 PHP

所谓自动化部署,我的理解是在用户保证代码质量的前提下,将代码快速自动部署到目标服务器的一种手段。实现原理是本地推送代码->代码库->webhook通知服务器->自动拉取代码库代码生成并部署公钥。具体步骤请参考配置SSH公钥1)生成公钥#使用给定的邮箱生成公/私rsa密钥#如果使用非默认地址,需要配置.ssh/config$ssh-keygen-trsa-b4096-C"your_email@example.com"2)在编码中添加公钥输出Deploypublic$catcoding.pub在git管理部分中部署公钥3)配置配置文件编辑器~/.ssh/config文件Hostgit.coding.netUserxxxx@email.comPreferredAuthenticationspublickeyIdentityFile~/.ssh/coding_rsa//生成的非默认公钥存储点4)测试是否可以链接到git@git.coding.net服务器#注意git.coding.net是连接CDN的,所以会解析多个不同的hostip$ssh-Tgit@git.coding.nethost'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。这是我sadeploykey.duoli,你好,你已经通过SSH协议认证了Coding.net服务。这是一个部署公钥设置webhook,以便当代码库收到通知时,通知服务器接收代码更新。这种webhook方式接收可部署的Requests,这里的请求使用post方式php接收部署,因为php脚本代码可能存在服务中断(比如执行时间),可能不太现实,所以打算使用脚本调用。接收请求->存入队列->脚本监控??处理队列由于使用了laravel框架,收到通知后,存入队列。因为队列使用的是命令行监控,所以执行命令行的时候不会有中断。在此之前,您需要配置运行代码的用户可以访问git服务器。也就是说,如果你的代码以www-data运行,你需要使用www-data的角色来访问git@git.coding.net服务器。否则,你也可以Deploymentcannotbedeploymentbecausethekeyisnotmatched,没有获取内容的权限。1)队列代码设置app/JobsshellPath=dirname(dirname(__DIR__));}/***执行作业。*@returnvoid*/publicfunctionhandle(){if(!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=database点前注意和同事一起研究自动化部署好久时至今日,PHP是否具备此功能仍有一些疑问。在局域网部署前可以实现代码部署,但其余时间测试失败。这次我改变了这个方法,发现了一个运行脚本的不同方法。理论上,在看到以下错误之前不会执行失败:OUT>/webdata/www/sour-lemon.comERR>Couldnotcreatedirectory'/usr/share/httpd/.ssh'.ERR>主机密钥验证失败。ERR>致命:无法从远程存储库读取。请确保您拥有正确的访问权限并且存储库存在。因为当前运行shell的用户是apache,所以在调用Callthisrequestasapache时,所以出现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)配置SSH公钥https://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...