序
本文主要介绍了如何利用php Laravel实现部署自动化的相关内容,并分享给大家参考和学习。下面就不多说了。我们来看看详细的介绍。
按照我的理解,自动部署是在用户能够保证代码质量的前提下,将代码快速自动部署到目标服务器的一种手段。
实施原则
本地推送代码-代码库-webhook通知服务器-自动拉取代码库代码
生成和部署公钥
有关具体步骤,请参考配置SSH公钥
1)生成公钥
#使用给定的电子邮件生成公钥/私钥rsa如果使用非默认地址,则需要配置。ssh/config $ ssh-keygen-t RSA-b 4096-c[电子邮件保护] 2)在编码中添加公钥
输出部署
$ cat coding.pub在git管理端部署公钥
3)配置配置文件
编辑~/。ssh/配置文件
霍斯吉特。coding.net用户[emailprotected]首选身份验证publickeyidentifyfile ~/。ssh/coding _ RSA//生成的非默认地址的公钥库4)测试是否可以链接到【邮件保护】服务器。
#请注意,git.coding.net访问CDN,因此它将解析许多不同的主机IP $ ssh-t [email protected]主机git的身份验证。编码。“网络(123.59.85.184)”无法建立。RSA密钥指纹是98: ab :2 b :303360603360003360823360863360863360 bb 3360853360 db 3360873360223360 c 433604 f : B1。您确定要继续连接吗(是/否)?#这里我们输入是警告:将“git.coding.net,123 . 59 . 85 . 184”(RSA)永久添加到已知主机列表中。编码提示:你好,李铎,你已经通过SSH连接到Coding.net。这是一个部署。李铎,你好,你已经通过ssh协议验证了Coding.net服务,这是一个部署公钥设置的网络钩子
让代码库在收到通知时通知服务器接收代码更新。
这种webhook方法接收可以部署的请求,这里的请求使用post方法
Php接收部署
因为php脚本代码在执行时可能会有服务中断(例如执行时间),这可能不现实,所以计划使用script来调用它。
接收请求-存储在队列中-脚本侦听和处理队列
因为使用了laravel框架,所以收到通知后,会存储在队列中。因为队列使用命令行监控,所以在执行命令行时不会中断。
在此之前,您需要配置运行代码的用户来访问git的服务器。也就是说,如果您的代码作为www-data运行,您需要使用www-data的角色来访问[emailprotected]服务器。否则,无法实现部署,因为密钥不匹配,并且您无权访问内容。
1)队列代码设置应用程序/作业
?php命名空间App Jobs使用照明合同总线自动处理;使用照明合同队列应该队列;使用符号组件进程进程;类WebDeploy扩展了Job实现的SelfHandling,ShouldQueue { private $ shellPath/** *创建新的作业实例。*/public function _ _ construct(){ $ this-shellPath=dirname(dirname(_ _ DIR _ _));} /** *执行作业。* @return void */public函数句柄(){ if(!env(' LM _ DEPLOY _ BRANCH '){ echo ' ERR '。“无分支集”。 n ';} $shell='/bin/bash '。base _ path(' resources/shell/deploy . sh ')。' ' .base_path()。' ' .env('LM_DEPLOY_BRANCH ',' master ');$ Process=new Process($ shell);$ process-start();$process-wait(函数($type,$ buffer){ if(process 3360: ERR===$ type){ echo ' ERR '。$ buffer} else { echo 'OUT '。$ buffer} });}}2)触发队列
派单(新WebDeploy());3)部署外壳脚本
#!/bin/bashaim _ path=$ 1 branch=$ 2cd $ { aim _ path } echo $ PWD/usr/bin/git pull origin $ { branch }/dev/null 21if[$?-eq[0];the CHO ' ok ' else/usr/bin/git fetch-f/usr/bin/git reset-hard/usr/bin/git pull origin $ { branch } fi4)使用supervisor监控队列执行和队列任务
文件位置/etc/supervisor d.d/project.ini。
[program : project _ name]process _ name=%(program _ name)s _ %(process _ num)02 command=PHP/path/to/project/Artisan队列: work-sleep=3-tries=3-daemon autostart=truestore start=true user=Apache umpcs=1 redirect _ stderr=true stdout _ log file=/webdata/logs/project . log environment=queue _ driver=database
之前和同事一起研究自动部署花了很长时间,但是对于PHP是否能胜任这个功能还是有一些疑问。以前,在局域网中部署时,可以部署代码,但在其余时间测试时会失败。这一次,我找到了这样运行脚本的方法。理论上,在我看到下面的错误:之前,不会有不成功的执行。
无法创建目录。嘘。错误主机密钥验证失败。错误致命:无法从远程存储库中读取。请确保您拥有正确的访问权限,并且存储库存在。因为当前shell用户是apache,所以在调用时此请求将作为apache调用,因此无法创建目录“/usr/share/httpd”。出现“ssh”。因此,考虑使用apache权限来设置ssh的自动部署。
由于不允许apache用户登录,所以需要允许他们先登录,然后设置相应的ssh密钥。
更改文件/etc/passwd以允许用户登录
#/sbin/nologin apache : x :48336048: Apache :/usr/share/httpd :/bin/bash之前,再切换到Apache用户设置ssh密钥,通过了测试。
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。