zoukankan      html  css  js  c++  java
  • 使用 Git Hook 实现网站的自动部署

    转自 https://www.cnblogs.com/c-shang/p/git.html

    自动部署理论

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

    安装过程

    1)在服务器上创建一个裸仓库(git服务器上的远端仓库)

    cd   /home/workspace/
    git  init  --bare  bim.git

     # Git 全局设置

    git config --global user.name "xxxxx"
    git config --global user.email "xxxxx@xxx.com"

    在服务器上创建一个普通Git仓库,用于存放网站的源代码(web服务器上的另一个本地仓库)

    mkdir  /www/wwwroot/workspace
    cd  /www/wwwroot/workspace
    git  clone  /home/workspace/bim.git

    配置Git Hook

    进入到/home/workspace/bim.git/hooks文件夹,使用vi post-receive创建一个脚本,当你在本地仓库执行git push后就会触发post-receive。 
    post-receive的内容如下:

    #!/bin/sh


    #判断是不是远端仓库

    IS_BARE=$(git rev-parse --is-bare-repository)
    if [ -z "$IS_BARE" ]; then
    echo >&2 "fatal: post-receive: IS_NOT_BARE"
    exit 1
    fi

    unset GIT_DIR
    DeployPath="/www/wwwroot/bim"
    GitPath=$DeployPath/.git
    echo "pwd"|sudo -S chown bim:bim -R $DeployPath #权限问题处理

    cd $DeployPath

    git stash

    git pull origin master

    echo "pwd"|sudo -S chown www:www -R $DeployPath
    echo "pwd"|sudo -S chown bim:bim -R $GitPath

    #git fetch --all
    #git reset --hard origin/master


    #time=`date`
    #echo "web server pull at webserver at time: $time."

    保存后赋予可执行权限:

    chmod  +x  /var/www/workspace/springSummary/hooks/post-receive

    配置开发者电脑上的本地仓库的.git/config,添加

    [receive] 
      denyCurrentBranch = ignore

    为开发者电脑上的本地仓库添加 remote 源:

    // 默认ssh端口号为22时
    git remote add deploy user@server.ip:/home/workspace/bim.git
    // ssh端口号为不22时
    git  remote  add  deploy  ssh://user@server.ip:port/home/workspace/bim.git
    
    

    以后往这个 remote 源里面 push 代码就会自动触发上面那 bash 脚本实现自动部署

    git  push  deploy  master

    git fetch与git pull实现的区别在于:

    git fetch:相当于是从远程获取最新版本到本地,不会自动merge。

    git pull:相当于是从远程获取最新版本并merge到本地。

    pull实现相当于fetch后再用merge,来合并本地和远端的代码。

    这里就有个问题,如果开发者在提交过程出现失误,使用git reset复位后,现在远端的代码版本低于web端的代码版本,再使用pull的时候就不能实现和开发者本地的代码的同步。所以这里使用fetch后,在强制使用reset实现web端的代码版本指针和git服务端的一致。(如果在本机可以使用stash,然后pull,然后drop刚才stash的内容)

  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/wowchky/p/9177036.html
Copyright © 2011-2022 走看看