Last active
December 15, 2015 14:49
-
-
Save ssaunier/5277085 to your computer and use it in GitHub Desktop.
Script to init a git repository on a server to easily deploy several website via git (think Heroku!). Useful for Apache + PHP for instance. Bonus: Deployment versioning and custom "install.sh" script run if foud.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# Copyright Sébastien Saunier (@ssaunier) - 2013 | |
# License: MIT | |
# | |
# Script to run at the root of an apache folder where you want to deploy with git. | |
# It will create a repository where you can push, and set up a post-receive script | |
# with is run each time this server gets pushed a new version: | |
# | |
# 1. post-receive compute the new version number based on existing ones | |
# in the $DEPLOYMENT_TARGET_ROOT folder | |
# 2. post-receive checks out a fresh version of the repo to the newest version folder | |
# 3. post-receive keeps only last $VERSIONS_TO_KEEP versions and delete the other ones | |
# 4. post-receive executes the ./install.sh script contained in the repo, in the | |
# folder $APACHE_ROOT, passing as first argument $DEPLOYMENT_TARGET_ROOT/current | |
# 5. post-receive symlink the latest revision to $DEPLOYMENT_TARGET_ROOT/current | |
# | |
# Say you have to VHOSTS in your git repository: | |
# - site1 | |
# - site2 | |
# - install.sh | |
# | |
# On the server, in the $APACHE_ROOT, you will have this: | |
# | |
# - web.git -> the git repository | |
# - site1 -> symlinked to deployment/current/site1 | |
# - site2 -> symlinked to deployment/current/site2 | |
# - deployment | |
# +-- 3 | |
# +-- 4 | |
# +-- 5 | |
# +-- 6 | |
# +-- 7 | |
# +-- current -> symlinked to 7 | |
REPO_NAME=web.git | |
DEPLOYMENT_TARGET_ROOT=~/deployment | |
VERSIONS_TO_KEEP=5 | |
APACHE_ROOT=~/ | |
mkdir -p $REPO_NAME | |
cd $REPO_NAME | |
git --bare init | |
cat <<EOF >hooks/post-receive | |
#!/bin/sh | |
GREEN="\\033[1;32m" | |
NORMAL="\\033[0;39m" | |
DEPLOYMENT_TARGET_ROOT=$DEPLOYMENT_TARGET_ROOT | |
VERSION=1 | |
if [ -d \$DEPLOYMENT_TARGET_ROOT ]; then | |
VERSION=\$((\`ls \$DEPLOYMENT_TARGET_ROOT | sort -n | tail -n 1\` + 1)) | |
fi | |
DEPLOYMENT="\$DEPLOYMENT_TARGET_ROOT/\$VERSION" | |
mkdir -p \$DEPLOYMENT | |
echo "-----> Updating website" | |
echo -e " New version will be: \$GREEN\$VERSION\$NORMAL" | |
GIT_WORK_TREE=\$DEPLOYMENT git checkout -f | |
echo " New version in place, waiting to be symlinked" | |
echo "-----> Keeping only $VERSIONS_TO_KEEP last versions on server" | |
COUNTER=1 | |
LAST_KEPT_VERSION=\$((\$VERSION-$VERSIONS_TO_KEEP-1)) | |
until [ \$COUNTER -ge \$LAST_KEPT_VERSION ]; do | |
rm -rf \$DEPLOYMENT_TARGET_ROOT/\$COUNTER | |
let COUNTER+=1 | |
done | |
for version in \`ls \$DEPLOYMENT_TARGET_ROOT | sort -n\`; do | |
echo " \`stat -c '%n %A %.19z' \$DEPLOYMENT_TARGET_ROOT/\$version\`" | |
done | |
echo "-----> Symlinking current version to version \$VERSION" | |
ln -sfn \$DEPLOYMENT "\$DEPLOYMENT_TARGET_ROOT/current" | |
echo "-----> Executing install script at \$DEPLOYMENT/install.sh" | |
cd \$APACHE_ROOT | |
\$DEPLOYMENT/install.sh \$DEPLOYMENT_TARGET_ROOT/current | |
echo " Install script completed." | |
echo "-----> Congratulations! The new version \$VERSION is now deployed!" | |
EOF | |
chmod +x hooks/post-receive |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment