码云 + GIT 实现项目自动部署

1. 创建仓库, 在码云上创建自己的项目仓库

2. 创建公钥,因为我们通过公钥还实现代码的自动更新

    一般我们WEB项目都是WWW用户权限,所以我们需要用WWW的身份云创建公钥,不然会在使用GIT时验证失败

   2.1 切换到WWW用户    

# su www

   如果出现错误,就需要开启WWW用户登陆,(创建完公钥后记得把www修改回原来的权限,例如这里的/sbin/nologin)

# vi /etc/passwd
//进入编辑后,找到下面这行,把最后面的改为/bin/bash
例:www:x:1001:1001::/home/www:/sbin/nologin
www:x:1001:1001::/home/www:/bin/bash

   2.2 用WWW身份创建公钥   

# cd ~
# cd .ssh
# rm -rf ./*
# ssh-keygen -t rsa -C "xxx@xx.com"
//然后就是设置密码了,不设置就一直回车
//上面的命令分别是 1.进入用户目录。2.ssh目录。2.ssh目录下面的文件。3.创建公钥

//接着继续
# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2E......H *********5@qq.com
//会输出你的公钥,复制到coding绑定公钥即可

这样我们公钥就添加好了

3. 拉取项目

  3.1 复制git地址

3.2 拉取代码,进入的项目目录 (用WWW用户身份)

# cd /home/wwwroot/test.sld.com
# git clone git@gitee.com:xxxx/xxxx.git

3.3 修改.git文件夹为www用户组 

# chown www:www -R .git

此时,我们项目就已经正常部署到服务器上了

提示:把www用户调整为不可登陆

# su root
# vi /etc/passwd
www:x:1001:1001::/home/www:/sbin/nologin 
# 修改为nologin

4. 实现自动部署

    4.1 指定 weebhook  推送地址

weebhook  码云上一个webhooks功能 ,可以让我们有修改代码时,发送一个请求到我们指定的地址。我们就通过它来实现自动部署

最后是这样的

4.2 编辑推送地址文件 bs.php

$git = "git"; //默认是用git全局变量,有的环境可能要指明具体安装路径
$branch = ""; //指定pull分支,为空就是默认分支
$logName = "git_data"; //本地日志名称,与当前php文件在同一目录
$savePath = "/home/wwwroot/test.sld.com/"; //网站根目录,初次克隆确保目录为空
$gitSSHPath = "git@gitee.com:***/**.git";//代码仓库SSH地址
$password = "deux.trois"; //在WebHooks设置的密码
$is_test = false;//测试模式,无需密码:true打开,平时false关闭
$isCloned = true;//设置是否已经Clone到本地,true:已经clone,直接pull,false:先clone.

//如果已经clone过,则直接拉去代码
if ($isCloned) {
    $requestBody = file_get_contents("php://input");
    if (empty($requestBody) && empty($is_test)) {
        die('send fail');
    }

    //解析码云发过来的JSON信息
    $content = json_decode($requestBody, true);
    //若是主分支且提交数大于0
    //密码要正确
    if ($content['password'] == $password || !empty($is_test)) {
        if ($content['total_commits_count'] > 0 || !empty($is_test)) {
            if ($content['ref'] == "refs/heads/$branch" || !$branch || !empty($is_test)) {
                $cmd = "cd $savePath && $git reset --hard && $git clean -f && $git pull $branch 2>&1";
                $result = shell_exec($cmd); //关键命令,拉取代码,2>&1后台执行
                $res_log = "[ PULL START ]" . PHP_EOL;
                if (!empty($is_test)) {
                    $res_log .= date('Y-m-d H:i:s') . '执行测试!' . PHP_EOL;
                } else {
                    $res_log .= date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '个commit:' . PHP_EOL;
                }
                $res_log .= $cmd . PHP_EOL;
                $res_log .= $result . PHP_EOL;
                $res_log .= "[ PULL END ]" . PHP_EOL;
                $res_log .= PHP_EOL . PHP_EOL;
                file_put_contents($logName . ".log", $res_log, FILE_APPEND);//写入日志
                echo $result;
            }
        }
    } else {
        file_put_contents($logName . ".log", '密码错误!', FILE_APPEND);
        echo '密码错误!';
    }

} else {
    $res = "[ CLONE START ]" . PHP_EOL;
    $res .= shell_exec("$git clone $gitSSHPath $savePath") . PHP_EOL;
    $res .= "[ CLONE END ]" . PHP_EOL;
    file_put_contents($logName . ".log", $res, FILE_APPEND);//写入日志
}

 提示

        1. 需要php开启shell_exec 

        2. shell_exec 执行命令时,如果命令是变量,会执行不成功,如果是直接的命令就没问题,不知道为什么

        

$cmd = "cd $savePath && $git reset --hard && $git clean -f && $git pull $branch 2>&1";
$result = shell_exec($cmd);  // 执行不了

$result = shell_exec("cd /home/wwwroot/test.sld.com/ && git reset --hard && git clean -f && git pull  2>&1");  // 这样就没问题

最终我的bs.php只有如下代码,尴尬!!!

$result = shell_exec("cd /home/wwwroot/test.sld.com/ && git reset --hard && git clean -f && git pull  2>&1");
echo 'success';

到此,我们的就完成了自动部署的所有工作了。

我们可以在webhooks 上面查看我们的提送情况 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值