PHP通过exec执行git pull
<h3>目标</h3><p>项目没有使用Jenkins部署,使用的是Gitlab+ECS,要实现代码的自动部署</p>
<h3>想法</h3>
<p>使用Gitlab的钩子,当某个分支的代码提交之后,访问一个URL,实现代码的自动部署。这里使用PHP的exec方法,执行“git pull”操作</p>
<p>Tips:这种方法不是百分百靠谱,万一代码冲突就......</p>
<h3>实现</h3>
<p>目的:访问 http://xxx.com/index.php?project=hello,程序会自动在hello这个文件下,运行“git pull”命令</p>
<p>1、前提条件:linux上安装好git、php、nginx(或apache)</p>
<p> 1.1、git安装并配置</p>
<p> 参考:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git</p>
<p> 1.2、php、nginx安装</p>
<p> 参考:https://help.aliyun.com/document_detail/97251.html?spm=a2c4g.11186623.6.1107.70581014ZKSnS8</p>
<p> 1.3、php、apache安装</p>
<p> 参考:https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.1123.816d14f8IRTWh0</p>
<p>2、启动安装好的php跟nginx(或apache)后</p>
<p>3、如果有改过nginx的端口的话,需要修改下iptables,编辑/etc/sysconfig/iptables,新增一个端口即可,修改后运行 service iptables restart(记得阿里云入网规则也要添加相应的端口)</p>
<p>4、相应的php代码如下:</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">部署代码用!</span>
<span style="color: rgba(128, 0, 128, 1)">$project</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['project'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$project</span><span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(128, 0, 128, 1)">$shell</span> = "cd /data0/www/{<span style="color: rgba(128, 0, 128, 1)">$project</span>}/ && pwd && sudo git pull 2>&1"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">exec</span>(<span style="color: rgba(128, 0, 128, 1)">$shell</span>,<span style="color: rgba(128, 0, 128, 1)">$out</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$project</span>."<br/>"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">print_r</span>(<span style="color: rgba(128, 0, 128, 1)">$out</span><span style="color: rgba(0, 0, 0, 1)">);
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "Well done."<span style="color: rgba(0, 0, 0, 1)">;
}
</span>?></pre>
</div>
<p>说明:</p>
<p>(1)sudo,如果没有加这个的话,大概率会出现"permisson deny"</p>
<p>(2)2>&1,这个主要是为了查看运行结果</p>
<p>(3)pwd,查看目录</p>
<p>5、如果上面的程序无法跑起来,提示“sudo: no tty present and no askpass program specified”这类错误,那么基本上就是访问权限的问题,按照下面提示修改</p>
<p>6、运行“ps -ef | grep php”查看php进程的用户名,如果是nobody,你需要修改下php的配置文件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">ps</span> -ef | <span style="color: rgba(0, 0, 255, 1)">grep</span> php</pre>
</div>
<p>7、修改php配置文件</p>
<p>7.1、添加用户组,/usr/sbin/groupadd 用户组名</p>
<div class="cnblogs_code">
<pre>/usr/sbin/groupadd 用户组名</pre>
</div>
<p>7.2、新增用户,/usr/sbin/useradd -g 用户组名 -s /bin/bash 用户名</p>
<div class="cnblogs_code">
<pre>/usr/sbin/useradd -g 用户组名 -s /bin/bash 用户名</pre>
</div>
<p>7.3、修改php配置,我的是在/etc/php-fpm.d/www.conf,修改最上面的user跟group</p>
<div class="cnblogs_code">
<pre>vim /etc/php-fpm.d/www.conf</pre>
</div>
<p>7.4、重启php,service php-fpm restart</p>
<div class="cnblogs_code">
<pre>service php-fpm restart</pre>
</div>
<p>7.5、运行“ps -ef | grep php”查看php进程的用户名</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">ps</span> -ef | <span style="color: rgba(0, 0, 255, 1)">grep</span> php</pre>
</div>
<p>8、修改sudoers</p>
<p>8.1、运行chmod u+w /etc/sudoers</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">chmod</span> u+<span style="color: rgba(0, 0, 255, 1)">w</span> /etc/sudoers</pre>
</div>
<p>8.2、vim /etc/sudoers</p>
<div class="cnblogs_code">
<pre>vim /etc/sudoers</pre>
</div>
<p>8.3、在"root ALL=(ALL) ALL"下面加上"用户组 ALL=(ALL) NOPASSWD: ALL"</p>
<div class="cnblogs_code">
<pre>root ALL=(ALL) ALL<br>用户组 ALL=(ALL)NOPASSWD: ALL</pre>
</div>
<p>9、继续执行上面的php文件,没提示错误基本上可以了,可能出现sudo: unable to initialize policy plugin这类错误,按照提示改即可</p>
<p>10、pkexec visudo可查看具体的错误信息</p>
<p> </p>
<p>目的:访问 http://xxx.com/index.php?project=hello,程序会自动在hello这个文件下,运行“git pull”命令由此配合gitlab钩子实现代码的自动部署</p><br><br>
来源:https://www.cnblogs.com/lyc94620/p/11825309.html
頁:
[1]