Git push (GitHub ve node.js) sonrasında uygulamamı otomatik olarak nasıl dağıtabilirim?


92

Uygulamam (node.js) bir VPS (linux) üzerinde konuşlandırılmış durumda. Git hub'ı depo olarak kullanıyorum. Uygulamayı git push üzerinde otomatik olarak nasıl dağıtabilirim?



1
Yukarıdaki progit bağlantısı için güncelleme: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code Novitiate

Git 2.10 ilginç bir özellik ekleyecek: push options stackoverflow.com/a/38770670/6309
VonC

Yanıtlar:


64

PHP'deki örnek:

Github deponuza gidin ve "Yönetici" yi tıklayın

'Service Hooks' => 'WebHook URL'leri' sekmesine tıklayın

ve Ekle

http://your-domain-name/git_test.php

sonra git_test.php oluştur

<?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');
}

Build.sh dosyasında, sitenizi github'dan almak için normal komutlar koymanız gerekecektir.


6
Merhaba çok teşekkür ederim Bob'un dağıtım betiğimi yürütmesini engelleyen nedir?
Gelişmiş

16
@Gelişmiş 1 belki betik izinleri, yürütme bayrağı ... 2 PHP'de kapanış etiketi eklemek kötü bir uygulamadır.
Pawel Dubiel

3
@Gelişmiş Bob'un komut dosyanızı yürütmediğinden emin olmak için bir teknik, POST isteğinin Github sunucularından geldiğinden emin olmaktır. İstekte bulunurken gönderdikleri HTTP başlıklarına göz atın. Ayrıca tahmin edilemez bir "gizli" URL oluşturabilirsiniz.
jyap


1
@ Arius2038 Hiç "her gün yeni bir şey öğreniyorsun" diye bir şey duydun mu? Peki bu benim "yeni bir şey" bugün. Paylaşım için teşekkürler!
Purefan

23

Geçmişte benim için işe yaramış olan, cevaplar / yorumlar olarak birkaç Git kancasından bahsediliyordu ... bu yüzden, başka birinin daha fazla ayrıntı gerektirmesi durumunda benim tarifim burada.

Basit otomatik dağıtımı gerçekleştirmek için git sonrası alma kancası ve düğüm denetleyicisinin bir kombinasyonunu kullanıyorum (bu makinede bir git uzak deposu kullandığınızı varsayarak).


Alım Sonrası Kancanızı Kurun

Deponuzda: sudo vi hooks/post-receive

Ve şunun gibi görünmelidir:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f

Dosya izinlerini ayarlayın: chmod +x hooks/post-receive

Git, depoya yapılan bir göndermenin ardından uygulama dizininizdeki dosyaları yenileyecektir.


Düğümü Node-Supervisor ile Çalıştırın

Node-Supervisor'ı makinenize global bir düğüm modülü olarak kurmanız gerekir: sudo npm install supervisor -g

Şimdi düğüm uygulamanızı node-supervisor ile çalıştırın ve çalışma dizininizdeki dosyalardaki değişiklikleri izleyecektir:

supervisor /home/path/to/your/www/server.js( supervisoryerine not edin node).


Bu sorun değil, ancak dikkat edilmesi gereken bir nokta, yerel uygulamanıza yeni bir npm eklerseniz, sunucuda o modül için de bir npm yüklemesi yapmanız gerekmesidir. Aksi takdirde, muhtemelen çökmekte olan bir uygulamanız olacaktır.
k00k

2
Hayır .. Yerel uygulamamın bağlı olduğu tüm düğüm modülleri, projemin node_modules alt dizinine yüklenir, bu benim yerel GIT depomdur, bu nedenle ekledim, taahhüt ettiğimde, sonra da kopyalanacakları uzak sunucuya ittiğimde.
Wes Johnson

8
Doğru, ama bunun anlamı, eğer bu modüllerden herhangi biri derlenmiş bir koda sahipse (örneğin, mhash gibi), farklı bir işletim sistemi ve / veya mimari olan başka bir sunucuda çalışmayabilir. Bağımlılıklarınızı takip etmek için package.json kullanmak ve ardından npm install -luzak sunucuda bir uygulama yapan bir dağıtım stratejisi akıllıca olur. Bu, elbette, alma sonrası kancaları kullanarak yönteminizle birleştirilebilir.
k00k

1
ve Git çalışma ağacını git checkout komutuna doğrudan ekleyebilirsiniz: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (oluşturmak yerine değişkeni ve onu komut dosyanızı dışa aktarın.
JasonB

Yine de soru Github ile ilgili.
Noah

18

Muhtemelen burada yanıtlamak için çok geç. Ama bu projeyi github'da buldum ve yapmak istediğinizi çok daha temiz bir şekilde yapıyor gibi görünüyor.

https://github.com/logsol/Github-Auto-Deploy

Bunu kontrol et. Başkalarının bunun hakkında yorum ve olumlu oylar açısından ne düşündüğünü bilmek de ilginizi çekecektir.

Şerefe,
S


16
"Muhtemelen burada yanıtlamak için çok geç." Asla geç Değil. :) Aslında tüm topluluğa katkıda bulunuyorsunuz (çoğumuz Google çalışanları; vay, sadece bu 20 bin görüntülemeye bakıyoruz!), "Bir süre önce" sorusunu soran bekar adam değil. Zaman tek başına konu dışıdır: söz konusu teknoloji alakalı olduğu sürece cevabınız da olacaktır. (Bahşiş için teşekkürler, BTW, kontrol et ...)
Sz.

1
başladığınız için teşekkürler! ;) O zamanlar benim için harika çalıştı. Artık otomatik dağıtımlar için (yapabildiğim her yerde ) travis'i (travis-ci.org) kullanmayı tercih ediyorum . @lunakid
Saurabh Kumar

8

Şu anda geliştirmekte olduğum bir projede Jez Humble'ın harika kitabı "Continuous Delivery" (okumaya değer) kapsamındaki yönergeleri takip ediyorum.

Bu , ilk önce kodunuzu kalite, karmaşıklık ve çalıştırma birimi testleri açısından kontrol etmekten sorumlu bir tür sürekli tümleştirme sunucusu kullanarak (Thoughtworks ücretsiz Go topluluk sürümünü kullanıyorum) bir dağıtım hattı oluşturmak anlamına gelir . Daha sonra, üretim sunucularınıza bir itme ile sonuçlanan bir dağıtım hattını izleyebilir.

Bu kulağa çok karmaşık geliyor, ancak olması gerekmiyor ve kod yazma sürecini tümüyle güvenli ve endişesiz hale getiriyor (korkutucu yayın günleri yok!).

Canlı sistemler için tam bir dağıtım ardışık düzeni ve yazdığım npm modülleri için kısaltılmış bir sürüm kullanıyorum ve her ikisi de aynı tek tıklamayla dağıtım tekniğini paylaşıyor.


& kitap önerisi için başka bir +1! CI'ye gelişigüzel yaklaşılmaması gerektiğini keşfediyorum.
Merrick

Pekala, insanlar basit bir soru soruyor, tam bir çözüm veriyorsunuz :). Bunun bir abartı olduğunu söylemeliyim. Ancak zaten sürekli teslimatı kullanıyorsanız, belki de gidilecek yol budur.
windmaomao

8

Sorununuza düğüm tabanlı bir çözüm yayınladım: node-cd

VPS'nizde çalışan ve Github sonradan Hook'ları alacak ve beğendiğiniz bir komut dosyasını çalıştıracak (örneğin uygulamanızı öldürecek bir kabuk betiği, git çekme ve yeniden başlatacak bir kabuk betiği) çalıştıran basit bir düğüm uygulamasından oluşur .


+1 çünkü saf node.js olduğundan, gönderenlerin yığınlarına herhangi bir şey eklemesi veya rahat olmadıkları bir dil kullanması gerekmez. Ayrıca, gerçekten güzel bir şekilde ortaya konan kod
code_monk

3

İşte başka bir basit nodeJS uygulaması.

Yapılandırdığınız bir ana bilgisayar adı ve bağlantı noktası üzerinde çalışan ve GitHub post alım web kancalarını işlemek için ayarlanabilen çok basit bir düğüm sunucusudur. Ve gerçek darbe / test / dağıtım eylemleri, istediğiniz her şeyi yapmak için özelleştirilebilir. Mevcut uygulamada, nodeJS sunucu betiğinde satır içinde belirtilen bir kabuk komutudur. Ve yerinde çok basit bir gizli anahtar tabanlı güvenlik şeması da var.

https://github.com/shyam-habarakada/rscds

Evreleme sunucumda zaten düğüm kurulmuş ve çalışıyordu, bu yüzden bunu yazmak hızlı ve kolaydı.


" alaniniz.com:8088/… " - GERÇEKTEN ?! URL'de açık olarak "gizli" anahtar geçirildi !!!! Bunu kimse kullanmamalı.
Julian Knight

1
Bir aspirin al ve Julian'a yerleş. Https kullanılırken alma parametreleri şifrelenir.
Gavin

3

Kolay dağıtım için git kullanan projeyi buldum.

git-oyna

Senin için uygun bir yol olduğunu düşünüyorum.

Bunu kontrol et.


2

Python / tornado tabanlı bir çözüm istiyorsanız, Github'un Webhook Hizmetlerinden POST isteklerini işlemek için bir komut dosyası yazdım . Bunu https://github.com/Akobi/ops/tree/master/autodeploy adresinde bulabilirsiniz.

Temel olarak, hangi depolardan itmeyi beklediğinizi, dağıtmada hangi komutları çalıştırmak istediğinizi ve komutların hangi dizinde çalışması gerektiğini listelemek için bir JSON yapılandırma dosyası kullanır. senaryo!

Ek olarak, bu POST'leri betiğime iletmek için Nginx'i bir ters proxy olarak kullanıyorum. Nginx yapılandırmasını aynı Github deposunda 'nginx' klasörü altında bulabilirsiniz.

Mutlu itme!



1

Depodan yeni güncellemeleri otomatik olarak aşağı çekecek kendi temel dağıtım aracımı oluşturdum - https://github.com/jesalg/SlimJim - Temelde github kancayı aldıktan sonra dinliyor ve bir proxy'yi tetiklemek için betiği güncelle.


1

Ben kurucusuyum https://commando.io ve yakın zamanda bir servisi ile GitHub'dan ile entegrasyonunu açıkladı. Entegrasyon, bir GitHub deposuna gönderdiğinizde sunucularda yürütme çalıştırmanıza olanak tanır. Bu, kodu ittiğinizde dağıtım komut dosyalarını otomatik olarak çalıştırmak için mükemmel bir fırsattır.

Yürütme, Commando.io içinde yazdığınız ve bash, perl, python, ruby, go veya node.js ile yazılabilen bir betiktir. Daha fazlasını okumak ve örnek bir çalıştırma komut dosyası git pullgörmek için blog yazısı duyurumuza bakın: http://blog.commando.io/run-executions-via-github-push/


1

Deepl.io bu alanda yeni ve gelecek vaat eden bir rakip gibi görünüyor.

Özellikler (web sitesinden alınmıştır):

  • GitLab ve GitHub'dan web kancaları yakalayın
  • Birden çok depoyu yapılandırın
  • Depo başına birden çok şube yapılandırın
  • PHP, kabuk veya her ikisi de kendi dağıtım betiklerinizi kullanın
  • Onay e-postaları gönderir

1

Ayrıca REPOMAN.IO gibi neredeyse tüm bunları sizin için otomatikleştiren ücretsiz / ucuz hizmetler olduğunu da unutmayın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.