sanity检查同一服务器上的git部署,登台和生产,现有代码

时间:2015-11-06 18:22:51

标签: git deployment staging

假设我有一台服务器,它有一个现有的生产站点及其暂存站点。

现在我在~/创建了一个具有hook/post-receive

的裸仓库
#!/bin/bash
# post-receive
# deploy production and staging to vhost dirs

# Directory we are deploying to. Should be the directory where the repo's root .gitignore would exist in.
PRODDEST="/path/to/destination/of/production"
STAGDEST="/path/to/destination/of/staging"

while read oldrev newrev refname; do
    # Grab the name of the branch that was pushed.
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)

    if [ "master" = "$branch" ]; then
        echo "Master push, deploy production..."
        GIT_WORK_TREE=$PRODDEST git checkout -f master
        GIT_WORK_TREE=$PRODDEST git clean -fd

    elif [ "develop" = "$branch" ]; then
        echo "Develop push, deploy staging..."
        GIT_WORK_TREE=$STAGDEST git checkout -f develop
        GIT_WORK_TREE=$STAGDEST git clean -fd
    fi
done

通过从本地推送到任一远程分支,相应文件夹中的代码在服务器上得到更新。这有效,但我太谨慎了,因为我只是在虚拟制作和暂存文件夹上这样做了。

现在,如果我想在现有的生产网站上使用它,而不移动其位置,该怎么办? (更改PRODDESTSTAGDEST位置后)

我进入我的生产根文件夹,其中包含所有现有代码并运行git initgit add .git commit -m "initial commit"git add remote hub ~/hub.gitgit push hub master。 (还要添加一个bitbucket来源并推送到那个。)

我将为.git

中的.htaccess文件夹添加重写

测试时,我收到消息,要求我先从集线器拉出而不是推送到集线器,因为集线器中有代码,但不在生产文件夹中。

这是一种理智的方式吗,而不会弄乱现有的网站?还有什么我应该注意的吗?

1 个答案:

答案 0 :(得分:0)

这看起来很正确(见下文),这一点:

branch=$(git rev-parse --symbolic --abbrev-ref $refname)

是一个很好的避免取决于ref格式的技巧,但我可能会欺骗并编写循环内部更像:

while read oldrev newrev refname; do
    case $refname in
    refs/heads/master) deployto $PRODDEST prod master;;
    refs/heads/develop) deployto $STAGDEST dev develop;;
    esac
done

使用deployto()函数执行结帐(如果您愿意,也可以使用git clean,但似乎不需要此步骤)。请参阅下面的中间论点。

这里有“很大程度上正确”的地方,可能就是你需要git clean的原因。 Git在index文件中保留目标目录($PRODDEST$STAGDEST)外观的缓存。它不希望目标从一个git checkout更改为下一个deployto() { GIT_WORK_TREE=$1 GIT_INDEX_FILE=$PWD/$GIT_DIR/$2.index git checkout $3 } 。它使用先前的缓存状态来优化将工作树更新到新状态的过程。如果登台和制作完全不同,当最后一次结账到另一棵树时,git将无法获得“之前的状态”。

我认为设置每个目标索引文件是处理此问题的“正确方法”。有很多方法可以构建它,但这是一个使用中间参数的轻度测试方法:

-f

(此处也不需要for(i=d;i>0;i--) { a=a+(num[i-1]*f); f=f*10; } ,除非由于某种原因,Web服务器修改了目标目录。)