Skip to content

Instantly share code, notes, and snippets.

@smgladkovskiy
Last active August 22, 2023 21:54
Show Gist options
  • Save smgladkovskiy/6133041 to your computer and use it in GitHub Desktop.
Save smgladkovskiy/6133041 to your computer and use it in GitHub Desktop.
Скрипты развёртывания продакшен, дев и тестовой сред на сервере.

Скачивание/обновление файла deploy.sh:

$ curl -o deploy.sh https://gist.githubusercontent.com/smgladkovskiy/6133041/raw/deploy.sh

Скачивание файла project.sh:

$ curl -o project.sh https://gist.githubusercontent.com/smgladkovskiy/6133041/raw/project.sh

Скачивание файла доп комманд extra_commands.sh:

$ curl -o extra_commands.sh https://gist.githubusercontent.com/smgladkovskiy/6133041/raw/extra_commands.sh
#!/bin/bash
. ./paths.sh
cd $SITES_TO_DEPLOY
for DIR in $(find . -mindepth 1 -maxdepth 1 -type d \( ! -iname '.*' \))
do
DEV=0
TEST=0
cd $SITES_TO_DEPLOY/$DIR
echo -e "\nСмотрим папку $DIR"
for SUBDIR in $(find . -mindepth 1 -maxdepth 1 -type d \( ! -iname '.*' \))
do
if [ -e $SUBDIR/1 ]; then
echo -e "\nЕсть отметка о том, что нужно сделать деплой $SUBDIR версии"
rm $SUBDIR/1
touch $SUBDIR/0
if [[ "$SUBDIR" == *dev* ]]; then
DEV=1
fi
if [[ "$SUBDIR" == *test* ]]; then
TEST=1
fi
fi
done
if [[ "$DEV" == 1 ]]; then
echo -e "\ncd $WWW_ROOT/$DIR/config && ./deploy.sh -di"
cd $WWW_ROOT/$DIR/config && ./deploy.sh -di
fi
if [[ "$TEST" == 1 ]]; then
echo -e "\ncd $WWW_ROOT/$DIR/config && ./deploy.sh -ti"
cd $WWW_ROOT/$DIR/config && ./deploy.sh -ti
fi
done
#!/bin/bash
# Скрипт деплоя продуктивной версии проекта
#
# Структура проекта
# / - корень проекта
# |- config/ - папка настроек и скриптов
# | |- deploy_production.sh - скрипт выкладки продуктивной версии проекта
# | |- deploy_development.sh - скрипт выкладки разработческой версии проекта
# | |- database_master.php - конфиг коннекта к продуктивной БД
# | |- database_develop.php - конфиг коннекта к разработческой БД
# | |- project.sh - конфиг для файла деплоя проекта
# | |- deploy.sh - скрипт деплоя
# |
# |- files/ - папка с файлами проекта
# |- logs/ - папка с логами проекта
# |- production -> ./vX.Y.Z - ссылка на продуктивную версию проекта
# |- development -> ./develop - ссылка на разработческую версию проекта
# |- testing -> ./testing - ссылка на тестовую версию проекта
#
. ./project.sh
HELP="deploy.sh -mdh\n
Аргументы скрипта:\n
окружение для деплоя: \n
-m - production [по умолчанию]\n
-d - develop
-t - test
-i - issue collector
-v - verbose mode
"
MODE='-q'
ISSUE_COLLECTOR=0
while getopts ":hmdtvi" Option
# Начальное объявление цикла анализа опций.
# возможные опции (ключи): e
do
case $Option in
m ) ENV='production'; GIT_BRANCH='master';;
d ) ENV='development'; GIT_BRANCH='develop';;
t ) ENV='testing'; GIT_BRANCH='test';;
v ) MODE='';;
i ) ISSUE_COLLECTOR=1;;
h ) echo -e $HELP; exit 1;;
* ) ENV='production'; GIT_BRANCH='master';;
esac
done
shift $(($OPTIND - 1))
# Перейти к следующей опции.
if [ ! $ENV ]; then
ENV='production'
GIT_BRANCH='master'
fi
echo -e "Деплой $ENV окружения...\n"
# Переменные START
# Папки проекта
DIR_FILES="$LINK_DIRS/files_$ENV" # путь до папки файлов проекта
DIR_LOGS="$LINK_DIRS/logs_$ENV" # путь до папки логов проекта
DIR_MEDIA="$LINK_DIRS/media_$ENV" # путь до папки media файлов проекта
IC_JS="$DIR_CONFIG/ic.js" # путь до js файла issue collector
# Символьные ссылки
LN_SITE="$DIR_ROOT/$ENV" # путь до продуктивного инстанса проекта
# Параметры репозитория и папки клонирования
DIR_GIT="$DIR_ROOT/_$GIT_BRANCH"
DB_CONF="$DIR_CONFIG/database_$ENV.php"
# Переменные END
CURRENT_DIR=$DIR_ROOT
cd $CURRENT_DIR
# выкачка последней версии кода из репозитория
if [ -d "$DIR_GIT" ]; then
rm -rf $DIR_GIT
fi
echo -e "\nКлонирование репозитория $GIT_REPO во временную папку исходных кодов проекта $DIR_GIT."
git clone $MODE $GIT_REPO $DIR_GIT
cd $DIR_GIT
# Определение папки приложения в виде последней версии проекта по тегу
if [ "$ENV" = "production" ]; then
VERSION="$(git describe --abbrev=0 --tags)"
DIR_FRESH_DATA="$APP_DIR/$VERSION"
git checkout $MODE $VERSION
else
VERSION="$(git rev-parse --short HEAD)"
DIR_FRESH_DATA="$APP_DIR/$GIT_BRANCH"
git checkout $MODE $GIT_BRANCH
fi
echo -e "\nОбновление сабмодулей"
git submodule $MODE update --init --recursive
# Возвращаемся в прежнюю директорию
echo -e "\nВозврат в директорию скрипта $CURRENT_DIR"
cd $CURRENT_DIR
# создание папки application
if [ ! -d "$APP_DIR" ]; then # проверка на существование папки
echo -e "\nСоздание папки $APP_DIR"
mkdir -p "$APP_DIR"
fi
# создание папки приложения
if [ -d "$DIR_FRESH_DATA" ]; then # проверка на существование папки
echo -e "\nУдаление имеющейся папки папки приложения $DIR_FRESH_DATA и создание новой"
rm -rf "$DIR_FRESH_DATA"
fi
# Создание файла версии
echo -e "\nСоздание файла версии"
echo "<?php return array('version' => '$VERSION');" > "$DIR_GIT/application/config/version.php"
# Копирование файлов из временной папки исходных кодов проекта
echo -e "\nКопирование файлов из временной папки исходных кодов проекта"
mv $DIR_GIT $DIR_FRESH_DATA
# Удаление папок для последующей линковки соответствующих папок приложения
echo -e "\nУдаление папки файлов из папки приложения"
rm -rf "$DIR_FRESH_DATA/application/files"
echo -e "\nУдаление папки логов из папки приложения"
rm -rf "$DIR_FRESH_DATA/application/logs"
echo -e "\nУдаление папки media из папки приложения"
rm -rf "$DIR_FRESH_DATA/htdocs/media"
echo -e "\nУдаление папки .git из приложения"
find $DIR_FRESH_DATA -name .git -exec echo {} \;
if [ -e "$DIR_FRESH_DATA/application/config/database.php" ]; then
echo -e "\nУдаление файла конфига БД из папки приложения"
rm "$DIR_FRESH_DATA/application/config/database.php"
fi
if [ ! -d "$DIR_CONFIG" ]; then
echo -e "\nСозданиепапки конфигов $DIR_CONFIG"
mkdir -p "$DIR_CONFIG"
fi
# проверка на наличие файлов и папок для линковки
if [ ! -e "$DB_CONF" ]; then
echo -e "\nКопирование файла $ENV конфига БД в папку конфигов"
cp -p "${DIR_FRESH_DATA}/modules/database/config/database.php" "$DB_CONF"
fi
if [ ! -d "$DIR_FILES" ]; then
echo -e "\nСоздание папки файлов $DIR_FILES"
mkdir -p "$DIR_FILES"
fi
if [ ! -d "$DIR_LOGS" ]; then
echo -e "\nСоздание папки логов $DIR_LOGS"
mkdir -p "$DIR_LOGS"
fi
if [ ! -d "$DIR_MEDIA" ]; then
echo -e "\nСоздание папки media-файлов $DIR_MEDIA"
mkdir -p "$DIR_MEDIA"
fi
# Линковка конфига и рабочих папок приложения
echo -e "\nСоздание ссылки на $DB_CONF"
ln -sf "$DB_CONF" "$DIR_FRESH_DATA/application/config/database.php"
echo -e "\nСоздание ссылки на $DIR_FILES"
ln -s "$DIR_FILES" "$DIR_FRESH_DATA/application/files"
echo -e "\nСоздание ссылки на $DIR_LOGS"
ln -s "$DIR_LOGS" "$DIR_FRESH_DATA/application/logs"
echo -e "\nСоздание ссылки на $DIR_MEDIA"
ln -s "$DIR_MEDIA" "$DIR_FRESH_DATA/htdocs/media"
echo -e "\nСброс статики в папке $DIR_MEDIA"
rm -rf "$DIR_MEDIA/cache"
rm -rf "$DIR_MEDIA/static"
if [ "$ISSUE_COLLECTOR" = "1" ]; then
echo -e "\nАктивация ISSUE COLLECTOR"
rm "$DIR_FRESH_DATA/htdocs/js/issue_collector.js"
ln -s "$IC_JS" "$DIR_FRESH_DATA/htdocs/js/issue_collector.js"
fi
# выставление прав на файлы и папки приложения
echo -e "\nРасстановка прав на папки cache и media"
chmod -R g+w "$DIR_FRESH_DATA/application/cache"
chmod -R g+w "$DIR_FRESH_DATA/application/logs"
chmod -R g+w "$DIR_FRESH_DATA/htdocs/media"
# Линковка папки приложения для веб-сервера
if [ -e "$LN_SITE" ]; then # проверка на существование ссылки
echo -e "\nУдаление символьной ссылки $LN_SITE"
rm -rf "$LN_SITE"
fi
# Запуск доп команд для проекта
if [ -e $DIR_CONFIG/extra_commands.sh ]; then
export DIR_CONFIG
export DIR_FRESH_DATA
export ENV
echo -e "\nЗапуск доп команд для проекта"
cd $DIR_CONFIG
$DIR_CONFIG/extra_commands.sh
fi
echo -e "\nСоздание символьной ссылки $LN_SITE на $DIR_FRESH_DATA"
ln -sf $DIR_FRESH_DATA $LN_SITE
# Чистка временных файлов и директорий
echo -e "\nУдаление временной директории $DIR_GIT"
rm -rf "$LN_SITE/htdocs/media/cache"
#!/bin/bash
#
# Дополнительные команды
. ./project.sh # импортирование основных переменных
echo -e "\nПереданные переменные:
ENV=$ENV
DIR_CONFIG=$DIR_CONFIG
DIR_FRESH_DATA=$DIR_FRESH_DATA
"
##############################################
SITE_CONF="$DIR_CONFIG/site_$ENV.php"
SITE_CONF_DEPLOY="$DIR_FRESH_DATA/application/config/site.php"
# проверка на наличие файлов и папок для линковки
if [ ! -e "$SITE_CONF" ]; then
echo -e "\nКопирование файла конфига ресурса в папку конфигов"
cp "$SITE_CONF_DEPLOY" "$SITE_CONF"
fi
echo -e "\nУдаление файла конфига ресурса в папке выгрузки $SITE_CONF_DEPLOY"
rm "$SITE_CONF_DEPLOY"
echo -e "\nСоздание ссылки на конфиг ресурса $SITE_CONF -> $SITE_CONF_DEPLOY"
ln -s "$SITE_CONF" "$SITE_CONF_DEPLOY"
##############################################
if [ -e "$DIR_FRESH_DATA/htdocs/minion" ]; then
echo -e "\nПроставляем права на $DIR_FRESH_DATA/htdocs/minion"
chmod +x "$DIR_FRESH_DATA/htdocs/minion"
fi
SITES_TO_DEPLOY="/path/to/deploying/sites/folder"
WWW_ROOT="/path/to/www/sites/root"
# Параметры проекта
DIR_ROOT="/full/path/to/project/directory" # полный путь до корня проекта
GIT_REPO="ssh://git@git.repository.com/reponame.git"
LINK_DIRS="$DIR_ROOT/link_dirs" # путь до папок, которые линкуются в проект
APP_DIR="$DIR_ROOT/application" # путь до папки, где лежат папки проекта для линковки
DIR_CONFIG="$DIR_ROOT/config" # путь до папки настроек проекта
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment