每天学习一点点,成功增加一大步

宝塔通过 Git 实现本地代码与远程服务器的同步更新

服务端 zhanghui 759℃

前言

标题的需求也是大部分的后端开发者的一个需求,以前更新远程服务器的通道,一是通过 FTP 等第三方传输通道来更新,二是通过远程桌面登陆到远程服务器,然后再通过打包程序源码文件的方式上传。这几种方式相对于初学者来说比较容易接受,但对于(熟悉 Git + webhook)老程序员来说相比之下发现之前的更新方式有点落伍了。

Git + webhook 的方式是在本地编辑完代码后,通过 push 命令来不仅是同步到远程的代码托管服务上的代码版本,也是希望远程的代码托管服务在更新之后也能更新远程生产环境中的代码的目的。

检查生产环境(远程服务器)的配置

在进行以下操作之前,要先在生产环境中创建好 Git 的公钥,创建方法可看:

Linux 服务器中 Git 创建公钥

1、git clone 命令

通过 git clone 命令将代码托管服务(如:阿里云 code)上的代码克隆到生产环境路径中。

cd /www/wwwroot
git clone https://code.aliyun.com/[自己的项目名称].git
Cloning into 'pkcms'...
Username for 'https://code.aliyun.com': [输入用户名]
Password for 'https://zhanghui@code.aliyun.com': [输入密码]

2、在 webhook 添加执行脚本

宝塔中有 webhook,可通过软件商城进行安装。

#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
#判断宝塔WebHook参数是否存在
if [ ! -n "$1" ];
then 
          echo "param参数错误"
          echo "End"
          exit
fi
#git项目路径
gitPath="/www/wwwroot/$1"
#git 网址
gitHttp="https://gitee.com/name/$1.git"

echo "Web站点路径:$gitPath"

#判断项目路径是否存在
if [ -d "$gitPath" ]; then
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        sudo git reset --hard origin/master
        sudo git pull        
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
        echo "End"
        exit
else
        echo "该项目路径不存在"
                echo "新建项目目录"
        mkdir $gitPath
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        sudo git reset --hard origin/master
        sudo git pull
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
        echo "End"
        exit
fi

通过【查看密钥】的方式查看到 webhook 的 URL,将复制其复制到码云(或阿里云 code)的 webhook 设置中,要注意的是这里的 param 的值是你的项目名。

在记得要将自己的 git 项目的由私有改成公用,因为私有的情况下远程服务器在获取的时候会有各种隐藏的坑,导致远程服务器同步不成功。公用 的情况下不需要什么公钥和密钥。

2021-07-07 记:

如果项目中有存在子模块的情况,可以通过以下操作来同步更新
#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
#判断宝塔WebHook参数是否存在
if [ ! -n "$1" ];
then 
          echo "param参数错误"
          echo "End"
          exit
fi
#git项目路径
gitPath="/www/wwwroot/aliCode/$1"
#git 网址
gitHttp="https://code.aliyun.com/name/$1.git"

echo "Web站点路径:$gitPath"

#判断项目路径是否存在
if [ -d "$gitPath" ]; then
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        sudo git reset --hard origin/master
        sudo git pull        
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
        sudo git submodule update --init --recursive
        echo "End"
        exit
else
        echo "该项目路径不存在"
                echo "新建项目目录"
        mkdir $gitPath
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        sudo git reset --hard origin/master
        sudo git pull
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
        sudo git submodule update --init --recursive
        echo "End"
        exit
fi

2021-07-19 记:

上面的更新子模块,还是存在点问题,所以做了以下的优化
#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
#判断宝塔WebHook参数是否存在
if [ ! -n "$1" ];
then 
          echo "param参数错误"
          echo "End"
          exit
fi
#git项目路径
gitPath="/www/wwwroot/aliCode/$1"
#git 网址
gitHttp="https://code.aliyun.com/zhanghui/$1.git"

echo "Web站点路径:$gitPath"

#判断项目路径是否存在
if [ -d "$gitPath" ]; then
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        sudo git reset --hard origin/master
        sudo git pull        
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
else
        echo "该项目路径不存在"
                echo "新建项目目录"
        mkdir $gitPath
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        sudo git reset --hard origin/master
        sudo git pull
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
fi
echo "拉取子的项目文件"
cd $gitPath
sudo git submodule update --init --recursive
echo "End"
exit

转载请注明:隨習筆記 » 宝塔通过 Git 实现本地代码与远程服务器的同步更新

喜欢 (4)