Git自动部署

本文最后更新于:8 个月前

Git代码自动部署有两种常见的方式,一种是git hook,另一种是github webhook。两者的本质都是在提交代码的时候触发脚本执行

Git自动部署

一、什么是自动部署

开发者需要将提交到Git服务器上的代码进一步部署到Web服务器上。在提交代码到Git服务器的同时自动将代码部署到Web服务器上,就叫「自动部署」。

首先要明确代码的分布情况,开发者电脑上的本地仓库、Git服务器上的远端仓库、web服务器上的另一个本地仓库(浏览器访问的就是这里的代码)。实现自动部署就是要当从开发者本地仓库提交源代码到远端仓库的时候,自动把构建好的代码部署到web服务器的本地仓库,实现开发者本地仓库和web服务器的本地仓库的同步(即通过Git hooks中的post-receive脚本文件)

执行流程:

  1. 用户在客户端执行git push操作
  2. 远程仓库发现有用户执行了push操作,就会执行一个脚本post-receive
  3. 在post-receive脚本中,将git仓库的代码拷贝到web站点目录下

参考链接:

利用Git Hooks自动部署 - 简书 (jianshu.com)

二、git hook

Git hooks是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为。

Git 含有两种类型的钩子:客户端的和服务器端的。

客户端的hooks由诸如提交和合并这样的操作所调用,而服务器端hooks作用于诸如接收被推送的提交这样的联网操作。

1、步骤简介

以下步骤建立在服务器上已经创建了git用户、和本地主机配置了ssh密钥的基础上

  1. 在应用服务器上建立「代码裸仓库」,并设置为项目的远程仓库
  2. 在「裸仓库」上设置自动部署的脚本

2、建立项目仓库

1
2
3
cd /timegogo
mkdir laf
chown -R git:git laf

3、建立代码裸仓库

1
2
3
cd /timegogo/git
git --bare init laf.git
chown -R git:git laf.git

【扩展】git --bare initgit init的区别:

  • git --bare init初始化的是一个裸仓库;

    里面没有工作区,不能进行git操作,操作必须在工作树上进行。

    image-20221124110653845

    它是一个独立的git仓库,与项目源码分离(通过hooks钩子“链接”一个存放项目源码的文件夹)

  • git init初始化普通仓库,

    image-20221124110915506 image-20221124110929610

    创建出一个带.git目录的空文件夹,目录结构与项目代码结构一致,项目源码就放置到该文件夹中,有工作区,可以执行各种git操作。

    打开.git目录,可以发现和git --bare init创建出来的内容完全一致。

4、配置 git 钩子

1
2
3
4
5
6
7
8
9
10
cd /timegogo/git/laf.git/hooks
vim post-receive #文件名必须是post-receive,不能是其他,否则无效

#输入以下内容:(注意不能用window记事本编辑!!)
#!/bin/bash
git --work-tree=/timegogo/laf --git-dir=/timegogo/git/laf.git checkout -f

#修改权限
chown git:git post-receive
chmod +x post-receive

5、本地链接web服务器仓库

在本地项目的git仓库中,链接到第3步建立的「代码裸仓库」,在本地项目的git bash中输入以下命令

1
git remote add aliyun git@120.25.75.176:/timegogo/git/laf.git

然后就可以向web服务器推送更新了

1
2
git push -u aliyun master	#第一次推送使用这个命令
git push #后续推送master分支时,用这个简化命令即可

三、github webhook

等待后续补充…


Git自动部署
http://timegogo.top/2022/11/24/Git/Git自动部署/
作者
丘智聪
发布于
2022年11月24日
更新于
2023年7月16日
许可协议