#!/bin/bash # # Continuous Deployment # --------------------- # # This file is a post-receive hook to be installed in the # ./hooks/ dir of a bare git repository. # # When pushing to that repo from outside (a dev machine, # or a jenkins/gitlab ci_cd rule), it updates a working dir previously # set by cd to ${TARGET} and get the latest code . # How to set it up: # ----------------- # # On the server to deploy: # # 1- create a bare repository and set hook # git clone url-to-central-repo deploy-repo.git # cp post-receive.git-hook deploy-repo.git/hooks/post-receive # # 2- set a working dir and configure # cd /var/www/ # git clone deploy-repo.git your-app-dir # do_any_config_tasks # # # On the desktop computer: # # 1- add the server as a remote source # git remote add deploy url-to-deploy-repo.git # # 2- try it out # git push deploy HEAD:BRANCH_NAME # # $TARGET: is the working dir you want to update at last # $BRANCH: is the branch you want to update from # TARGET="/home/debian/heliopropa" BRANCH="DEV" #GIT_DIR="/home/debian/heliopropa.git" REPOSITORY="local-bare" while read oldrev newrev ref do # only checking out the branch you would like to deploy if [ "$ref" = "refs/heads/$BRANCH" ]; then echo "Ref $ref received. Deploying ${BRANCH} branch to production..." [ -d $TARGET ] || exit cd $TARGET || exit unset GIT_DIR git stash # remove any modification, sorry guy. git checkout ${BRANCH} # set branch if not done yet, sorry guy git pull ${REPOSITORY} ${BRANCH} # get latest modifications, assumes remote origin previously set exec git update-server-info /bin/sh ./post-deploy.sh # Alternately, it is possible to just update a git repo echo "DONE -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" else echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server." fi done