Skip to content

Instantly share code, notes, and snippets.

@wilensky
Created November 22, 2017 09:11
Show Gist options
  • Save wilensky/8e79edcd2d375300bfc0d410ec9e4c2d to your computer and use it in GitHub Desktop.
Save wilensky/8e79edcd2d375300bfc0d410ec9e4c2d to your computer and use it in GitHub Desktop.
Symfony deployment script
#!/bin/bash
ENVIRONMENT="prod";
if [ "$3" != "" ]; then
ENVIRONMENT=$3;
fi
if [ "$2" == "" ]; then
echo "Repository URL is mandatory!";
exit 1;
fi
GITHUB_REPO=$2;
#-----------------------------------------------------------------------
BUILD_NAME=$(date +%Y%m%d%H%M);
PROJECT_ROOT="/var/www/projectname/";
MANUAL_BUILD_FOLDER="builds/";
BUILD_PATH=$PROJECT_ROOT$MANUAL_BUILD_FOLDER$BUILD_NAME;
CURRENT_BUILD_SYMLINK="${PROJECT_ROOT}current";
#------SHARED LINKS-----------------------------------------------------
SHARED="shared/";
PARAMETERS="app/config/parameters.yml";
LOGS="var/logs";
SESSIONS="var/sessions";
#DATA="var/data";
UPLOADS="web/uploads";
VENDOR="vendor";
NODE_MODULES="node_modules";
SHARED_PARAMETERS="${PROJECT_ROOT}${SHARED}${PARAMETERS}";
SHARED_LOGS="${PROJECT_ROOT}${SHARED}${LOGS}";
SHARED_SESSIONS="${PROJECT_ROOT}${SHARED}${SESSIONS}";
#SHARED_DATA="${PROJECT_ROOT}${SHARED}${DATA}";
SHARED_UPLOADS="${PROJECT_ROOT}${SHARED}${UPLOADS}";
SHARED_PARAMETERS_DEST="${BUILD_PATH}/${PARAMETERS}";
SHARED_LOGS_DEST="${BUILD_PATH}/${LOGS}";
#SHARED_DATA_DEST="${BUILD_PATH}/${DATA}";
SHARED_UPLOADS_DEST="${BUILD_PATH}/${UPLOADS}";
SHARED_SESSIONS_DEST="${BUILD_PATH}/${SESSIONS}";
VENDOR_DEST="${BUILD_PATH}/${VENDOR}";
NODE_MODULES_DEST="${BUILD_PATH}/${NODE_MODULES}";
function edone(){
echo "Done.";
}
#-----------------------------------------------------------------------
function create_folder(){
echo "CREATING BUILD FOLDER...";
mkdir -p $PROJECT_ROOT$MANUAL_BUILD_FOLDER;
edone;
echo "Switching directory to";
echo $PROJECT_ROOT$MANUAL_BUILD_FOLDER;
cd $PROJECT_ROOT$MANUAL_BUILD_FOLDER; #TODO : cd $_
edone;
}
#-----------------------------------------------------------------------
function clone_repo(){
echo "Cloning project from GitHub";
BRANCH="-b development";
if [ $ENVIRONMENT == "prod" ]; then
BRANCH="-b master";
fi
echo "git clone ${BRANCH} ${GITHUB_REPO} ${BUILD_NAME}";
git clone ${BRANCH} $GITHUB_REPO $BUILD_NAME;
edone;
}
#-----------------------------------------------------------------------
function shared_symlinks(){
echo "Replacing existing files and folders by symlinks to shared resources...";
ln -sf $SHARED_PARAMETERS $SHARED_PARAMETERS_DEST;
rm -rf "${BUILD_PATH}/${LOGS}"
ln -sfn $SHARED_LOGS "${BUILD_PATH}/var/";
rm -rf "${BUILD_PATH}/${SESSIONS}"
ln -sfn $SHARED_SESSIONS "${BUILD_PATH}/var/";
ln -sfn $SHARED_UPLOADS "${BUILD_PATH}/web/";
# ln -sf $SHARED_DATA $SHARED_DATA_DEST;
edone;
}
#-----------------------------------------------------------------------
function copy_vendor(){
echo "Copy vendor folder from last build...";
cp -r "${CURRENT_BUILD_SYMLINK}/${VENDOR}/" $VENDOR_DEST;
cp -r "${CURRENT_BUILD_SYMLINK}/${NODE_MODULES}/" $NODE_MODULES_DEST;
edone;
}
#-----------------------------------------------------------------------
function project_install(){
cd $BUILD_PATH;
echo "Installing project...";
echo $ENVIRONMENT > .env;
echo "| composer";
export SYMFONY_ENV=${ENVIRONMENT}
composer install --no-dev --optimize-autoloader;
#bin/console doctrine:schema:update;
bin/console cache:clear --env=${ENVIRONMENT} --no-debug
edone;
echo "Installing npm...";
echo "| npm";
npm install;
npm run-script postinstall;
npm run-script prod;
edone;
}
#-----------------------------------------------------------------------
function update_current_link(){
echo "Updating \"current\" symlink...";
rm $CURRENT_BUILD_SYMLINK;
ln -s $BUILD_PATH $CURRENT_BUILD_SYMLINK;
edone;
}
#-----------------------------------------------------------------------
function update_rights(){
echo "Updating directory rights...";
chown -R www-data:www-data $CURRENT_BUILD_SYMLINK;
chmod -R 777 "${BUILD_PATH}/var/cache";
chmod -R 777 "${BUILD_PATH}/var/logs";
chmod -R 777 "${BUILD_PATH}/var/sessions";
chmod -R 777 "${BUILD_PATH}/web/uploads";
edone;
}
#-----------------------------------------------------------------------
function restart_workers(){
echo "Restarting workers...";
supervisorctl reread;
supervisorctl update;
supervisorctl restart all;
edone;
}
#-----------------------------------------------------------------------
while getopts "csiruwv" OPTION
do
case ${OPTION} in
c) CLONE_REPO=Y
;;
s) CREATE_SYMLINKS=Y
;;
i) PROJECT_INSTALL=Y
;;
u) UPDATE_CURRENT_LINK=Y
;;
r) UPDATE_RIGHTS=Y
;;
w) RESTART_WORKERS=Y
;;
v) COPY_VENDOR=Y
;;
*) EXIT=Y
;;
esac
done
if [ "${CLONE_REPO}" == "Y" ]; then
create_folder;
clone_repo;
fi
if [ "${CREATE_SYMLINKS}" == "Y" ]; then
shared_symlinks;
fi
if [ "${COPY_VENDOR}" == "Y" ]; then
copy_vendor;
fi
if [ "${PROJECT_INSTALL}" == "Y" ]; then
project_install;
fi
if [ "${UPDATE_RIGHTS}" == "Y" ]; then
update_rights;
fi
if [ "${RESTART_WORKERS}" == "Y" ]; then
restart_workers;
fi
if [ "${UPDATE_CURRENT_LINK}" == "Y" ]; then
update_current_link;
fi
# -----------------------------------------------------
echo -e "\e[92mBUILD PATH: \e[1m\e[36m${BUILD_PATH}\e[0m";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment