Как развернуть из репозитория git без доступа сервера к репозиторию?

У меня есть проект PHP в репозитории BitBucket git.

Я работаю в ветке под названием «Разработка» для небольших исправлений или работаю в ветках временных функций. Когда я готов к развертыванию, я объединяю эти ветки в «мастер».

Я хочу максимально упростить развертывание на моем рабочем сайте (слияние с мастером и отправка в BitBucket).

Но я действительно не хочу, чтобы мой сервер имел какой-либо доступ к моему репозиторию, потому что это создает дополнительные проблемы с безопасностью. Если вы заботитесь о безопасности, вы хотите, чтобы ваш репозиторий находился в как можно меньшем количестве мест. Если ваш сервер будет скомпрометирован, это достаточно плохая ситуация, но было бы еще хуже, если бы злоумышленник получил доступ к моему полному репозиторию. Этот человек согласен.

Поэтому я предполагаю, что захочу использовать что-то вроде git archive master, например https://stackoverflow.com/a/163769/470749 объясняет.

Как я могу настроить хук, который обнаруживает нажатие «мастера», а затем запускает git archive master для экспорта последнего кода (но не в виде репо) в сжатый zip-файл, который затем отправляет (через SCP и/или Rsync?) на удаленный сервер, распаковывает его в новый каталог, а затем (возможно, путем изменения символической ссылки) указывает серверу на этот новый каталог?

Бонусный вопрос: как включить простой аварийный откат? (Я предполагаю, что могут быть ситуации, когда я хочу быстро вернуться к предыдущему коммиту.)


person Ryan    schedule 16.09.2013    source источник
comment
github.com/git-ftp/git-ftp   -  person Mark O'Connor    schedule 17.09.2013


Ответы (1)


Я доволен сценариями, которые у меня получились:

развернуть.sh:

##This executable file will export your latest code from master (via "git archive") and will upload it 
##to the remote server and then call a script on the server to handle from there.
##----------------------------------------------------------------------------------------------------

source dev-ops/archive_and_upload.sh

##On the remote server, run a script to archive the existing production site files and then deploy the uploaded package.
ssh -i ~/.ssh/id_rsa [email protected] <<'ENDSSH'

set -e

cd /home/myUserName/myProjectName/latest

##Unzip the zip file, then delete it.
echo "Unzipping the package.zip..."
unzip -o package.zip && rm package.zip  

cd /home/myUserName/myProjectName/

nowTime=$(date -u +"%Y-%m-%d__%H:%M:%S")
echo "The archive will have this timestamp: " $nowTime

##Copy the "latest" folder to a dated "packages" subfolder.
cp -R latest/ packages/$nowTime 
echo "Copied the existing site to an archive."

##Install Laravel dependencies.
echo "Running Composer so that the remote server downloads and installs dependencies..."
cd packages/$nowTime 
php -d memory_limit=256M ~/bin/composer.phar install   

##Delete the "live" symlink and immediately create a new "live" symlink to the most recent subfolder within "packages".
echo "Updating the symlinks..."
cd /home/myUserName/myProjectName/
echo `pwd`
rm previous
mv live previous && ln -s packages/$nowTime live && ls -lah  

##Clear out the "latest" folder in preparation for next time.
echo "Deleting the contents of the 'latest' folder in preparation for next time..."
rm -rf latest/* && ls latest   
ENDSSH

echo "FINISHED DEPLOYING!"

archive_and_upload.sh:

##This executable file will export your latest code from master (via "git archive") and will upload it 
##to the remote server.
##----------------------------------------------------------------------------------------------------

##Clear out the contents of the previous export package.
rm -rf dev-ops/package/*   

##Export the "master" branch of this git repo. (The result is not a repo but is just code.)
git archive --format zip --output dev-ops/package/package.zip master  

##Send zip file to remote server.
scp -i ~/.ssh/id_rsa dev-ops/package/package.zip [email protected]:/home/myUserName/myProjectName/latest/package.zip 

revert_to_previous_package.sh:

ssh -i ~/.ssh/id_rsa [email protected] <<'ENDSSH'

set -e

cd /home/myUserName/myProjectName/

mv live rollingBack && mv previous live && mv rollingBack previous && ls -lah

ENDSSH

echo "ROLLED BACK!"

Как вы можете видеть, я настроил свой сервер Dreamhost для обслуживания из папки с именем «live», которая на самом деле является просто символической ссылкой на подпапку, названную в качестве метки времени, когда этот пакет кода был загружен. Существует также еще одна символическая ссылка, называемая «предыдущая», которая упрощает откат (на случай, если я замечу проблемы после развертывания и захочу вернуться).

person Ryan    schedule 22.09.2013