Uzak projeleri senkronize etmek için Node.js ve Github Webhooks nasıl kullanılır?

0 Hisse senetleri
0
0
0
0

giriiş

Birden fazla geliştiricinin yer aldığı bir proje üzerinde çalışırken, bir kişinin bir depoya kod yüklemesi ve ardından bir başkasının kodun eski bir sürümünde değişiklik yapmaya başlaması sinir bozucu olabilir. Bu tür hatalar, depolarınızı senkronize tutmak için bir betik oluşturmayı gerektirir. Bu yöntemi, düzeltmeleri ve diğer değişiklikleri hızlı bir şekilde yapmak için bir üretim ortamına da uygulayabilirsiniz.

Bu özel görevi tamamlamak için başka çözümler olsa da, kendi betiğinizi yazmak, gelecekte özelleştirmeye yer bırakan esnek bir seçenektir.

GitHub, depolarınız için webhook'ları yapılandırmanıza olanak tanır. Webhook'lar, olaylar meydana geldiğinde HTTP istekleri gönderen olaylardır. Örneğin, birisi bir çekme isteği oluşturduğunda veya yeni kod gönderdiğinde sizi bilgilendirmek için bir webhook kullanabilirsiniz.

Bu kılavuzda, siz veya başka biri GitHub'a kod gönderdiğinde bir GitHub webhook bildirimini dinleyen bir Node.js sunucusu oluşturacaksınız. Bu betik, uzak bir sunucudaki bir deponun en son kod sürümüyle otomatik olarak güncellenmesini sağlayarak, yeni commit'ler oluşturmak için sunucuda oturum açma ihtiyacını ortadan kaldırır.

Ön koşullar
  • Sudo ayrıcalıklarına sahip, root olmayan bir kullanıcı ve bir güvenlik duvarı içeren bir Ubuntu sunucusu kuruldu.
  • Git yerel makinenize kuruludur.
  • Node.js ve npm resmi PPA kullanılarak uzak sunucuya kurulur.
  • Proje kodlarınızı içeren Github'daki bir depo.

Adım 1 – Webhook'u kurun

Deponuz için bir kanca yapılandırarak başlayacağız. Bu adım önemlidir, çünkü bu olmadan Github bir şey olduğunda hangi olayların gönderileceğini veya nereye gönderileceğini bilemez. İlk olarak web kancasını oluşturacağız, ardından isteklerine yanıt verecek bir sunucu oluşturacağız.

GitHub hesabınıza giriş yapın ve izlemek istediğiniz depoya gidin. Depo sayfanızın üst kısmındaki menü çubuğundaki Ayarlar sekmesine tıklayın, ardından sol gezinme menüsünde Web Kancaları'na tıklayın. Sağ köşedeki Web Kancası Ekle'ye tıklayın ve istendiğinde hesap parolanızı girin. Aşağıdaki gibi bir sayfa görmelisiniz:

  • Payload URL alanına http://your_server_ip:8080 yazın. Bu, yakında yazacağımız Node.js sunucusunun adresi ve portudur.
  • İçerik türünü application/json olarak değiştirin. Yazdığımız betik JSON verisi bekliyor ve diğer veri türlerini anlayamıyor.
  • Gizli alanına, bu webhook için gizli bir parola girin. Bu gizli parolayı, Node.js sunucunuzda istekleri doğrulamak ve GitHub'dan gönderildiklerinden emin olmak için kullanacaksınız.
  • Bu webhook'u hangi olayların tetikleyeceğini belirtmek için push olayını seçmeniz yeterli. Push olayına ihtiyacımız olmasının tek nedeni, kodun güncellenmesi ve sunucumuzla senkronize edilmesi gerektiği zamandır.
  • Etkin onay kutusunu seçin.
  • Alanları inceleyin ve oluşturmak için Webhook ekle'ye tıklayın.

Ping başlangıçta başarısız olacak, ancak webhook'unuzun artık yapılandırıldığından emin olabilirsiniz. Şimdi deponuzu sunucuya kopyalayalım.

Adım 2 – Depoyu sunucuya kopyalayın

Betiğimiz bir deponun güncellenmesini sağlayabilir, ancak deponun başlatılmasını sağlayamaz, bu yüzden şimdi bunu yapacağız. Sunucunuza giriş yapın:

ssh sammy@your_server_ip

Ana dizininizde olduğunuzdan emin olun. Ardından, deponuzu kopyalamak için Git'i kullanın. GitHub kullanıcı adınızı sammy, GitHub proje adınızı ise hello_hapi ile değiştirdiğinizden emin olun.

cd
git clone https://github.com/sammy/hello_hapi.git

Bu, projenizi içeren yeni bir dizin oluşturacaktır. Bu dizini bir sonraki adımda kullanacaksınız.

Projeniz klonlandıktan sonra webhook scriptini oluşturabilirsiniz.

Adım 3 – Webhook Komut Dosyası Oluşturun

GitHub'dan gelen webhook isteklerini dinlemek için kendi sunucumuzu oluşturalım. 8080 portunda bir web sunucusu başlatan bir Node.js betiği yazacağız. Sunucu, webhook isteklerini dinleyecek, belirttiğimiz sırrı doğrulayacak ve GitHub'dan kodun en son sürümünü çekecek.

Ana menünüze gidin:

cd ~

Webhook betiğiniz için NodeWebhooks adında yeni bir dizin oluşturun:

mkdir ~/NodeWebhooks

Daha sonra yeni dizine gidin:

cd ~/NodeWebhooks

NodeWebhooks dizininde webhook.js adında yeni bir dosya oluşturun.

nano webhook.js

Komut dosyasına şu iki satırı ekleyin:

/* Your codevar secret = "your_secret_here";
var repo = "/home/sammy/hello_hapi";... */

İlk satır, 1. adımda oluşturulan ve isteklerin GitHub'dan geldiğini doğrulayan sırrı tutacak bir değişken tanımlar. İkinci satır, yerel diskinizde güncellemek istediğiniz deponun tam yolunu tutacak bir değişken tanımlar. Bu, 2. adımda kontrol ettiğiniz depoya işaret etmelidir.

Ardından, http ve kripto kütüphanelerini betiğe aktaran şu satırları ekleyin. Bunları, web sunucumuzu ve gizli karmayı oluşturmak için kullanacağız; böylece GitHub'dan aldığımız verilerle karşılaştırabileceğiz:

let http = require('http');
let crypto = require('crypto');

Daha sonra, komut dosyanızdan kabuk komutlarını çalıştırabilmeniz için child_process kütüphanesini ekleyin:

const exec = require('child_process').exec;

Daha sonra, GitHub webhook isteklerini işleyecek yeni bir web sunucusu tanımlamak için şu kodu ekleyin ve istek geçerliyse kodun yeni sürümünü yayınlayın:

http.createServer(function (req, res) {
req.on('data', function(chunk) {
let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');
if (req.headers['x-hub-signature'] == sig) {
exec('cd ' + repo + ' && git pull');
}
});
res.end();
}).listen(8080);

http.createServer() fonksiyonu, GitHub'dan gelen istekleri dinleyen 8080 numaralı bağlantı noktasında bir web sunucusu başlatır. Güvenlik amacıyla, istekte yer alan gizli bilginin, 1. adımda webhook'u oluştururken belirttiğimiz gizli bilgiyle eşleştiğini doğrularız. Bu gizli bilgi, x-hub-signature başlığında SHA1 karma dizesi olarak gönderilir, bu nedenle gizli bilgimizi karma hale getirip GitHub'ın bize gönderdiğiyle karşılaştırırız.

İstek geçerliyse, git pull komutunu kullanarak yerel depolarımızı güncellemek için bir kabuk komutu çalıştırırız.

Tamamlanmış senaryo şu şekilde görünüyor:

const secret = "your_secret_here";
const repo = "~/your_repo_path_here/";
const http = require('http');
const crypto = require('crypto');
const exec = require('child_process').exec;
http.createServer(function (req, res) {
req.on('data', function(chunk) {
let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');
if (req.headers['x-hub-signature'] == sig) {
exec('cd ' + repo + ' && git pull');
}
});
res.end();
}).listen(8080);

İlk sunucu kurulum kılavuzunu izlediyseniz, bu web sunucusunun 8080 numaralı portta trafiğe izin vererek harici web ile iletişim kurmasına izin vermeniz gerekir:

sudo ufw allow 8080/tcp

