svn checkout для развертывания через оболочку - PullRequest
2 голосов
/ 10 января 2012

У меня следующая проблема. Мне нужно организовать автоматическую загрузку для развертывания сервера из репозитория SVN, но с некоторыми особенностями. Вот как я это написал:

# $1 - project; $2 - version (optional)
#   rm -rf $projectDir
if [ "$2" == '' ]; then
    svn export $trunk $projectDir --force >> $log
    version=`svn info $trunk | grep Revision | awk '{print$2}'`
    svn copy $trunk $tags/$version -m "created while uploading last version of $1"
    echo "New stable version #$version of $1 is created
    Uploading to last version is completed successfully"
else
    version=$2
    svn export $tags/$version/ $projectDir --force >> $log
    echo "Revert to version #$version is completed successfully"
fi

echo $version > $projectDir/version

chown -R $1:$1 $projectDir

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

svn co $trunk >> $log
cp -ruf trunk/* $projectDir
svn info $trunk | grep Revision > $projectDir/version
chown -R $project:$project $projectDir
echo "uploading finished"

Это работает очень хорошо и очень-очень быстро (изменяет только измененные файлы), чем экспорт, но:

  1. без автоматического создания тега;
  2. без возможности хорошего возврата.

В моем последнем скрипте co не работает, потому что он пытается извлечь из одного каталога из разных каталогов репозитория (trunk / some tag), что не реально.

Итак, вопрос:

  1. Можно ли переместить проект перед оформлением заказа?
  2. Можно ли найти diff с версией co и существующей версией до экспорта?
  3. Что я могу сделать с результатами сравнения? (удалить ненужные файлы после экспорта?)

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 10 января 2012

Вы оценили Капистрано ?Это может сделать многое из того, что вы пытаетесь достичь.

0 голосов
/ 14 января 2012

За основу для решения был взят следующий код:

Это проще и полностью решает проблему как для меня.

if [ "$2" == '' ]; then
    version=`svn info ${trunk} | grep Revision | awk '{print$2}'`
    if [ `cat ${projectWWW}/version` == "${version}" ]; then
        resultMessage="Project is up to date"
    else
        svn co ${trunk} ${projectRoot}/co >> ${log}
        cp -ruf ${projectRoot}/co/ ${projectRoot}/releases/${version}
        chown -R $1:$1 ${projectRoot}/releases/${version}
        resultMessage="New stable version #$version of $1 is created
        Uploading to last version is completed successfully"
   fi
else
    version=$2
    resultMessage="Revert to version #$version is completed successfully"
fi

ln -s ${projectRoot}/releases/${version} ${projectWWW}
echo ${version} > ${projectWWW}/version
echo ${resultMessage} >> ${log}
...