Czy można wdrożyć witrynę za pomocą git push
? Mam przeczucie, że ma to coś wspólnego z używaniem haków git do wykonywania git reset --hard
po stronie serwera, ale jak miałbym to zrobić?
git
deployment
webserver
githooks
Kyle Cronin
źródło
źródło
Odpowiedzi:
Znalazłem ten skrypt na tej stronie i wydaje się, że działa całkiem dobrze.
Na kopii lokalnej zmodyfikuj plik .git / config i dodaj serwer WWW jako zdalny:
Na serwerze zastąp .git / hooks / post-update tym plikiem (w odpowiedzi poniżej)
Dodaj dostęp do wykonania do pliku (ponownie na serwerze):
Teraz po prostu lokalnie wypchnij na serwer sieciowy i powinien on automatycznie zaktualizować kopię roboczą:
źródło
Korzystając z poniższego pliku po aktualizacji :
Na kopii lokalnej zmodyfikuj plik .git / config i dodaj serwer WWW jako zdalny:
Na serwerze zastąp .git / hooks / post-update poniższym plikiem
Dodaj dostęp do wykonania do pliku (ponownie na serwerze):
Teraz po prostu lokalnie wypchnij na serwer sieciowy i powinien on automatycznie zaktualizować kopię roboczą:
źródło
Po wielu fałszywych uruchomieniach i ślepych zaułkach, w końcu jestem w stanie wdrożyć kod witryny za pomocą „git push remote ” dzięki temu artykułowi .
Skrypt po aktualizacji autora ma tylko jedną linię, a jego rozwiązanie nie wymaga konfiguracji .htaccess, aby ukryć repozytorium Git, jak robią to inni.
Kilka przeszkód, jeśli wdrażasz to na instancji Amazon EC2;
1) Jeśli używasz sudo do utworzenia pustego docelowego repozytorium, musisz zmienić właściciela repo na ec2-user, inaczej push nie powiedzie się. (Spróbuj „chown ec2-user: ec2-user repo .”)
2) Wypychanie zakończy się niepowodzeniem, jeśli nie wstępnie skonfigurujesz lokalizacji swojego prywatnego klucza amazon .pem, albo w / etc / ssh / ssh_config jako parametr IdentityFile, albo w ~ / .ssh / config za pomocą „[ Host] - HostName - IdentityFile - User ”opisany tutaj układ ...
... JEDNAK jeśli Host jest skonfigurowany w ~ / .ssh / config i różni się od HostName, wypychanie Git nie powiedzie się. (To prawdopodobnie błąd Git)
źródło
nie instaluj git na serwerze ani nie kopiuj tam folderu .git. aby zaktualizować serwer z klonu git, możesz użyć następującego polecenia:
być może będziesz musiał usunąć pliki, które zostały usunięte z projektu.
powoduje to skopiowanie wszystkich pobranych plików. rsync używa ssh, który i tak jest zainstalowany na serwerze.
im mniej oprogramowania zainstalowałeś na serwerze, tym jest on bezpieczniejszy i łatwiej jest zarządzać jego konfiguracją i dokumentować ją. nie ma również potrzeby utrzymywania pełnego klona git na serwerze. tylko to sprawia, że bardziej skomplikowane jest prawidłowe zabezpieczenie wszystkiego.
źródło
W zasadzie wszystko, co musisz zrobić, to:
Mam te wiersze w mojej aplikacji jako plik wykonywalny o nazwie
deploy
.więc kiedy chcę wykonać wdrożenie, piszę
./deploy myserver mybranch
.źródło
ssh -A ...
git pull
należy unikać automatycznych wdrożeń, ponieważ część z nich seryjnej może wymagać ręczne czyszczenie czy są jakieś konflikty.Sposób, w jaki to robię, polega na tym, że mam nagie repozytorium Git na moim serwerze wdrażania, gdzie wypycham zmiany. Następnie loguję się do serwera wdrażania, przechodzę do rzeczywistego katalogu dokumentów serwera WWW i wykonuję polecenie git. Nie używam żadnych haczyków, aby spróbować to zrobić automatycznie, co wydaje się większym problemem niż jest warte.
źródło
git reset
aby cofnąć się między najnowszymi zmianami (wszystkie zatwierdzenia, nie tylko całe ściągnięcie). Jeśli chcesz przywrócić coś konkretnego, co nie jest ostatnim zatwierdzeniem, możesz go użyć,git revert
ale prawdopodobnie powinno się go używać tylko w sytuacjach awaryjnych (git revert
tworzy nowe zatwierdzenie, które cofa działanie niektórych poprzednich zatwierdzeń).git config --local receive.denyCurrentBranch updateInstead
Dodane w Git 2.3 może to być dobra możliwość: https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155
Ustawiasz go w repozytorium serwera, a także aktualizuje działające drzewo, jeśli jest czyste.
Wprowadzono dalsze ulepszenia w wersji 2.4 z
push-to-checkout
hakiem i obsługą nienarodzonych gałęzi .Przykładowe użycie:
Wynik:
Ma to następujące niedociągnięcia wymienione w ogłoszeniu GitHub :
Ale wszystkie te punkty są poza zakresem Git i należy się tym zająć za pomocą zewnętrznego kodu. W tym sensie, to razem z haczykami Git są najlepszym rozwiązaniem.
źródło
Aktualizacja: Używam teraz rozwiązania Lloyda Moore'a z kluczowym agentem
ssh -A ...
. Wciśnięcie do głównego repozytorium, a następnie wyciągnięcie go równolegle ze wszystkich twoich maszyn jest nieco szybsze i wymaga mniejszej konfiguracji na tych komputerach.Nie widzę tutaj tego rozwiązania. po prostu push przez ssh, jeśli git jest zainstalowany na serwerze.
Będziesz potrzebować następującego wpisu w lokalnym .git / config
Ale hej, po co to
amazon:
? W swoim lokalnym ~ / .ssh / config musisz dodać następujący wpis:teraz możesz zadzwonić
(BTW: /path/to/project.git jest inny niż rzeczywisty katalog roboczy / ścieżka / do / projektu)
źródło
Dla scenariusza wdrażania
W naszym scenariuszu przechowujemy kod na github / bitbucket i chcemy wdrożyć na serwerach na żywo. W tym przypadku działa dla nas następująca kombinacja (jest to remiks wysoko ocenianych odpowiedzi tutaj) :
.git
katalog na serwer WWWgit remote add live ssh://user@host:port/folder
git config receive.denyCurrentBranch ignore
Na zdalnym:
nano .git/hooks/post-receive
i dodaj tę treść:#!/bin/sh GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f
Na pilocie:
chmod +x .git/hooks/post-receive
git push live
Notatki
Jeśli
.git
folder znajduje się w katalogu głównym dokumentu, upewnij się, że ukryłeś go od zewnątrz, dodając do.htaccess
( źródła ):RedirectMatch 404 /\..*$
źródło
Używamy capistrano do zarządzania wdrażaniem. Budujemy capistrano do wdrożenia na serwerze pomostowym, a następnie uruchamiamy rsync na wszystkich serwerach.
Z capistrano możemy łatwo cofnąć w razie błędu
źródło
Giddyup to niezależne od języka haczyki Git typu „ tylko dodaj wodę” do automatyzacji wdrażania za pomocą git push. Pozwala także mieć niestandardowe zaczepy start / stop do restartowania serwera WWW, podgrzewania pamięci podręcznej itp.
https://github.com/mpalmer/giddyup
Sprawdź przykłady .
źródło
Wygląda na to, że powinieneś mieć dwie kopie na swoim serwerze. Naga kopia, z której można wypychać / wyciągać, z której można by wypchnąć zmiany, gdy skończysz, a następnie sklonujesz to w swoim katalogu internetowym i skonfigurujesz cronjob, aby codziennie aktualizował git pull z katalogu internetowego lub więc.
źródło
Można sobie wyobrazić, że gdy powiesz, że dokonano zatwierdzenia, aby powiedzieć, że gałąź „stabilna” jest ustawiona, ściągnie zmiany i zastosuje je na stronie PHP. Dużym minusem jest to, że nie będziesz mieć dużej kontroli, jeśli coś pójdzie nie tak i wydłuży czas testowania - ale możesz zorientować się, ile pracy będzie wymagało, gdy połączysz powiedzenie gałęzi tułowia ze stabilną gałęzią, aby wiedzieć ile konflikty ty może napotkasz. Ważne będzie, aby mieć oko na wszystkie pliki specyficzne dla witryny (np. Pliki konfiguracyjne), chyba że zamierzasz wyłącznie uruchamiać tylko jedną witrynę.
Czy zamiast tego zastanawiałeś się nad zmianą na stronie?
Informacje na temat haków git można znaleźć w dokumentacji githooks .
źródło
Moje podejście do rozwiązania dla chrześcijan .
źródło
Korzystam z następującego rozwiązania toroid.org , które ma prostszy skrypt przechwytujący .
na serwerze:
i zainstaluj hak na serwerze:
na twoim kliencie:
a następnie opublikować, po prostu wpisz
Pełny opis znajduje się na stronie: http://toroid.org/ams/git-website-howto
źródło
git push web +master:refs/heads/master
zamiast tylkogit push web master
?Jako odpowiedź uzupełniającą chciałbym zaoferować alternatywę. Używam git-ftp i działa dobrze.
https://github.com/git-ftp/git-ftp
Łatwy w użyciu, tylko typ:
a git automatycznie prześle pliki projektu.
pozdrowienia
źródło
Biorąc pod uwagę środowisko, w którym wielu programistów uzyskuje dostęp do tego samego repozytorium, pomocne mogą być następujące wytyczne.
Upewnij się, że masz grupę uniksową, do której należą wszyscy deweloperzy, i przekaż własność repozytorium .git tej grupie.
W .git / config repozytorium serwerów ustaw sharerepository = true. (Mówi to gitowi, aby zezwolić wielu użytkownikom, co jest potrzebne do zatwierdzania i wdrażania.
ustaw umask każdego użytkownika w swoich plikach bashrc, aby były takie same - 002 to dobry początek
źródło
Skończyło się na tym, że stworzyłem własne podstawowe narzędzie do wdrażania, które automatycznie ściągałoby nowe aktualizacje z repozytorium - https://github.com/jesalg/SlimJim - Zasadniczo nasłuchuje hitub po otrzymaniu haka i używa proxy do uruchomienia aktualizacja skryptu.
źródło
Używam dwóch rozwiązań dla haka po otrzymaniu:
ROZWIĄZANIE ROZWIĄZANIA 1
ROZWIĄZANIE ROZWIĄZANIA 2
Oba rozwiązania oparte są na wcześniejszych rozwiązaniach dostępnych w tym wątku.
Uwaga: BRANCH_REGEX = '^ $ {GIT_BRANCH1}.$ 'filtruje nazwy gałęzi pasujące do ciągu „master ” lub „dev *” i wdraża drzewo robocze, jeśli wypchnięta gałąź pasuje. Umożliwia to wdrożenie wersji deweloperskiej i głównej w różnych miejscach.
DEPLOY SOLUTION 1 usuwa tylko pliki, które są częścią repo i zostały usunięte przez zatwierdzenie. Jest szybszy niż Deployment Solution 2.
DEPLOY SOLUTION 2 ma tę zaletę, że usuwa wszelkie nowe pliki z katalogu produkcyjnego, który został dodany po stronie serwera, bez względu na to, czy został dodany do repozytorium, czy nie. Zawsze będzie czysty dupe repo. Jest wolniejszy niż rozwiązanie do wdrażania 1.
źródło