Git для веб-сайтов / после получения / разделение тестовых и производственных площадок

StackOverflow https://stackoverflow.com/questions/2186411

Вопрос

Я использую GIT, чтобы управлять исходным кодом и развертыванием моего веб-сайта, и в настоящее время есть тестовые и живые сайты, работающие на одном поле. После этого ресурса http://toroid.org/ams/git-website-howto. Первоначально я придумал следующий скрипт крючкового приема для дифференцировки между толками на мой живой сайт и толкает на моем тестовом сайте:

while read ref
do
  #echo "Ref updated:"
  #echo $ref -- would print something like example at top of file
  result=`echo $ref | gawk -F' ' '{ print $3 }'`
  if [ $result != "" ]; then
    echo "Branch found: "
    echo $result
    case $result in
      refs/heads/master )
        git --work-tree=c:/temp/BLAH checkout -f master
        echo "Updated master"
        ;;
      refs/heads/testbranch )
        git --work-tree=c:/temp/BLAH2 checkout -f testbranch
        echo "Updated testbranch"
        ;;
      * )
        echo "No update known for $result"
        ;;
    esac
  fi
done
echo "Post-receive updates complete"

Тем не менее, у меня есть сомнения, что это на самом деле безопасно :) Я ни в коем случае не означает, что Git Expert, но я предполагаю, что Git, вероятно, отслеживает текущую зарегистрированную ветвь, и этот подход, вероятно, имеет потенциал, чтобы запутать его без конца.

Так что несколько вопросов:

  1. Это безопасно?

  2. Будет ли лучший подход, чтобы мой базовый репозиторий быть репозиторию тестового сайта (с соответствующим рабочим каталогом), а затем иметь ли этот репозиторий нажимает на новый репозиторий Live Site, который имеет соответствующий рабочий каталог на базе живой площадки? Это также позволит мне переместить продукцию на другой сервер и сохранить цепочку развертывания в цепочке.

  3. Есть ли что-то, что мне не хватает? Есть ли другой, чистый способ дифференцироваться между тестовым и производственным развертыванием при использовании Git для управления веб-сайтами?

В качестве дополнительной ноты в свете ответа VI, есть хороший способ сделать это, чтобы обрабатывать удаления, не смеясь с файловой системой?

Спасибо, -Сальт

PS - скрипт, который я придумал для нескольких REPOS (и использую, если я не слышу лучше) выглядит следующим образом:

sitename=`basename \`pwd\``

while read ref
do
  #echo "Ref updated:"
  #echo $ref -- would print something like example at top of file
  result=`echo $ref | gawk -F' ' '{ print $3 }'`
  if [ $result != "" ]; then
    echo "Branch found: "
    echo $result
    case $result in
      refs/heads/master )
        git checkout -q -f master
        if [ $? -eq 0 ]; then
            echo "Test Site checked out properly"
        else
            echo "Failed to checkout test site!"
        fi
        ;;
      refs/heads/live-site )
        git push -q ../Live/$sitename live-site:master
        if [ $? -eq 0 ]; then
            echo "Live Site received updates properly"
        else
            echo "Failed to push updates to Live Site"
        fi
        ;;
      * )
        echo "No update known for $result"
        ;;
    esac
  fi
done
echo "Post-receive updates complete"

А потом репо в ../Live/$Sitename (это «голые» репо, добавленные после init, добавленные после init), имеет базовый пост-прием:

git checkout -f
if [ $? -eq 0 ]; then
    echo "Live site `basename \`pwd\`` checked out successfully"
else
    echo "Live site failed to checkout"
fi
Это было полезно?

Решение

Будет ли лучший подход, чтобы мой базовый репозиторий быть репозиторию тестового сайта (с соответствующим рабочим каталогом), а затем иметь ли этот репозиторий нажимает на новый репозиторий Live Site, который имеет соответствующий рабочий каталог на базе живой площадки? Это также позволит мне переместить продукцию на другой сервер и сохранить цепочку развертывания в цепочке.

Определенно да. Это очень редкий случай, который вы хотите, чтобы ваш тестовый сайт размещен прямо рядом со своей производственной площадкой. Это опасно и непрофессионально во всех отношениях, не говорить о коррупции базы данных, блокировки веб-сервера и т. Д.

У меня обычно есть настройка VM для целей тестирования. Работает очень хорошо, и я могу иметь это со мной на моем ноутбуке во время путешествий.

Использование Git для развертывания вашего веб-сайта - это очень хорошая идея, есть много других людей, которые делают это (например, Rob Conroy). Если у вас есть в любом случае, у вас есть живое и тестирование сайта, вы должны иметь отдельные ветви для них в вашем хранилище, настроен в виде ветвей удаленного отслеживания на соответствующих хранилищах серверов. Ваш рабочий процесс становится таким же легким, как и работает в вашей тестовой ветке, толкайте его, чтобы проверить, тестировать его, слияние жить и прожить вживую.

Честно говоря, не делай это слишком тяжело для себя.

Другие советы

Думаю, что оба пути будут работать.

Вы также можете использовать «Git Archive Master | Tar -C C: / TEMP / BLAH -X» и «GIT Archive Live-сайт | Tar-сайт SSH Live-сайт» / var / www -x '".

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

Может быть, обновления сайта должны быть запущены вручную после тестирования версии «Тестирование»?

Я также следовал тому же руководству в Toroid.org, но я хотел бы отметить, что, хотя вы начали с голого репозитория, добавив рабочий каталог, дополнительно потребуется дополнительное обращение. Я обнаружил, что следующий крюк полезен, если у вас есть контент, который может меняться динамически или иным образом или не хотеть терять данные при использовании git checkout -f

предварительный прием

#!/bin/sh
git add -A
git diff --quiet --cached
if [ $? -gt 0 ]; then
    git commit --quiet -m "autocommit"
    echo "Working Directory was out of sync. Pull to receive updated index."
    exit 1
fi

Это остановит кнопку, если есть изменения в удаленном рабочем каталоге. Подумайте об этом как о ком-то (веб-сервере), внесенные изменения, но забывают об этом. С использованием checkout с -f откажется от этих изменений. Этот крючок является хорошим местом, чтобы предотвратить это, но было бы неплохо, если бы был также крючок, вызванный на удаленном сервере до тяги, чтобы вы могли легко получать эти изменения.

пост-прием

#!/bin/sh
git checkout -f
echo "Working directory synced."

Что касается у двух ветвей, я думал, что ваше первое решение было более элегантным, чем иметь дело с несколькими репозиториями. Если вы действительно хотите сохранить вашу производственную площадку, вы можете использовать rsync локально, в котором есть подобная обработка Delta. У меня будет тестирование и стабильная ветвь в репозитории только с сайтом тестирования в качестве рабочего каталога. При готовности к выпуску объединить тестирование в стабильную ветвь, нажмите и иметь крючок, который ищет коммиты для стабильной ветви, составляют вызов rsync.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top