Artık senaryomuz hazır olduğuna göre düzgün çalıştığından emin olalım.

Adım 4 – Webhook Testi

Webhook'umuzu node kullanarak komut satırında çalıştırarak test edebiliriz. Betiği başlatın ve işlemi terminalinizde açık bırakın:

cd ~/NodeWebhooks
nodejs webhook.js

Github.com'daki proje sayfanıza dönün. Depo sayfanızın üst kısmındaki menü çubuğundaki Ayarlar sekmesine ve ardından sol gezinme menüsünde Webhooks'a tıklayın. 1. Adım'da ayarladığınız webhook'un yanındaki Düzenle'ye tıklayın. Aşağıdaki resimde gösterildiği gibi, Son İşlemler bölümünü görmek için aşağı kaydırın:

Yeniden Yayınla düğmesini açmak için sağdaki üç noktaya basın. Düğüm sunucusu çalışırken, isteği yeniden göndermek için Yeniden Yayınla'ya tıklayın. İsteği göndermek istediğinizi onayladıktan sonra, başarılı bir yanıt göreceksiniz. Bu, ping yeniden gönderildikten sonra gelen 200 OK yanıt koduyla belirtilir.

Artık betiğimizin arka planda çalışmasını ve önyükleme sırasında başlamasını sağlayabiliriz. CTRL+C kullanmak, node webhook sunucusunu durduracaktır.

Adım 5 – Webhook'u Systemd Hizmeti Olarak Kurun

systemd, Ubuntu'nun hizmetleri kontrol etmek için kullandığı görev yöneticisidir. Webhook betiğimizi önyükleme sırasında başlatmamızı ve diğer hizmetler gibi yönetmek için systemd komutlarını kullanmamızı sağlayacak bir hizmeti başlatacağız.

Yeni bir servis dosyası oluşturarak başlayın:

sudo nano /etc/systemd/system/webhook.service

Systemd'ye betiği nasıl çalıştıracağını söyleyen aşağıdaki yapılandırmayı servis dosyasına ekleyin. Bu, Systemd'ye node betiğimizi nerede bulacağını söyler ve servisimizi açıklar.

Sami kısmını kullanıcı adınızla değiştirmeyi unutmayın.

[Unit]
Description=Github webhook
After=network.target
[Service]
Environment=NODE_PORT=8080
Type=simple
User=sammy
ExecStart=/usr/bin/nodejs /home/sammy/NodeWebhooks/webhook.js
Restart=on-failure
[Install]
WantedBy=multi-user.target

Yeni hizmetin sistem önyüklemesinde başlamasını etkinleştirin:

sudo systemctl enable webhook.service

Şimdi servisi başlatın:

sudo systemctl start webhook

Servisin başlatıldığından emin olun:

sudo systemctl status webhook

Servisin aktif olduğunu gösteren aşağıdaki çıktıyı göreceksiniz:

Output
● webhook.service - Github webhook
Loaded: loaded (/etc/systemd/system/webhook.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-08-17 19:28:41 UTC; 6s ago
Main PID: 9912 (nodejs)
Tasks: 6
Memory: 7.6M
CPU: 95ms
CGroup: /system.slice/webhook.service
└─9912 /usr/bin/nodejs /home/sammy/NodeWebhooks/webhook.js

Artık yeni commitleri deponuza gönderebilir ve değişiklikleri sunucunuzda görebilirsiniz.

Masaüstü cihazınızdan deponun benzetimini yapın:

git clone https://github.com/sammy/hello_hapi.git

Depodaki dosyalardan birini değiştirin. Ardından dosyayı commitleyin ve kodunuzu GitHub'a gönderin.

git add index.js
git commit -m "Update index file"
git push origin master

Webhook aktif hale gelecek ve değişiklikleriniz sunucunuzda görünecektir.

Sonuç

Yeni commit'leri uzak bir depoya otomatik olarak dağıtan bir Node.js betiği oluşturdunuz. Bu işlemi, izlemek istediğiniz ek depoları oluşturmak için kullanabilirsiniz. Hatta deponuzu gönderdiğinizde bir web sitesini veya uygulamayı üretim ortamına dağıtacak şekilde bile yapılandırabilirsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Ayrıca Şunları da Beğenebilirsiniz