Deploy a project using Git push

后端 未结 19 1164
囚心锁ツ
囚心锁ツ 2020-11-22 07:06

Is it possible to deploy a website using git push? I have a hunch it has something to do with using git hooks to perform a git reset --hard on the

19条回答
  •  执笔经年
    2020-11-22 08:03

    I use two solutions for post-receive hook:

    DEPLOY SOLUTION 1

    #!/bin/bash 
    #  /git-repo/hooks/post-receive - file content on server (chmod as 755 to be executed)
    # DEPLOY SOLUTION 1 
    
        export GIT_DIR=/git/repo-bare.git
        export GIT_BRANCH1=master
        export GIT_TARGET1=/var/www/html
        export GIT_BRANCH2=dev
        export GIT_TARGET2=/var/www/dev
        echo "GIT DIR:  $GIT_DIR/"
        echo "GIT TARGET1:  $GIT_TARGET1/"
        echo "GIT BRANCH1:  $GIT_BRANCH1/"
        echo "GIT TARGET2:  $GIT_TARGET2/"
        echo "GIT BRANCH2:  $GIT_BRANCH2/"
        echo ""
    
        cd $GIT_DIR/
    
    while read oldrev newrev refname
    do
        branch=$(git rev-parse --abbrev-ref $refname)
        BRANCH_REGEX='^${GIT_BRANCH1}.*$'
        if [[ $branch =~ $BRANCH_REGEX ]] ; then
            export GIT_WORK_TREE=$GIT_TARGET1/.
            echo "Checking out branch: $branch";
            echo "Checking out to workdir: $GIT_WORK_TREE"; 
    
            git checkout -f $branch
        fi
    
        BRANCH_REGEX='^${GIT_BRANCH2}.*$'
        if [[ $branch =~ $BRANCH_REGEX ]] ; then
            export GIT_WORK_TREE=$GIT_TARGET2/.
            echo "Checking out branch: $branch";
            echo "Checking out to workdir: $GIT_WORK_TREE"; 
    
            git checkout -f $branch
        fi
    done
    

    DEPLOY SOLUTION 2

    #!/bin/bash 
    #  /git-repo/hooks/post-receive - file content on server (chmod as 755 to be executed)
    # DEPLOY SOLUTION 2
    
        export GIT_DIR=/git/repo-bare.git
        export GIT_BRANCH1=master
        export GIT_TARGET1=/var/www/html
        export GIT_BRANCH2=dev
        export GIT_TARGET2=/var/www/dev
        export GIT_TEMP_DIR1=/tmp/deploy1
        export GIT_TEMP_DIR2=/tmp/deploy2
        echo "GIT DIR:  $GIT_DIR/"
        echo "GIT TARGET1:  $GIT_TARGET1/"
        echo "GIT BRANCH1:  $GIT_BRANCH1/"
        echo "GIT TARGET2:  $GIT_TARGET2/"
        echo "GIT BRANCH2:  $GIT_BRANCH2/"
        echo "GIT TEMP DIR1:  $GIT_TEMP_DIR1/"
        echo "GIT TEMP DIR2:  $GIT_TEMP_DIR2/"
        echo ""
    
        cd $GIT_DIR/
    
    while read oldrev newrev refname
    do
        branch=$(git rev-parse --abbrev-ref $refname)
        BRANCH_REGEX='^${GIT_BRANCH1}.*$'
        if [[ $branch =~ $BRANCH_REGEX ]] ; then
            export GIT_WORK_TREE=$GIT_TARGET1/.
            echo "Checking out branch: $branch";
            echo "Checking out to workdir: $GIT_WORK_TREE"; 
    
            # DEPLOY SOLUTION 2: 
            cd $GIT_DIR/; mkdir -p $GIT_TEMP_DIR1; 
            export GIT_WORK_TREE=$GIT_TEMP_DIR1/.
            git checkout -f $branch
            export GIT_WORK_TREE=$GIT_TARGET1/.
            rsync $GIT_TEMP_DIR1/. -v -q --delete --delete-after -av $GIT_TARGET1/.
            rm -rf $GIT_TEMP_DIR1
        fi
    
        BRANCH_REGEX='^${GIT_BRANCH2}.*$'
        if [[ $branch =~ $BRANCH_REGEX ]] ; then
            export GIT_WORK_TREE=$GIT_TARGET2/.
            echo "Checking out branch: $branch";
            echo "Checking out to workdir: $GIT_WORK_TREE"; 
    
            # DEPLOY SOLUTION 2: 
            cd $GIT_DIR/; mkdir -p $GIT_TEMP_DIR2; 
            export GIT_WORK_TREE=$GIT_TEMP_DIR2/.
            git checkout -f $branch
            export GIT_WORK_TREE=$GIT_TARGET2/.
            rsync $GIT_TEMP_DIR2/. -v -q --delete --delete-after -av $GIT_TARGET2/.
            rm -rf $GIT_TEMP_DIR2
        fi
    done
    

    Both solutions are based on earlier solutions available in this thread.

    Note, the BRANCH_REGEX='^${GIT_BRANCH1}.$' filters for the branch names matching "master" or "dev*" string, and deploys the work tree, if the pushed branch matches. This makes possible to deploy a dev version and master version to different places.

    DEPLOY SOLUTION 1 removes only files, which are part of the repo, and was removed by a commit. It is faster than Deployment Solution 2.

    DEPLOY SOLUTION 2 has the advantage, that it will remove any new files from the production directory, which was added on server side, no matter if it was added to the repo or not. It will be always clean dupe of the repo. It is slower than Deployment Solution 1.

提交回复
热议问题