本文使用的方法是配合宝塔 Linux 服务器面板的 Webhook 插件实现的,如果您的服务器使用的不是宝塔面板,可以看文章末尾的使用 PHP 文件作为钩子的两篇文章;由于 Gayhub 国内比较慢,所以我的私有库都在国内的 Gitee,无论是 Gayhub 还是 Gitee 都是一样使用方式;

怎么部署项目代码?以前更新了代码,写了新功能如何部署到服务器?还在用FTP笨笨的挑选出修改过的文件上传到服务器?那么你就 OUT 了,本文将介绍利用 Git + Webhook 技术持续部署项目。

实现目标、原理

  • 目标:当我们本机 Push 代码到代码托管平台后,服务器自动 Pull 拉取最新代码。
  • 原理:通过 Git 的 Webhook 触发 PUSH 事件,执行钩子脚本自动部署。

确保如下条件

  • 项目托管在 Git 平台(Gayhub、Gitee、Coding)
  • 服务器安装有 Git (本文不介绍安装方法)
  • 服务器安装有宝塔面板 Bt.cn (本文不介绍安装方法)
  • 服务器安装有宝塔面板的 Webhook 插件。

具体实施步骤

  • 安装宝塔 Webhook 插件
  • 通过 Webhook 插件添加如下 Shell 命令,本 Shell 可实现一个 Hook 支持部署多个站点。
#!/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 项目地址 私有项目使用ssh地址 公有项目可以直接使用 https 地址
#gitHttp="https://gitee.com/yourname/$1" 公有项目可直接使用 https地址
gitHttp="git@gitee.com:yourname/$1.git"

echo "Web站点路径:$gitPath"

#判断项目路径是否存在
if [ -d "$gitPath" ]; then
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                git clone $gitHttp gittemp
                mv gittemp/.git .
                rm -rf gittemp
        fi
        #拉取最新的项目文件
        git reset --hard origin/master
        git pull
        #设置目录权限
        chown -R www:www $gitPath
        echo "End"
        exit
else
        echo "该项目路径不存在"
        echo "End"
        exit
fi
  • 获取 Hook 地址,点击查看密钥,组合好最终 URL,http://面板/hook?access_key=密钥¶m=参数,其中 param 参数用来实现多站点部署,写项目名称(项目目录)便可。
  • 将上一步组合好的 Url 添加到你的项目中,Gitee 项目管理 > Webhooks > 添加;添加成功后,如果是公有项目,至此你便可 Push 代码到你的仓库测试了,如无意外,当你 Push 成功的同时,服务器同时 git pull 了最新的代码下来;私有项目继续向下看。
  • 由于私有项目必须要有权限,需要在服务器生成部署公钥,并添加到代码托管平台 Gitee,生成公钥命令 'ssh-keygen -t rsa -C "xxxxx@xxxxx.com" ',生成成功后将 ~/.ssh/id_rsa.pub 公钥内容复制下来,添加到Gitee,找到你的项目 > 管理 > 部署公钥 > 添加公钥。至此便可 Push 代码进行测试啦。

PHP文件作为钩子的方法

用访问PHP文件作为钩子来触发部署的方式需要服务器开启 Shell 权限,个人不喜欢这种方式,如果你感兴趣,可以查看 安正超的文章 和 yangweijie的文章