Хочу сказать сразу, цель этого поста не предоставить универсальное решение задачи развертывания кода на сервере, а показать пример, один из вариантов решения такой задачи. Подойдет ли это решение для вашего случая — решать вам.
Итак, задача выгрузки кода на сервера, одна из самых частых рутинных задач в работе программиста. Очень хорошо эта проблема освящена тут. Но до сих пор, многие решают её с помощью тупого копирования выбранных файлов по FTP, что зачатую приводит к путанице, и ошибкам. Ниже я предлагаю более или менее универсальный скрипт на языке bash, который позволит автоматизировать задачу.
Скрипт писался для своих нужд, и вероятно они отличаются от ваших, так что используйте его не как готовое решение, а как пример, и будьте готовы подпилить его напильником под ваши задачи.
Для выгрузки кода на сервер, для начала необходимо закомитить все изменения в svn. После этого можно запустить скрипт. Скрипт сделает вот что:
1.выгрузит из SVN код проекта
2.Запакует код в архив
3.С помощью scp загрузит архив на сервер
4.Распакует его на сервере
Примечание:
deploy.sh имеет ряд параметров, информацию по которым вы можете получить запустив программу с ключом -h
По умолчанию программа выгрузки уже настроена, и самый простой способ её использования просто запустить её без параметров. Если вам необходимо выгрузить и код envos тоже, используйте ключ -y
# sh deploy.sh -y 1
В этом случае выгрузка будет продолжаться несколько дольше. Во время выгрузки кода, deploy.sh будет информировать вас о том что сейчас делает.
Код скрипта:
Пример вывода:
# sh deploy.sh
* Код будет выгружаться на сервер your.server.ru
* Выгружаем код из SVN…
* Создаем архив…
* Копируем архив на сервер…
yourproject.tar.gz 100% 269KB 89.6KB/s 00:03
* Распаковываем архив на серверe…
* Чистим…
* Готово!
В случае ошибки на любом из этапов, выполнение команды будет прервано.
Хочу обратить ваше внимание на параметр -y, который заведует выгрузкой Envos.Framework. Долго думал, убирать этот код или не надо. Решил оставить. Многие из вас, вероятно, пользуются своим любимым каркасом приложений, код которого не требуется выгружать постоянно. Зачастую эти фреймворки не маленькие, и выгрузка может занять лишнее время. Скрипт это учитывает, но если вы используете другой framework, вам нужно будет немного переписать код.
Ну и в заключение, хочу сказать, что я не являюсь гуру bash, и буду признателен за советы по улучшению кода скрипта. С другой стороны, некоторые пути оптимизации я вижу и сам, но в таких объемах кода, считаю, что вынос, например, кода проверки выполнения предыдущей операции, в функцию — это охота на блох. Но, конечно же, если скрипт будет развиваться и усложняться, такой рефакторинг станет нелишним.
Если вы все еще пользуетесь FTP для выгрузки своего кода, настало время задуматся :)
Итак, задача выгрузки кода на сервера, одна из самых частых рутинных задач в работе программиста. Очень хорошо эта проблема освящена тут. Но до сих пор, многие решают её с помощью тупого копирования выбранных файлов по FTP, что зачатую приводит к путанице, и ошибкам. Ниже я предлагаю более или менее универсальный скрипт на языке bash, который позволит автоматизировать задачу.
Скрипт писался для своих нужд, и вероятно они отличаются от ваших, так что используйте его не как готовое решение, а как пример, и будьте готовы подпилить его напильником под ваши задачи.
Для выгрузки кода на сервер, для начала необходимо закомитить все изменения в svn. После этого можно запустить скрипт. Скрипт сделает вот что:
1.выгрузит из SVN код проекта
2.Запакует код в архив
3.С помощью scp загрузит архив на сервер
4.Распакует его на сервере
Примечание:
Для того что бы не вводить пароль к ssh, лучше всего воспользоваться возможностью авторизации по ключу. Для этого необходимо использовать программу ssh-keygen, с помощью которой сгенерировать пару public key/private key. Подробное освящение этого вопроса, выходит за рамки данной статьи, так что google вам в помощь, если вы не в теме.
deploy.sh имеет ряд параметров, информацию по которым вы можете получить запустив программу с ключом -h
# sh deploy.sh -h
Code deployer: version 1.2
Использование: sh deploy.sh [-y 0 | -y 1] [-d path/to/source] [-H your.server.ru] [-u username]
Пример: sh deploy.sh -y 0 -H your.server.ru -d /tmp -u progger
Исправьте переменную SVN_PATH, в коде этого скрипта, если изменился SVN репозиторий проекта.
Текущий SVN: your.svnserver.ru/svn/repos/ypurproject/trunk
Параметры:
y - надо ли выгружать envos: 0 - не надо, 1 - надо (долго) (по умолчанию: 0)
u - пользователь для SSH (по умолчанию: )
d - путь на сервере (по умолчанию: /opt/hosting/your.server.ru)
H - доменное имя сервера для SSH соединения (по умолчанию: your.server.ru)
h - эта помощь
По умолчанию программа выгрузки уже настроена, и самый простой способ её использования просто запустить её без параметров. Если вам необходимо выгрузить и код envos тоже, используйте ключ -y
# sh deploy.sh -y 1
В этом случае выгрузка будет продолжаться несколько дольше. Во время выгрузки кода, deploy.sh будет информировать вас о том что сейчас делает.
Код скрипта:
#!/bin/bash
#настройки по умолчанию
HOST='your.server.ru'
SVN_PATH='https://your.svnserver.ru/svn/repos/yourptoject/trunk/'
DOC_ROOT="/opt/hosting/$HOST"
UPLOAD_ENVOS=0; #надо ли выгружать envos: 0 - не надо, 1 - надо (долго)
USER=''
bold='\E[1m'
ebold='\E[0m'
while getopts ":y:u:d:H:h" optname
do
case $optname in
"y")
UPLOAD_ENVOS="$OPTARG"
;;
"d")
DOC_ROOT="$OPTARG"
;;
"u")
USER="$OPTARG"
;;
"H")
HOST="$OPTARG"
;;
"h")
echo -e "${bold}Yourproject code deployer: version 1.2 $ebold"
echo "Использование: sh deploy.sh [-y 0 | -y 1] [-d path/to/source] [-H your.server.ru] [-u username]"
echo -e "${bold}Пример: sh deploy.sh -y 0 -H your.server.ru -d /tmp -u progger $ebold"
echo ""
echo "Исправьте переменную SVN_PATH, в коде этого скрипта, если изменился SVN репозиторий проекта.
Текущий SVN: $SVN_PATH"
echo ""
echo -e "${bold}Параметры: $ebold"
echo " y - надо ли выгружать envos: 0 - не надо, 1 - надо (долго) (по умолчанию: $UPLOAD_ENVOS)"
echo " u - пользователь для SSH (по умолчанию: $USER)"
echo " d - путь на сервере (по умолчанию: $DOC_ROOT)"
echo " H - доменное имя сервера для SSH соединения (по умолчанию: $HOST)"
echo " h - эта помощь"
echo ""
exit 0;
;;
*)
echo "Unknown parameter or option error with option - $OPTARG"
exit 1;
;;
esac
done
if [ $USER ]
then
SSH_HOST="$USER@$HOST"
else
SSH_HOST=$HOST
fi
#rm -rf ./yourproject-tmp
echo "* Код будет выгружаться на сервер $SSH_HOST"
echo '* Выгружаем код из SVN...'
svn export --force $SVN_PATH ./yourproject-tmp > /dev/null
if [ $? -ne 0 ]
then
exit 1;
fi;
echo '* Создаем архив...'
tar -czf yourproject.tar.gz yourproject-tmp
if [ $? -ne 0 ]
then
exit 1;
fi;
echo '* Копируем архив на сервер...'
scp ./yourproject.tar.gz $SSH_HOST:$DOC_ROOT
if [ $? -ne 0 ]
then
exit 1;
fi;
echo '* Распаковываем архив на серверe...'
ssh $SSH_HOST "cd $DOC_ROOT; tar -xzf yourproject.tar.gz 2> /dev/null && rm -rf $DOC_ROOT/op && mv $DOC_ROOT/yourproject-tmp $DOC_ROOT/op && chmod -R a+w $DOC_ROOT/op"
if [ $? -ne 0 ]
then
exit 1;
fi;
#надо ли выгружать envos (надо если новая версия)
if [ $UPLOAD_ENVOS -eq 1 ]
then
echo '* Выгружаем envos (может занять пару минут)...'
echo '* Пакуем envos...'
tar -czf envos.tar.gz envos
if [ $? -ne 0 ]
then
exit 1;
fi;
echo ' * Копируем архив envos на сервер...'
scp ./envos.tar.gz $SSH_HOST:$DOC_ROOT
if [ $? -ne 0 ]
then
exit 1;
fi;
echo ' * Распаковываем архив envos на сервере...'
ssh $SSH_HOST "rm -rf $DOC_ROOT/envos && cd $DOC_ROOT/; tar -xzf envos.tar.gz 2> /dev/null"
if [ $? -ne 0 ]
then
exit 1;
fi;
fi
#удаляем временные файлы
echo '* Чистим...'
rm -rf ./yourproject-tmp
echo '* Готово!'
* This source code was highlighted with Source Code Highlighter.
Пример вывода:
# sh deploy.sh
* Код будет выгружаться на сервер your.server.ru
* Выгружаем код из SVN…
* Создаем архив…
* Копируем архив на сервер…
yourproject.tar.gz 100% 269KB 89.6KB/s 00:03
* Распаковываем архив на серверe…
* Чистим…
* Готово!
В случае ошибки на любом из этапов, выполнение команды будет прервано.
Хочу обратить ваше внимание на параметр -y, который заведует выгрузкой Envos.Framework. Долго думал, убирать этот код или не надо. Решил оставить. Многие из вас, вероятно, пользуются своим любимым каркасом приложений, код которого не требуется выгружать постоянно. Зачастую эти фреймворки не маленькие, и выгрузка может занять лишнее время. Скрипт это учитывает, но если вы используете другой framework, вам нужно будет немного переписать код.
Ну и в заключение, хочу сказать, что я не являюсь гуру bash, и буду признателен за советы по улучшению кода скрипта. С другой стороны, некоторые пути оптимизации я вижу и сам, но в таких объемах кода, считаю, что вынос, например, кода проверки выполнения предыдущей операции, в функцию — это охота на блох. Но, конечно же, если скрипт будет развиваться и усложняться, такой рефакторинг станет нелишним.
Если вы все еще пользуетесь FTP для выгрузки своего кода, настало время задуматся :)