首页
Javascript
Html
Css
Node.js
Electron
移动开发
小程序
工具类
服务端
浏览器相关
前端收藏
其他
关于
公司注册

使用git hooks(post-receive)实现简单的远程自动部署

2019年06月05日 发布 阅读(5514) 作者:Jerman

如何使用命令行在本地自动部署到远程服务器?这里我们使用git的post-receive来简单实现.

本文实现的前提是:web端代码与git远程服务器不在同一台机器(如web代码放在腾讯云,git服务使用的github)

git介绍

  • git服务器端有仓库,我们称之为远程仓库。
  • git clone下来的,我们称之为本地仓库
  • git commit的时候,是把代码提交到本地仓库
  • git push的时候,是把代码从本地上传到远程仓库
  • git pull的时候,是把代码从远程仓库下载到本地

git自动部署原理

1.git服务端有一个远程仓库
2.开发者电脑上有一个clone下来的本地仓库,用于开发代码
3.web服务器也有一个clone下来的本地仓库,网站展示的内容就在此目录

自动部署的过程就是:从开发者电脑的本地仓库提交到远程仓库的时候,web服务器端的本地仓库自动更新远程仓库的代码。

实现自动部署

git post-receive机制:这个hook是git服务器在受到push请求时,并且接受完代码提交时触发

1、clone两个本地版本

在开发者本机打开git bash

  1. // 开发者电脑上的本地版本
  2. cd /d/project/
  3. git clone git@github.com:username/imqianduan.git imqianduan

登录web服务器,安装 git,假设web目录在/data

  1. // WEB服务器端的本地版本
  2. cd /data
  3. git clone git@github.com:username/imqianduan.git imqianduan

2、在web服务器端初始化一个Git 裸仓库 (git init –bare)

/data目录下创建imqianduan-bare.git

  1. cd /data
  2. // imqianduan-bare.git是一个目录,习惯带`.git`后缀这样命名而已
  3. git init --bare imqianduan-bare.git
  4. // 注意:bare仓库不能复制已经有的,新的项目都需要新建(init)

3、设置hooks,配置post-receive

上一步我们创建了imqianduan-bare.git目录,进入此目录的hooks目录
hooks目录下会有很多.sample文件,这些是一些示例文件(不起作用的,起作用的不带.sample后缀)

  1. -rwxr-xr-x 1 root root 452 Jun 5 15:35 applypatch-msg.sample
  2. -rwxr-xr-x 1 root root 896 Jun 5 15:35 commit-msg.sample
  3. -rwxr-xr-x 1 root root 189 Jun 5 15:35 post-update.sample
  4. -rwxr-xr-x 1 root root 398 Jun 5 15:35 pre-applypatch.sample
  5. -rwxr-xr-x 1 root root 1704 Jun 5 15:35 pre-commit.sample
  6. -rwxr-xr-x 1 root root 1239 Jun 5 15:35 prepare-commit-msg.sample
  7. -rw-r--r-- 1 root root 1348 Jun 5 15:35 pre-push.sample
  8. -rwxr-xr-x 1 root root 4951 Jun 5 15:35 pre-rebase.sample
  9. -rwxr-xr-x 1 root root 3611 Jun 5 15:35 update.sample

发现没有post-receive.sample示例文件,我们需要创建一个post-receive

  1. cd imqianduan-bare.git/hooks/
  2. // post-receive文件是没有任何文件名后缀的
  3. // 创建
  4. touch post-receive
  5. // 编辑
  6. vim post-receiv

post-receive粘贴下面的代码,echo输出的内容最终会在开发者电脑端打印出来

  1. #!/bin/sh
  2. #判断是不是远端仓库
  3. IS_BARE=$(git rev-parse --is-bare-repository)
  4. if [ -z "$IS_BARE" ]; then
  5. echo >&2 "fatal: post-receive: IS_NOT_BARE"
  6. exit 1
  7. fi
  8. echo "deploy start================================================"
  9. unset GIT_DIR
  10. # 填写第一步,web服务器上的本地仓库目录
  11. DeployPath="/data/imqianduan"
  12. cd $DeployPath
  13. echo "deploying web: www.imqianduan.com"
  14. git fetch --all
  15. git reset --hard origin/master
  16. echo "deploy end ================================================"

post-receive必须有可执行权限

  1. cd imqianduan-bare.git
  2. chmod +x hooks/post-receive

4、在开发者本地仓库添加远程bare地址

查看一下远程源地址

  1. $ git remote
  2. origin

origin已经存在,就不能再添加origin,我们改名为deploy

  1. // root:web服务器用户名
  2. // x.x.x.x: web服务器的IP
  3. git remote add deploy ssh://root@x.x.x.x/data/imqianduan-bare.git

再次使用git remote查看,会发现多了一个deploy

  1. $ git remote
  2. deploy
  3. origin

提交测试

按顺序,我们必须先git push到远程git服务器后,执行git push deploy才可以拿到本地提交的最新代码。所以我们也可以多次git push到远程git服务器后,再统一git push deploy下载到web服务器端部署

注意:

