Jak mogę automatycznie wdrożyć moją aplikację po git push (GitHub i node.js)?
92
Mam swoją aplikację (node.js) wdrożoną na VPS (linux). Używam centrum git jako repozytorium. Jak mogę automatycznie wdrożyć aplikację za pomocą git push?
Cześć, bardzo dziękuję. Co uniemożliwia Bobowi wykonanie mojego skryptu wdrożeniowego?
Zaawansowany
16
@ Zaawansowane 1 może uprawnienia do skryptu, flaga wykonania ... 2 dodanie tagu zamykającego w PHP jest złą praktyką.
Paweł Dubiel
3
@ Zaawansowane Jedną z technik, dzięki której Bob nie wykona Twojego skryptu, jest upewnienie się, że żądanie POST pochodzi z serwerów Github. Sprawdź nagłówki HTTP, które wysyłają podczas wysyłania żądania. Możesz także utworzyć „tajny” adres URL, którego nie można zgadnąć.
@ Arius2038 Słyszałeś kiedyś o „uczysz się czegoś nowego każdego dnia”? cóż, to jest moje „coś nowego” dzisiaj. Dzięki za udostępnienie!
Purefan
23
Było kilka wzmianek o hakach Gita jako odpowiedziach / komentarzach, które działały dla mnie w przeszłości ... więc oto mój przepis, gdyby ktoś inny wymagał więcej szczegółów.
Używam kombinacji haka po odbiorze git i nadzorcy węzła, aby wykonać proste automatyczne wdrażanie (zakładając, że używasz zdalnego repozytorium git na tej maszynie).
To jest w porządku, jednak jedną rzeczą, o której należy pamiętać, jest to, że jeśli dodasz nowy npm do swojej aplikacji lokalnej, będziesz musiał wykonać instalację npm dla tego modułu również na serwerze. Jeśli tego nie zrobisz, prawdopodobnie będziesz mieć awarię aplikacji.
k00k
2
Nie. Wszystkie moduły węzłów, od których zależy moja lokalna aplikacja, są instalowane w podkatalogu node_modules mojego projektu, który jest moim lokalnym repozytorium GIT, dlatego kiedy dodaję, zatwierdzam, a następnie wypycham na zdalny serwer, są one również kopiowane.
Wes Johnson
8
Racja, ale oznacza to, że jeśli którykolwiek z tych modułów miał kod, który został skompilowany (na przykład mhash), może nie działać na innym serwerze, który ma inny system operacyjny i / lub architekturę. Używanie package.json do śledzenia zależności, a następnie strategia wdrażania, która działa npm install -lna zdalnym serwerze, jest inteligentna. Można to oczywiście połączyć z metodą za pomocą haków po odbiorze.
k00k
1
i możesz po prostu dodać drzewo robocze Git bezpośrednio do polecenia git checkout: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (zamiast tworzyć zmienną i eksportuję ją do skryptu
JasonB,
Pytanie dotyczy jednak Githuba.
Noah
18
Prawdopodobnie bardzo późno na odpowiedź tutaj. Ale znalazłem ten projekt na githubie i wydaje się, że robi to, co chcesz, ale w znacznie czystszy sposób.
"Prawdopodobnie bardzo późno na odpowiedź tutaj." Nigdy nie jest za późno. :) W rzeczywistości wspierasz całą społeczność (większość z nas, pracowników Google; wow, tylko patrząc na te 20 tys. Wyświetleń!), A nie jeden facet zadał pytanie „jakiś czas temu”. Czas sam w sobie nie ma znaczenia: tak długo, jak dana technologia jest istotna, twoja odpowiedź również będzie. (Dzięki za cynk, przy okazji sprawdzam ...)
Sz.
1
dzięki za twoją uwagę! ;) Świetnie mi się wtedy udało. Teraz wolę używać travis (travis-ci.org) ( gdziekolwiek mogę ) do automatycznych wdrożeń. @lunakid
Saurabh Kumar
8
W projekcie, który obecnie rozwijam, postępuję zgodnie z wytycznymi zawartymi w genialnej książce Jez Humble „Continuous Delivery” (warta przeczytania).
Oznacza to utworzenie potoku wdrożeniowego przy użyciu jakiejś formy serwera ciągłej integracji (używam bezpłatnej wersji społecznościowej Go Thoughtworks ), który jest odpowiedzialny za najpierw sprawdzenie kodu pod kątem jakości, złożoności i przeprowadzania testów jednostkowych. Następnie może postępować zgodnie z potokiem wdrażania, co skutkuje wypychaniem na serwery produkcyjne.
Brzmi to bardzo skomplikowanie, ale nie musi tak być i sprawia, że cały proces pisania kodu sprawia, że jego droga do produkcji jest bezpieczna i bezproblemowa (bez strasznych dni wydania!).
Używam pełnego potoku wdrażania dla systemów na żywo i okrojonej wersji dla modułów npm, które piszę, i oba mają tę samą technikę wdrażania jednym kliknięciem.
i kolejne +1 za polecenie książki! Odkrywam, że do CI nie należy podchodzić od niechcenia.
Merrick
no cóż, ludzie zadają proste pytanie, dajesz pełne rozwiązanie :). Muszę powiedzieć, że to przesada. Ale jeśli już korzystasz z ciągłej dostawy, może to jest droga do zrobienia.
windmaomao
8
Właśnie opublikowałem rozwiązanie twojego problemu oparte na węzłach : node-cd
Składa się z prostej aplikacji węzła działającej na Twoim VPS, która otrzyma Hooki po odbiorze Github i uruchomi skrypt, który lubisz (na przykład skrypt powłoki, który zabije twoją aplikację, git pull i uruchomi ją ponownie).
+1, ponieważ jest to czysty node.js, więc plakat nie musi niczego dodawać do swojego stosu ani używać języka, z którym nie czuje się komfortowo. Poza tym bardzo ładnie rozplanowany kod
code_monk
3
Oto kolejna prosta implementacja nodeJS.
Jest to bardzo prosty serwer węzłowy, który działa na skonfigurowanej nazwie hosta i porcie i może być skonfigurowany do obsługi przechwytywania poczty internetowej w serwisie GitHub. A rzeczywiste akcje pul / test / wdrażania można dostosować do dowolnych potrzeb. W obecnej implementacji jest to komenda powłoki określona bezpośrednio w skrypcie serwera nodeJS. Istnieje również bardzo prosty schemat zabezpieczeń oparty na kluczu tajnym.
Zasadniczo używa pliku konfiguracyjnego JSON, aby wyświetlić listę repozytoriów, z których oczekujesz wypychania, które polecenia chcesz uruchomić podczas wdrażania i w jakim katalogu muszą one działać. Wszystko, co musisz zrobić, to zmodyfikować plik konfiguracyjny zgodnie z własnymi upodobaniami i uruchomić scenariusz!
Ponadto używam Nginx jako zwrotnego serwera proxy do przekazywania tych POST do mojego skryptu. Konfigurację Nginx można znaleźć w tym samym repozytorium Github w folderze „nginx”.
odpowiedź PHP jest moim zdaniem całkowicie uzasadniona, ale jeśli wolisz Rubiego, zamieściłem rozwiązanie na blogu. to to samo, co odpowiedź PHP, tylko w innym języku. używasz haka WWW i masz prosty skrypt nasłuchujący odpowiednich żądań HTTP.
Stworzyłem własne podstawowe narzędzie do wdrażania, które automatycznie pobiera nowe aktualizacje z repozytorium - https://github.com/jesalg/SlimJim - Zasadniczo nasłuchuje haka po odbiorze github i używa proxy do wyzwalania zaktualizuj skrypt.
Jestem założycielem https://commando.io, a niedawno ogłosiliśmy integrację z GitHub za pośrednictwem usługi. Integracja umożliwia uruchamianie uruchomień na serwerach podczas wypychania do repozytorium GitHub. Jest to doskonała okazja do automatycznego uruchamiania skryptów wdrażania podczas wypychania kodu.
Wykonanie to skrypt, który piszesz w Commando.io, który można napisać w bash, perl, python, ruby, go lub node.js. Aby dowiedzieć się więcej i zobaczyć przykładowy skrypt uruchomienia git pull, zobacz nasze ogłoszenie na blogu: http://blog.commando.io/run-executions-via-github-push/
Odpowiedzi:
Przykład w PHP:
Przejdź do github do swojego repozytorium github dodaj kliknij „Administrator”
kliknij zakładkę „Service Hooks” => „WebHook URLs”
i dodaj
http://your-domain-name/git_test.php
następnie utwórz git_test.php
<?php try { $payload = json_decode($_REQUEST['payload']); } catch(Exception $e) { exit(0); } //log the request file_put_contents('logs/github.txt', print_r($payload, TRUE), FILE_APPEND); if ($payload->ref === 'refs/heads/master') { // path to your site deployment script exec('./build.sh'); }
W pliku build.sh musisz umieścić zwykłe polecenia, aby pobrać witrynę z github
źródło
Było kilka wzmianek o hakach Gita jako odpowiedziach / komentarzach, które działały dla mnie w przeszłości ... więc oto mój przepis, gdyby ktoś inny wymagał więcej szczegółów.
Używam kombinacji haka po odbiorze git i nadzorcy węzła, aby wykonać proste automatyczne wdrażanie (zakładając, że używasz zdalnego repozytorium git na tej maszynie).
Skonfiguruj swój hak po odbiorze
W Twoim repozytorium:
sudo vi hooks/post-receive
Powinien wyglądać mniej więcej tak:
#!/bin/sh GIT_WORK_TREE=/home/path/to/your/www export GIT_WORK_TREE git checkout -f
Ustaw uprawnienia do plików:
chmod +x hooks/post-receive
Git odświeży pliki w katalogu aplikacji po wypchnięciu do repozytorium.
Uruchom Node z Node-Supervisor
Musisz zainstalować Node-Supervisor na swojej maszynie jako globalny moduł węzłowy:
sudo npm install supervisor -g
Teraz po prostu uruchom aplikację node z node-supervisor i będzie obserwować zmiany w plikach w twoim katalogu roboczym:
supervisor /home/path/to/your/www/server.js
(uwagasupervisor
zamiastnode
).źródło
npm install -l
na zdalnym serwerze, jest inteligentna. Można to oczywiście połączyć z metodą za pomocą haków po odbiorze.Prawdopodobnie bardzo późno na odpowiedź tutaj. Ale znalazłem ten projekt na githubie i wydaje się, że robi to, co chcesz, ale w znacznie czystszy sposób.
https://github.com/logsol/Github-Auto-Deploy
Sprawdź to. Chciałbym również wiedzieć, co myślą o tym inni w kontekście komentarzy i głosów za.
Pozdrawiam,
S.
źródło
W projekcie, który obecnie rozwijam, postępuję zgodnie z wytycznymi zawartymi w genialnej książce Jez Humble „Continuous Delivery” (warta przeczytania).
Oznacza to utworzenie potoku wdrożeniowego przy użyciu jakiejś formy serwera ciągłej integracji (używam bezpłatnej wersji społecznościowej Go Thoughtworks ), który jest odpowiedzialny za najpierw sprawdzenie kodu pod kątem jakości, złożoności i przeprowadzania testów jednostkowych. Następnie może postępować zgodnie z potokiem wdrażania, co skutkuje wypychaniem na serwery produkcyjne.
Brzmi to bardzo skomplikowanie, ale nie musi tak być i sprawia, że cały proces pisania kodu sprawia, że jego droga do produkcji jest bezpieczna i bezproblemowa (bez strasznych dni wydania!).
Używam pełnego potoku wdrażania dla systemów na żywo i okrojonej wersji dla modułów npm, które piszę, i oba mają tę samą technikę wdrażania jednym kliknięciem.
źródło
Właśnie opublikowałem rozwiązanie twojego problemu oparte na węzłach : node-cd
Składa się z prostej aplikacji węzła działającej na Twoim VPS, która otrzyma Hooki po odbiorze Github i uruchomi skrypt, który lubisz (na przykład skrypt powłoki, który zabije twoją aplikację, git pull i uruchomi ją ponownie).
źródło
Oto kolejna prosta implementacja nodeJS.
Jest to bardzo prosty serwer węzłowy, który działa na skonfigurowanej nazwie hosta i porcie i może być skonfigurowany do obsługi przechwytywania poczty internetowej w serwisie GitHub. A rzeczywiste akcje pul / test / wdrażania można dostosować do dowolnych potrzeb. W obecnej implementacji jest to komenda powłoki określona bezpośrednio w skrypcie serwera nodeJS. Istnieje również bardzo prosty schemat zabezpieczeń oparty na kluczu tajnym.
https://github.com/shyam-habarakada/rscds
Mój serwer pomostowy miał już zainstalowany i uruchomiony węzeł, więc napisanie tego było szybkie i łatwe.
źródło
Znalazłem projekt do łatwego wdrażania używa git.
git-play
Myślę, że to właściwy sposób dla ciebie.
Sprawdź to.
źródło
Jeśli potrzebujesz rozwiązania opartego na Pythonie / tornado, napisałem skrypt do obsługi żądań POST z usług Webhook na Github . Możesz go znaleźć pod adresem https://github.com/Akobi/ops/tree/master/autodeploy
Zasadniczo używa pliku konfiguracyjnego JSON, aby wyświetlić listę repozytoriów, z których oczekujesz wypychania, które polecenia chcesz uruchomić podczas wdrażania i w jakim katalogu muszą one działać. Wszystko, co musisz zrobić, to zmodyfikować plik konfiguracyjny zgodnie z własnymi upodobaniami i uruchomić scenariusz!
Ponadto używam Nginx jako zwrotnego serwera proxy do przekazywania tych POST do mojego skryptu. Konfigurację Nginx można znaleźć w tym samym repozytorium Github w folderze „nginx”.
Miłego pchania!
źródło
odpowiedź PHP jest moim zdaniem całkowicie uzasadniona, ale jeśli wolisz Rubiego, zamieściłem rozwiązanie na blogu. to to samo, co odpowiedź PHP, tylko w innym języku. używasz haka WWW i masz prosty skrypt nasłuchujący odpowiednich żądań HTTP.
http://gilesbowkett.blogspot.com/2012/06/heroku-style-deployment-on-ec2.html
źródło
Stworzyłem własne podstawowe narzędzie do wdrażania, które automatycznie pobiera nowe aktualizacje z repozytorium - https://github.com/jesalg/SlimJim - Zasadniczo nasłuchuje haka po odbiorze github i używa proxy do wyzwalania zaktualizuj skrypt.
źródło
Jestem założycielem https://commando.io, a niedawno ogłosiliśmy integrację z GitHub za pośrednictwem usługi. Integracja umożliwia uruchamianie uruchomień na serwerach podczas wypychania do repozytorium GitHub. Jest to doskonała okazja do automatycznego uruchamiania skryptów wdrażania podczas wypychania kodu.
Wykonanie to skrypt, który piszesz w Commando.io, który można napisać w bash, perl, python, ruby, go lub node.js. Aby dowiedzieć się więcej i zobaczyć przykładowy skrypt uruchomienia
git pull
, zobacz nasze ogłoszenie na blogu: http://blog.commando.io/run-executions-via-github-push/źródło
Deepl.io wydaje się być nowym i obiecującym kandydatem w tej przestrzeni.
Funkcje (pobrane z jego strony internetowej):
źródło
Zwróć również uwagę, że istnieją bezpłatne / niedrogie usługi, takie jak REPOMAN.IO, które automatyzują prawie wszystko za Ciebie.
źródło