svn post-commit hook: обновлять, только если определенный файл изменился - PullRequest
1 голос
/ 30 января 2012

Хорошо, у меня есть настройка репо SVN на моем сервере.У меня есть настройка перехвата пост-фиксации, которая обновляет папку «DEV», поэтому, когда я фиксирую изменения, она автоматически выдвигает мой поддомен «DEV» на моем сервере.

Что мне сейчас нужно, так это простой способ отправить его на мой «живой» поддомен, когда я буду готов.Субдомен "Live" находится на том же сервере, и в действительности это будет та же команда svn update / ..., что и с DEV, но по другому пути.

Я думал, что у меня может быть определенный файл в моем репо, и, возможно, я мог бы просто изменить этот файл, а затем сделать какое-то условие в моем файле после фиксации, чтобы также обновить мой "живой" каталогесли этот конкретный файл изменился.

Но я не знаю, как написать этот код.В настоящее время мой файл после фиксации выглядит следующим образом:

#!/bin/sh

REPOS="$1"
REV="$2"

svn update /var/www/dev/public

Мне нужно, чтобы он в основном делал это (но с правильным синтаксисом, очевидно)

#!/bin/sh

REPOS="$1"
REV="$2"

svn update /var/www/dev/public
if (pushLive.txt has changed) {
  svn update /var/www/live/public
}

У кого-нибудь есть какие-либо предложения?

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Я бы не стал делать это через зацепку после фиксации, поскольку обновление может занять много времени. Это означает, что пользователям приходится ждать завершения обновления, прежде чем они снова получат контроль над своими рабочими станциями.

Взгляните на Дженкинс .

Jenkins - это сервер непрерывной сборки, но вы можете использовать его, даже если у вас нет build . В вашем случае вы можете использовать его для просмотра хранилища Subversion для действующего домена. Когда Jenkins обнаруживает коммит по этому URL Subversion, он может порождать процесс build . В вашем случае это будет обновление файлов на работающем сервере.

Если ваш сервер - тот же компьютер, на котором работает Jenkins, вы можете легко указать рабочий каталог Jenkins как каталог / var / www / live / public. (По умолчанию Jenkins создаст каталог сборки в $JENKINS_HOME/jobs/<jobname>/workspace, но в Jenkins есть опция, где вы можете указать ее). Кроме того, программирование вообще не нужно. Это быстрее и проще, чем играть с крючком после фиксации.

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

2 голосов
/ 31 января 2012

не уверен, что это наиболее эффективный способ, а также в первом случае технически будет работать с файлом с именем «pushLive.txt» независимо от dir, поэтому вы можете поиграть с этим или убедиться, что файл уникален.

#!/bin/sh

LOOK=/usr/bin/svnlook
REPOS="$1"
REV="$2"

for changes in `$LOOK changed $REPOS | awk '{print $1 "=" $2;}'`;
do

  idx=`expr index "$changes" =`;
  directory=${changes:$idx};
  action=${changes:0:$idx-1};

  case "$directory" in
    *pushLive.txt )
      case "$action" in
        "U" )
           svn update /var/www/dev/test/public
           ;;
      esac
      ;;
  esac
done

exit 0
...