【问题标题】:Deploying a website to multiple environments with git使用 git 将网站部署到多个环境
【发布时间】:2011-11-22 10:48:10
【问题描述】:

目前我使用 git 将项目部署到生产环境,使用 git push production master 到具有以下接收后挂钩的存储库:

#!/bin/bash
GIT_WORK_TREE=/home/username/www.example.com/myproject/ git checkout -f

production 是一个遥控器,通过git remote add production ssh://server/home/username/projects/myproject.git 添加。

但现在我需要将一个单独的分支部署到服务器上的单独路径。我确实想出了一个解决方案,但我想有更好的方法。

我所做的是在服务器上创建一个新的存储库myproject-alternate.git,使用类似的接收后挂钩(用/myproject-alternate/ 替换/myproject/),用git remote add alternate ssh://server/home/username/projects/myproject-alternate.git 添加这个新的存储库。现在我可以使用git push alternate branchname:master 部署到备用路径。

这可行,但我有一些问题:

  1. 部署到备用服务器的命令不是我所期望的——我不止一次忘记了最后的:master,并且服务器的存储库收到了一个新分支并且没有触发接收后挂钩。
  2. 我不确定在服务器上创建一个新的存储库是否是最好的解决方案,我想知道一个更大的项目会发生什么。

是否有其他方法可以在没有上述问题的情况下完成此部署流程?也许一个更好的 post-receive 钩子使用接收到的分支名称来部署到正确的路径? (这甚至可能吗?)

【问题讨论】:

    标签: git deployment githooks environments


    【解决方案1】:

    我已经写了一个blog post,关于我用来将我的网站部署到登台服务器和实时服务器的设置。你可以做类似的事情。关键是在本地存储库的.git/config 文件中配置要推送的分支,如下所示:

    [remote "alternate"]
        url = ssh://server/home/username/projects/myproject-alternate.git
        fetch = +refs/heads/master:refs/remotes/alternate/master
        pushurl = ssh://server/home/username/projects/myproject-alternate.git
        push = refs/heads/branchname:refs/heads/master
    [remote "production"]
        url = ssh://server/home/username/projects/myproject.git
        fetch = +refs/heads/master:refs/remotes/production/master
        pushurl = ssh://server/home/username/projects/myproject.git
        push = refs/heads/master:refs/heads/master
    

    这将设置它,以便在您输入时

    git push alternate
    

    它会自动将本地 branchname 分支推送到备用存储库中的远程 master 分支。

    但是,由于您的备用工作树和生产工作树位于同一台计算机上,因此您可能只需创建一个存储库并将其检出到两个不同的地方即可。要做到这一点,忽略上一段,而是在你的 post-receive 钩子中添加这样的内容:

    #!/bin/bash
    checkout_alt=
    checkout_prod=
    while read oldrev newrev refname; do
        case "$refname" in
            ( "refs/heads/branchname" )
                export checkout_alt=1 ;;
            ( "refs/heads/master" )
                export checkout_prod=1 ;;
        esac
    done
    test -n "$checkout_alt" && GIT_WORK_TREE=/home/diazona/tmp/gittest/alt/ git checkout -f branchname
    test -n "$checkout_prod" && GIT_WORK_TREE=/home/diazona/tmp/gittest/prod/ git checkout -f master
    

    (显然您没有使用if 语句)。如果你这样做,我建议让存储库裸露,这样它就不会存储自己的工作副本,只是为了简单起见。这样一来,你只需要一个遥控器,每当你推送master分支时,它就会更新生产工作树,而每当你推送branchname分支时,它就会更新备用工作树。

    免责声明:我还没有实际测试过,所以先在测试文件夹中尝试一下。如果我发现任何错误,我会回来编辑。

    【讨论】:

    • 在我测试之前你能解释一下branch=${3##*/}这一行吗?
    • 它删除匹配模式*/的最长前导子字符串。
    • ... 来自哪个字符串? (抱歉又问了,我真的很想看懂全行代码,有这么多符号的东西我也搜不到)
    • 啊,好的:它将匹配 */ 的前缀从第三个参数中剥离到 bash 脚本 ($3),这将类似于 refs/heads/master。最后一个组件通常应该是分支名称。您可以在 bash 手册页的“参数扩展”部分下阅读更多相关信息。
    • 哦,等等,其实我搞砸了。我忘记了钩子脚本通过标准输入获取它的“参数”,而不是作为实际的位置参数。所以你需要做一些不同的事情。我会相应地编辑我的答案。
    【解决方案2】:

    我还在我使用的设置上写了a blog post,它允许我将项目中的每个分支git push 直到我的远程,将每个分支部署到各自的目录中。

    例如:

    Branch      | Directory on remote
    --------------------------------------
    master      | /www/foo.com/master
    staging     | /www/foo.com/staging
    production  | /www/foo.com/produciton
    

    因此,要做到这一点,请将以下函数添加到您的服务器点文件中:

    function gitorigin() {
        mkdir -p "$1"
        cd "$1"
        git init --bare
        git config core.bare false
        git config receive.denycurrentbranch ignore
        cat <<EOF >hooks/post-receive
    #!/bin/bash
    
    while read oldrev newrev ref
    do
        branch=\`echo \$ref | cut -d/ -f3\`
        mkdir -p ../\$branch
        git --work-tree=../\$branch checkout -f \$branch
        echo Changes pushed to \$branch
    done
    EOF
        chmod +x hooks/post-receive
        cd ..
    }
    

    在 Remote 上,创建一个存储库:

    $ cd /www/foo.com
    $ gitrepo foo.git
    

    在本地,推送一个分支

    $ cd ~/Sites/foo.com
    $ git remote add origin ssh:///<USER>@<HOST>/www/foo.com/foo.git
    $ git push origin <BRANCH>
    

    会将您的主分支推送到远程,进入/www/foo.com/&lt;BRANCH&gt;/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 2012-08-03
      • 2013-01-24
      • 2015-07-29
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多