PHP通過exec執行git pull


目標

項目沒有使用Jenkins部署,使用的是Gitlab+ECS,要實現代碼的自動部署

想法

使用Gitlab的鈎子,當某個分支的代碼提交之后,訪問一個URL,實現代碼的自動部署。這里使用PHP的exec方法,執行“git pull”操作

Tips:這種方法不是百分百靠譜,萬一代碼沖突就......

實現

目的:訪問 http://xxx.com/index.php?project=hello,程序會自動在hello這個文件下,運行“git pull”命令

1、前提條件:linux上安裝好git、php、nginx(或apache)

        1.1、git安裝並配置

            參考:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

        1.2、php、nginx安裝

            參考:https://help.aliyun.com/document_detail/97251.html?spm=a2c4g.11186623.6.1107.70581014ZKSnS8

        1.3、php、apache安裝

            參考:https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.1123.816d14f8IRTWh0

2、啟動安裝好的php跟nginx(或apache)后

3、如果有改過nginx的端口的話,需要修改下iptables,編輯/etc/sysconfig/iptables,新增一個端口即可,修改后運行 service iptables restart(記得阿里雲入網規則也要添加相應的端口)

4、相應的php代碼如下:

<?php
#部署代碼用!
$project = $_GET['project'];
if (!empty($project)) {
    $shell = "cd /data0/www/{$project}/ && pwd && sudo git pull 2>&1";
    exec($shell,$out);
    echo $project."<br/>";
    print_r($out);
}else{
        echo "Well done.";
}
?>

說明:

(1)sudo,如果沒有加這個的話,大概率會出現"permisson deny"

(2)2>&1,這個主要是為了查看運行結果

(3)pwd,查看目錄

5、如果上面的程序無法跑起來,提示“sudo: no tty present and no askpass program specified”這類錯誤,那么基本上就是訪問權限的問題,按照下面提示修改

6、運行“ps -ef | grep php”查看php進程的用戶名,如果是nobody,你需要修改下php的配置文件

ps -ef | grep php

7、修改php配置文件

7.1、添加用戶組,/usr/sbin/groupadd 用戶組名

/usr/sbin/groupadd 用戶組名

7.2、新增用戶,/usr/sbin/useradd -g 用戶組名 -s /bin/bash 用戶名

/usr/sbin/useradd -g 用戶組名 -s /bin/bash 用戶名

7.3、修改php配置,我的是在/etc/php-fpm.d/www.conf,修改最上面的user跟group

vim /etc/php-fpm.d/www.conf

7.4、重啟php,service php-fpm restart

service php-fpm restart

7.5、運行“ps -ef | grep php”查看php進程的用戶名

ps -ef | grep php

8、修改sudoers

8.1、運行chmod u+w /etc/sudoers

chmod u+w /etc/sudoers

8.2、vim /etc/sudoers

vim /etc/sudoers

8.3、在"root    ALL=(ALL)       ALL"下面加上"用戶組 ALL=(ALL)  NOPASSWD: ALL"

root    ALL=(ALL)       ALL
用戶組 ALL=(ALL) NOPASSWD: ALL

9、繼續執行上面的php文件,沒提示錯誤基本上可以了,可能出現sudo: unable to initialize policy plugin這類錯誤,按照提示改即可

10、pkexec visudo可查看具體的錯誤信息

 

目的:訪問 http://xxx.com/index.php?project=hello,程序會自動在hello這個文件下,運行“git pull”命令由此配合gitlab鈎子實現代碼的自動部署


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM