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?

zaawansowane
źródło
4
czy sprawdziłeś haki git progit.org/book/ch7-3.html , a także sprawdź na github help.github.com/test-webhooks
Paweł Dubiel
1
Aktualizacja linku progit powyżej: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code
Git 2.10 doda interesującą funkcję: opcje push stackoverflow.com/a/38770670/6309
VonC

Odpowiedzi:

64

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

Paweł Dubiel
źródło
6
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ąć.
jyap
5
@Purefan To nie żart :) stackoverflow.com/questions/3219383/…
Paweł Dubiel
1
@ 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).


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(uwaga supervisorzamiast node).

Wes Johnson
źródło
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.

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.

Saurabh Kumar
źródło
15
"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.

Roy
źródło
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).

A21z
źródło
+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.

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.

Shyam Habarakada
źródło
twojadomena.com:8088/… ” - NAPRAWDĘ ?! „Tajny” klucz przekazany w sposób jawny w adresie URL !!!! Nikt nie powinien tego używać.
Julian Knight,
1
Weź aspirynę i uspokój się, Julian. Parametry pobierania są szyfrowane przy użyciu protokołu HTTPS.
Gavin
3

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.

Oh Seung Kwon
źródło
2

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!

Divij Rajkumar
źródło
1

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.

jesal
źródło
1

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/

Justin
źródło
1

Deepl.io wydaje się być nowym i obiecującym kandydatem w tej przestrzeni.

Funkcje (pobrane z jego strony internetowej):

  • Łap webhooki z GitLab i GitHub
  • Skonfiguruj wiele repozytoriów
  • Skonfiguruj wiele gałęzi w repozytorium
  • Użyj własnych skryptów wdrażania, PHP, powłoki lub obu
  • Wysyła e-maile potwierdzające
vanto
źródło
1

Zwróć również uwagę, że istnieją bezpłatne / niedrogie usługi, takie jak REPOMAN.IO, które automatyzują prawie wszystko za Ciebie.

Kirschbaum
źródło