#svn #git #continuous-integration
#svn #git #непрерывная интеграция
Вопрос:
Я читал и искал решение в течение нескольких дней, но не нашел ничего, что соответствовало бы моим потребностям.
У нас есть часто обновляемые сайты, которые обновляются дизайнерами и разработчиками, которые большую часть времени не фиксируют свои изменения в SVN.
Я рассматриваю решения типа непрерывной интеграции, в которых при обновлении «версионного» файла на промежуточном сервере он автоматически фиксируется в SVN.
CruiseControl и другие инструменты, которые я рассмотрел, этого не делают; есть ли инструмент, который делает это, или лучший процесс, который мы могли бы использовать?
Спасибо за любую помощь!
Крис
Комментарии:
1. Смотрите этот вопрос о программистах: Простой способ привлечь непрограммистов (т. Е. дизайнеров) к использованию контроля версий?
Ответ №1:
Мне действительно нравится, что вы сказали «улучшить процесс», потому что ответ там — да.
Пусть ваши дизайнеры и все остальные работают с репозиторием. Не имеет значения, выбираете ли вы SVN или git или что-то еще, но сделайте это «авторитетной» копией. Это в конечном итоге избавит вас от головной боли, поскольку у вас будет четкая история всех изменений, и вы всегда сможете вернуться.
Способ, которым я настроил несколько сред для магазинов веб-дизайна, — это система, противоположная той, что вы предлагаете, она работает следующим образом:
- Все дизайнеры работают над извлеченными копиями сайтов и вносят изменения и фиксируют / обновляют по мере необходимости.
- При фиксации репозиторий отправляет копию сайта на промежуточный сервер, который настроен почти идентично рабочему.
- Если сайт работает на промежуточном этапе, существует очень высокая уверенность в том, что он будет работать на реальном сервере.
- Когда все будет готово, копию сайта на промежуточном сервере можно скопировать в live, и теперь вы обновили свой сайт очень ответственным образом, и у вас есть история всех ваших изменений. (Для этого мне нравится использовать rsync, вы можете заставить его работать так, как считаете нужным)
Я надеюсь, это поможет вам немного подумать о вашем процессе.
Возвращаясь к вашему первоначальному вопросу: если вы действительно не хотите изменять свой процесс, вы могли бы настроить cron, который запускается каждые несколько минут и добавляет / фиксирует все измененные файлы, и это должно сработать. Но мне это не нравится, потому что теперь у вас нет значимых сообщений о фиксации, и история изменений также может не иметь смысла. Поскольку люди работают и сохраняют файлы, они не понимают, в какой момент они фиксируются, поэтому, скорее всего, в репозитории сейчас есть ревизии, которые находятся в нерабочем состоянии, и теперь, как вы находите ревизии, которые не повреждены? Выбор «автоматизировать» фиксацию, очевидно, не самое чистое решение.
Комментарии:
1. Да, это, похоже, лучший вариант. Это то, чем я занимался в другой компании, но потом меня раскрыли =) Надеюсь, дизайнеров можно убедить следовать этому, они будут использовать преимущества. Спасибо @ctcherry!
Ответ №2:
Я полагаю (хотя я этого не пробовал), что вы могли бы написать observer для watchdog ( http://packages.python.org/watchdog / ) это сделало бы фиксацию за вас.
Однако я согласен с ctcherry в том, что вы получите много сохранений в нерабочем состоянии. Вам действительно нужно изменить свой процесс.
Комментарии:
1. Да, я думаю, что собираюсь запустить процесс, описанный ctcherry.
Ответ №3:
Похоже, вы хотите использовать WebDAV для автозаполнения в Subversion. Subversion и WebDAV
Я уже использовал эту методологию раньше. Это приятно тем, что вы можете настроить его как общий сетевой ресурс Windows / Linux. Нетехнический специалист просто видит это как сетевой диск для хранения файлов. Всякий раз, когда пользователь сохраняет документ / файл там, он автоматически фиксируется.
У Git может быть что-то подобное, но у меня нет опыта работы с этим.
Ответ №4:
CruiseControl и другие инструменты, на которые я смотрел, этого не делают
Я бы позволил себе не согласиться. Если бы вам нужно было настроить <exec>
блок для выполнения вызова инструментов командной строки SVN для фиксации кода за вас, разве это не сделало бы именно то, что вы просите? Вы можете использовать <filesystem>
узел, чтобы определить, какие файлы были изменены.
Теперь, хотя вы могли бы это сделать, я тоже согласен с @ctcherry, что это может привести к принудительному запуску повреждающего кода, если вы сразу перейдете к производству с этим.
Ответ №5:
На сайте разработчика вы можете разработать один инструмент для поддержки этой вещи, вы можете увидеть приведенный ниже код, приведенный ниже код поможет вам выполнить автоматическую фиксацию в SVN, взгляните 🙂
Любые отзывы или вопросы, оставьте свой комментарий, мы можем обсудить это
Смотрите код здесь:
public static string AppTitle = "Auto Commit";
// AddFileToSVN
public static bool AddFileToSVN(string strLogFile, string path,
Timer myTimer)
{
try
{
using (SharpSvn.SvnClient client = new SharpSvn.SvnClient())
{
Collection changeFiles = new
Collection();
client.GetStatus(path, out changeFiles);
foreach (SharpSvn.SvnStatusEventArgs changeFile in
changeFiles)
{
if (changeFile.LocalContentStatus ==
SharpSvn.SvnStatus.Missing)
{
client.Delete(changeFile.Path);
WriteLog(strLogFile, changeFile.Path " Removed -
Missing files (that are not in filesystem)");
myTimer.Enabled = false;
}
if (changeFile.LocalContentStatus ==
SharpSvn.SvnStatus.NotVersioned)
{
client.Add(changeFile.Path);
WriteLog(strLogFile, changeFile.Path " Added -
This file is new in filesystem!");
myTimer.Enabled = false;
}
}
return true;
}
}
catch (Exception ex)
{
myTimer.Enabled = true;
WriteLog(strLogFile, ex);
return false;
}
}
// CommitToSVN
public static bool CommitToSVN(string strLogFile, string workingcopy,
string message, Timer myTimer)
{
using (SharpSvn.SvnClient client = new SharpSvn.SvnClient())
{
SharpSvn.SvnCommitArgs args = new SharpSvn.SvnCommitArgs();
args.LogMessage = message;
args.ThrowOnError = true;
args.ThrowOnCancel = true;
try
{
myTimer.Enabled = true;
return client.Commit(workingcopy, args);
}
catch (Exception ex)
{
myTimer.Enabled = true;
WriteLog(strLogFile, ex);
return false;
}
}
}
посмотреть больше информации: здесь