Развертывание сайта в нескольких средах с помощью git - PullRequest
2 голосов
/ 22 сентября 2011

В настоящее время я развертываю проект в рабочей среде с помощью git, используя git push production master в хранилище со следующим хуком после получения:

#!/bin/bash
GIT_WORK_TREE=/home/username/www.example.com/myproject/ git checkout -f

production - это удаленный сервер, добавленный через git remote add production ssh://server/home/username/projects/myproject.git.

Но теперь мне нужно развернуть отдельную ветку по отдельному пути на сервере.Я придумала решение, но я полагаю, что есть лучший способ сделать это.

Я создал новое хранилище на сервере myproject-alternate.git с аналогичным перехватом после получения (заменяя/myproject/ с /myproject-alternate/), добавлен этот новый репозиторий с git remote add alternate ssh://server/home/username/projects/myproject-alternate.git.Теперь я могу выполнить развертывание по альтернативному пути с помощью git push alternate branchname:master.

. Это работает, но у меня есть некоторые проблемы:

  1. Команда для развертывания на альтернативном сервере не та, что была у меняожидание - не раз я забывал :master в конце, и хранилище сервера получало новую ветвь, а ловушка после получения не запускалась.
  2. Я не уверен, создаю ли новый хранилище всервер был лучшим решением, и мне интересно, что произойдет с большим проектом.

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

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

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

[remote "alternate"]
    url = ssh://server/home/username/projects/myproject-alternate.git
    fetch = +refs/heads/master:refs/remotes/alternate/master
    pushurl = ssh://server/home/username/projects/myproject-alternate.git
    push = refs/heads/branchname:refs/heads/master
[remote "production"]
    url = ssh://server/home/username/projects/myproject.git
    fetch = +refs/heads/master:refs/remotes/production/master
    pushurl = ssh://server/home/username/projects/myproject.git
    push = refs/heads/master:refs/heads/master

Это настроит его так, чтобы при вводе

git push alternate

он будет автоматически перемещать локальную ветвь branchname в удаленную ветвь master в альтернативном репозитории.

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

#!/bin/bash
checkout_alt=
checkout_prod=
while read oldrev newrev refname; do
    case "$refname" in
        ( "refs/heads/branchname" )
            export checkout_alt=1 ;;
        ( "refs/heads/master" )
            export checkout_prod=1 ;;
    esac
done
test -n "$checkout_alt" && GIT_WORK_TREE=/home/diazona/tmp/gittest/alt/ git checkout -f branchname
test -n "$checkout_prod" && GIT_WORK_TREE=/home/diazona/tmp/gittest/prod/ git checkout -f master

(очевидно, у вас нет , чтобы использовать ifзаявление).Если вы сделаете это, я предлагаю сделать хранилище пустым, чтобы в нем не хранилась собственная рабочая копия, просто для простоты.Таким образом, вам нужен только один пульт, и всякий раз, когда вы нажимаете ветку master, она обновляет производственное рабочее дерево, а всякий раз, когда вы нажимаете ветку branchname, она обновляет альтернативное рабочее дерево.

Отказ от ответственности: я на самом деле не проверял это, поэтому сначала попробуйте в тестовой папке.Если я найду какие-либо ошибки, я вернусь и отредактирую.

0 голосов
/ 02 сентября 2013

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

Например:

Branch      | Directory on remote
--------------------------------------
master      | /www/foo.com/master
staging     | /www/foo.com/staging
production  | /www/foo.com/produciton

Итак, чтобы сделать это, добавьте следующую функцию в ваши точечные файлы сервера:

function gitorigin() {
    mkdir -p "$1"
    cd "$1"
    git init --bare
    git config core.bare false
    git config receive.denycurrentbranch ignore
    cat <<EOF >hooks/post-receive
#!/bin/bash

while read oldrev newrev ref
do
    branch=\`echo \$ref | cut -d/ -f3\`
    mkdir -p ../\$branch
    git --work-tree=../\$branch checkout -f \$branch
    echo Changes pushed to \$branch
done
EOF
    chmod +x hooks/post-receive
    cd ..
}

В Remote создайте репозиторий:

$ cd /www/foo.com
$ gitrepo foo.git

В локальном режиме нажмите ветвь

$ cd ~/Sites/foo.com
$ git remote add origin ssh:///<USER>@<HOST>/www/foo.com/foo.git
$ git push origin <BRANCH>

Переместит вашу основную ветвь вверх на удаленную, в /www/foo.com/<BRANCH>/.

...