root@x.x.x.x's password:是要求输入web服务器root用户名的密码

  1. $ git push && git push deploy
  2. Counting objects: 2, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (2/2), done.
  5. Writing objects: 100% (2/2), 253 bytes | 253.00 KiB/s, done.
  6. Total 2 (delta 1), reused 0 (delta 0)
  7. remote: Resolving deltas: 100% (1/1)
  8. remote: Processing changes: done
  9. remote: Updating references: 100% (1/1)
  10. To git@github.com:username/imqianduan.git
  11. e091df4..b9b0084 master -> master
  12. root@x.x.x.x's password:
  13. Counting objects: 2, done.
  14. Delta compression using up to 4 threads.
  15. Compressing objects: 100% (2/2), done.
  16. Writing objects: 100% (2/2), 253 bytes | 253.00 KiB/s, done.
  17. Total 2 (delta 1), reused 0 (delta 0)
  18. remote: deploy start================================================
  19. remote: deploying web: www.imqianduan.com
  20. remote: Fetching origin
  21. remote: From git@github.com:username/imqianduan.git
  22. remote: e091df4..b9b0084 master -> origin/master
  23. remote: HEAD is now at b9b0084 test5
  24. remote: deploy end ================================================
  25. To ssh://x.x.x.x/data/imqianduan-bare.git
  26. e091df4..b9b0084 master -> master

问题

  • 如果报如下错误,请检查git remote add deply 远程地址的远程地址是否正确
  1. fatal: '/data/imqianduan-bare.git' does not appear to be a git repository
  2. fatal: Could not read from remote repository.
  3. Please make sure you have the correct access rights
  4. and the repository exists.
  • 检查权限问题

  • 检测post-receive是否有语法错误

如复制的时候,linux下很容易漏了第一个字母,导致变量报错

版权声明:本站文章除特别声明外,均采用署名-非商业性使用-禁止演绎 4.0 国际 许可协议,如需转载,请注明出处
  • Unable to negotiate with 106.52.160.162 port 22: no matching host key type found. Their offer: ssh-rsa fatal: Could not read from remote repository.

    Unable to negotiate with 106.52.160.162 port 22: no matching host key type found. Their offer: ssh-rsa fatal: Could not read from remote repository.

    发布:2021-11-09 阅读(4388)

  • 使用git hooks(post-receive)实现简单的远程自动部署

    使用git hooks(post-receive)实现简单的远程自动部署

    发布:2019-06-05 阅读(5514)

  • linux下设置git(pull,push等)免密码操作

    linux下,设置git免密码操作

    发布:2019-06-04 阅读(3064)

  • git cherry-pick使用指南

    **git cherry-pick**可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了,其实也就是对已经存在的commit 进行再次提交.

    发布:2018-12-28 阅读(3135)

  • 找回Git中丢失的Commit(git如何撤消reset操作)

    在使用Git的过程中,有时候会因为一些误操作,比如reset、rebase、merge等。特别是在Commit之后又执行了`git reset --hard HEAD`强制回滚本地记录以及文件到服务器版本,导致本地做的修改全部恢复到Git当前分支的服务器版本,同时自己的Commmit记录也消失了。碰到这种情况,不要慌,我们在Git上做的任何操作都只是在原来之前的操作上做修改,并且会被记录下来保存,也就是说无论你做了什么,对于Git来说都可以进行回滚操作。

    发布:2018-12-28 阅读(2582)

  • git bisect 命令教程

    它的原理很简单,就是将代码提交的历史,按照两分法不断缩小定位。所谓"两分法",就是将代码历史一分为二,确定问题出在前半部分,还是后半部分,不断执行这个过程,直到范围缩小到某一次代码提交。

    发布:2018-12-27 阅读(2286)

  • git输入不显示,只有光标在闪的问题

    当在git操作log,如`git log`后,然后非正常退出,即使用`CTRL+C`退出,这个时候git输入命令就不会显示了,只有光标,这时怎么办?

    发布:2018-12-26 阅读(3874)

  • .gitignore文件配置不生效

    .gitignore文件配置不生效

    发布:2018-12-24 阅读(3729)

  • git修改当前项目用户

    git修改当前项目用户

    发布:2018-12-11 阅读(2196)

  • Git修改最近一次已经提交了的commit及push

    Git修改最近一次已经提交了的commit及push

    发布:2018-12-11 阅读(1839)

  • git常用命令

    git常用命令,git查看某个文件的修改记录,分支备注

    发布:2018-11-30 阅读(2938)

  • Git 分支 - 分支的新建与合并

    发布:2018-11-27

  • git diff忽略某些文件,不比较

    通过设置git-diff driver,结合.gitattributes文件,使git diff命令忽略某些目录。例如我们只希望看到比较src目录,不希望看到比较dist目录

    发布:2018-10-26 阅读(6408)

  • git教程(写的比较详细,适合初学者,值得阅读)

    学习这本书的目的是让你了解版本控制,并且尽可能快速简单的掌握 Git。但是和另外一些关于介绍版本控制的图书不一样,阅读这本书并不需要你有很专业的 IT 或者电脑背景知识,它也面向那些编程的初学者,软件构架师,或者是项目经理。在技术方面你也不需要有很多专业知识,我们会以循序渐进的方式帮助你来理解版本控制和掌握 Git。

    发布:2018-10-19 来源:git-tower.com

  • git打包成tar\zip文件

    git如何打包增量文件?

    发布:2018-05-30 阅读(5894)

  • github push免密码

    github push时免密码

    发布:2015-01-05 阅读(1775)