代码之家  ›  专栏  ›  技术社区  ›  Walt W

网站git/测试和生产站点的post-receive/separation

  •  5
  • Walt W  · 技术社区  · 15 年前

    我正在使用git来管理我的网站的源代码和部署,并且目前测试和实时站点运行在同一个框中。跟踪此资源 http://toroid.org/ams/git-website-howto 最初,我提出了以下post receive hook脚本来区分推送到我的实时站点和推送到我的测试站点:

    while read ref
    do
      #echo "Ref updated:"
      #echo $ref -- would print something like example at top of file
      result=`echo $ref | gawk -F' ' '{ print $3 }'`
      if [ $result != "" ]; then
        echo "Branch found: "
        echo $result
        case $result in
          refs/heads/master )
            git --work-tree=c:/temp/BLAH checkout -f master
            echo "Updated master"
            ;;
          refs/heads/testbranch )
            git --work-tree=c:/temp/BLAH2 checkout -f testbranch
            echo "Updated testbranch"
            ;;
          * )
            echo "No update known for $result"
            ;;
        esac
      fi
    done
    echo "Post-receive updates complete"
    

    然而,我怀疑这是否真的安全:)我决不是git专家,但我猜git可能会跟踪当前签出的分支头,而且这种方法可能会把它搞糊涂。

    所以有几个问题:

    1. 这安全吗?

    2. 更好的方法是让我的基本存储库成为测试站点存储库(具有相应的工作目录),然后让该存储库将更改推送到新的活动站点存储库,该存储库具有与活动站点库对应的工作目录?这也将允许我将产品移动到不同的服务器,并保持部署链的完整性。

    3. 我有什么遗漏吗?在使用git管理网站时,是否有一种不同的、干净的方法来区分测试和生产部署?

    另外,根据vi的回答,有没有一种好的方法可以在不破坏文件系统的情况下处理删除操作?

    谢谢您, 沃尔特

    PS—我为多重回购(除非我听到更好的消息,否则正在使用)设计的脚本如下:

    sitename=`basename \`pwd\``
    
    while read ref
    do
      #echo "Ref updated:"
      #echo $ref -- would print something like example at top of file
      result=`echo $ref | gawk -F' ' '{ print $3 }'`
      if [ $result != "" ]; then
        echo "Branch found: "
        echo $result
        case $result in
          refs/heads/master )
            git checkout -q -f master
            if [ $? -eq 0 ]; then
                echo "Test Site checked out properly"
            else
                echo "Failed to checkout test site!"
            fi
            ;;
          refs/heads/live-site )
            git push -q ../Live/$sitename live-site:master
            if [ $? -eq 0 ]; then
                echo "Live Site received updates properly"
            else
                echo "Failed to push updates to Live Site"
            fi
            ;;
          * )
            echo "No update known for $result"
            ;;
        esac
      fi
    done
    echo "Post-receive updates complete"
    

    然后../live/$sitename中的repo(这些是在init之后添加了工作树的“裸”repo)具有基本的post-receive:

    git checkout -f
    if [ $? -eq 0 ]; then
        echo "Live site `basename \`pwd\`` checked out successfully"
    else
        echo "Live site failed to checkout"
    fi
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Johannes Rudolph    14 年前

    最好的办法是 基本存储库是测试站点 存储库(具有相应的工作 目录),然后 存储库将更改推送到新的Live 站点存储库,它具有 对应的工作目录 现场基地?这也将允许 我要把生产转移到 不同的服务器 部署链完好无损。

    当然可以。这是一个非常罕见的情况,您希望您的测试站点托管在您的生产站点旁边。几乎在所有方面都是危险和不专业的,更不用说数据库损坏、web服务器锁定等了。

    我通常有一个虚拟机设置用于测试目的。工作很好,我可以在旅行时把它放在笔记本电脑上。

    使用git部署您的网站是一个非常好的主意,有很多其他人这样做(例如rob conery)。如果您碰巧有一个实时和测试站点,那么您应该在存储库中为它们设置单独的分支,并在相应的服务器存储库中设置为远程跟踪分支。您的工作流变得与在测试分支中执行工作一样简单,可以将其推到测试、测试、合并到live和推到live。

    老实说,不要让自己太难。

        2
  •  2
  •   Vi.    15 年前

    认为这两种方法都能奏效。

    您还可以使用“git archive master tar-c:/temp/blah-x”和“git archive live site ssh live site‘tar-c/var/www-x’”。

    保持单独的存储库可能是有用的,但是“在另一个与推相关的钩子内推”看起来很棘手,我希望它会很慢。有点像一条又长又慢又脆弱的链条。

    可能是现场更新应该在测试“测试”版本后手动触发?

        3
  •  1
  •   tcp    14 年前

    我也遵循了toroid.org上的相同指南,但是我想指出,虽然您是从一个裸存储库开始的,但是通过添加一个工作目录,很可能需要额外的处理。我发现,如果您的内容可能会动态更改或以其他方式更改,并且在使用时不希望丢失数据,那么下面的钩子非常有用 git checkout -f

    预接收

    #!/bin/sh
    git add -A
    git diff --quiet --cached
    if [ $? -gt 0 ]; then
        git commit --quiet -m "autocommit"
        echo "Working Directory was out of sync. Pull to receive updated index."
        exit 1
    fi
    

    如果远程工作目录中有更改,则此操作将停止推送。把它想象成某个人(web服务器)在做更改但忘记提交它们。使用 checkout -f 将放弃这些更改。这个钩子是防止这种情况发生的好地方,但是如果在拉之前远程服务器上也调用了钩子,这样您就可以无缝地接收这些更改,那就更好了。

    后置接收

    #!/bin/sh
    git checkout -f
    echo "Working directory synced."
    

    关于有两个分支,我认为您的第一个解决方案比处理多个存储库更优雅。如果您真的想将生产站点隔离,可以在本地使用rsync,它具有类似的delta补丁。我将在存储库中有一个测试和稳定的分支,只有测试站点作为工作目录。当准备释放时,将测试合并到稳定分支中,推送并让一个钩子查找对稳定分支的提交,然后调用rsync。