Bagaimana cara menerapkan aplikasi saya secara otomatis setelah git push (GitHub dan node.js)?


92

Saya memiliki aplikasi saya (node.js) yang diterapkan di VPS (linux). Saya menggunakan git hub sebagai repositori. Bagaimana cara menerapkan aplikasi secara otomatis, di git push?


4
sudahkah Anda memeriksa git hooks progit.org/book/ch7-3.html , dan juga memeriksa di github help.github.com/test-webhooks
Pawel Dubiel

1
Pembaruan untuk tautan progit di atas: git-scm.com/book/en/Customizing-Git-Git-Hooks
Novisiat Kode

Git 2.10 akan menambahkan fitur menarik: opsi push stackoverflow.com/a/38770670/6309
VonC

Jawaban:


63

Contoh di PHP:

Arahkan ke github ke dalam repositori github Anda, tambahkan klik "Admin"

klik tab 'Service Hooks' => 'URL WebHook'

dan tambahkan

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

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

Di build.sh Anda harus meletakkan perintah biasa untuk mengambil situs Anda dari github


6
Hai terima kasih banyak Apa yang mencegah Bob menjalankan skrip penerapan saya?
Lanjutan

16
@Advanced 1 mungkin izin skrip, flag eksekusi ... 2 menambahkan tag penutup di PHP adalah praktik yang buruk.
Pawel Dubiel

3
@Advanced Satu teknik untuk memastikan Bob tidak mengeksekusi skrip Anda adalah dengan memastikan bahwa permintaan POST berasal dari server Github. Lihat header HTTP yang mereka kirim saat membuat permintaan. Anda juga dapat membuat URL 'rahasia' yang tidak dapat ditebak.
jyap


1
@ Arius2038 Pernah mendengar tentang "Anda belajar sesuatu yang baru setiap hari"? nah ini adalah "sesuatu yang baru" saya hari ini. Terima kasih telah berbagi!
Purefan

23

Ada beberapa penyebutan Git hooks sebagai jawaban / komentar, yang telah berhasil untuk saya di masa lalu .. jadi inilah resep saya jika orang lain membutuhkan lebih spesifik.

Saya menggunakan kombinasi git post-accept hook dan node-supervisor untuk menyelesaikan penerapan otomatis sederhana (dengan asumsi Anda menggunakan repositori jarak jauh git pada mesin itu).


Siapkan Hook Pasca-Terima Anda

Di repositori Anda: sudo vi hooks/post-receive

Dan itu akan terlihat seperti:

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

Setel izin file: chmod +x hooks/post-receive

Git akan menyegarkan file di direktori aplikasi Anda setelah didorong ke repo.


Jalankan Node dengan Node-Supervisor

Anda harus menginstal Node-Supervisor di komputer Anda sebagai modul node global: sudo npm install supervisor -g

Sekarang jalankan aplikasi node Anda dengan node-supervisor dan itu akan mengawasi perubahan pada file di direktori kerja Anda:

supervisor /home/path/to/your/www/server.js(catatan supervisorbukan node).


Ini bagus, namun satu hal yang harus diperhatikan adalah jika Anda menambahkan npm baru ke aplikasi lokal Anda, Anda harus melakukan instalasi npm untuk modul itu di server juga. Jika tidak, Anda mungkin memiliki aplikasi yang mogok.
k00k

2
Tidak .. Modul node apa pun yang menjadi tempat bergantung aplikasi lokal saya diinstal di sub direktori node_modules dari proyek saya, yang merupakan repo GIT lokal saya, maka ketika saya menambahkan, melakukan, lalu mendorong ke server jarak jauh mereka juga akan disalin.
Wes Johnson

8
Benar, tetapi artinya adalah jika salah satu modul tersebut memiliki kode yang telah dikompilasi (seperti mhash misalnya), itu mungkin tidak berjalan di server lain yang memiliki OS dan / atau arsitektur berbeda. Menggunakan package.json untuk melacak dependensi Anda dan kemudian strategi penerapan yang dilakukan npm install -ldi server jarak jauh adalah cerdas. Ini tentu saja dapat digabungkan dengan metode Anda menggunakan kait pasca-terima.
k00k

1
dan Anda cukup menambahkan pohon kerja Git ke dalam perintah git checkout secara langsung: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (daripada membuat variabel dan mengekspornya ke skrip Anda.
JasonB

Pertanyaannya adalah tentang Github.
Noah

18

Mungkin sangat terlambat untuk membalas di sini. Tetapi saya menemukan proyek ini di github dan tampaknya melakukan apa yang ingin Anda lakukan tetapi dengan cara yang jauh lebih bersih.

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

Saksikan berikut ini. Akan juga tertarik untuk mengetahui pendapat orang lain tentang hal ini dalam hal komentar dan suara positif.

Cheers,
S


15
"Mungkin sangat terlambat untuk menjawab di sini." Tidak pernah terlalu terlambat. :) Anda benar-benar berkontribusi kepada seluruh komunitas (kebanyakan dari kami googler; wow, hanya melihat 20k tampilan itu!), Bukan satu orang yang mengajukan pertanyaan "beberapa waktu lalu". Waktu, dengan sendirinya, tidak relevan: selama teknologi yang dimaksud relevan, jawaban Anda juga akan demikian. (Terima kasih atas tipnya, BTW, memeriksanya ...)
Sz.

1
terima kasih atas perhatian Anda! ;) Ini bekerja dengan baik untuk saya pada waktu itu. Sekarang saya lebih suka menggunakan travis (travis-ci.org), (di mana pun saya bisa ) untuk penerapan otomatis. @lunakid
Saurabh Kumar

8

Dalam sebuah proyek yang sedang saya kembangkan, saya mengikuti pedoman yang tercakup dalam buku brilian Jez Humble "Pengiriman Berkelanjutan" (layak dibaca).

Ini berarti menciptakan pipa penyebaran menggunakan beberapa bentuk server integrasi berkesinambungan (saya menggunakan Thoughtworks edisi komunitas gratis Go ), yang bertanggung jawab untuk pertama memeriksa kode Anda untuk kualitas, kompleksitas dan menjalankan tes unit. Itu kemudian dapat mengikuti pipeline penerapan yang menghasilkan dorongan ke server produksi Anda.

Ini terdengar sangat rumit, tetapi tidak harus begitu, dan memang membuat seluruh proses penulisan kode dan itu membuat jalan produksi menjadi aman dan bebas khawatir (tidak ada hari rilis yang menakutkan!).

Saya menggunakan pipeline penerapan penuh untuk sistem langsung, dan versi yang dipotong untuk modul npm yang saya tulis, dan keduanya berbagi teknik penerapan 1-klik yang sama.


& 1 lagi untuk rekomendasi buku! Saya menemukan CI tidak untuk didekati dengan santai.
Merrick

yah, orang-orang mengajukan pertanyaan sederhana, Anda memberikan solusi lengkap :). Saya harus mengatakan ini berlebihan. Tetapi jika Anda sudah menggunakan pengiriman berkelanjutan, mungkin inilah rute yang harus ditempuh.
windmaomao

8

Saya baru saja menerbitkan solusi berbasis node untuk masalah Anda: node-cd

Ini terdiri dari aplikasi node sederhana yang berjalan di VPS Anda yang akan menerima Hooks pasca- terima Github dan menjalankan skrip yang Anda suka (misalnya skrip shell yang akan mematikan aplikasi Anda, git pull, dan memulai ulang).


+1 karena ini murni node.js, jadi poster tidak perlu menambahkan apa pun ke tumpukan mereka, atau menggunakan bahasa yang tidak mereka sukai. Juga, kode yang ditata dengan sangat baik
code_monk

3

Berikut implementasi nodeJS sederhana lainnya.

Ini adalah server node yang sangat sederhana yang berjalan pada nama host dan port yang Anda konfigurasikan dan dapat disiapkan untuk menangani posting GitHub yang menerima web hook. Dan tindakan pul / test / deploy yang sebenarnya dapat disesuaikan untuk melakukan apa pun yang Anda inginkan. Dalam implementasi saat ini, ini adalah perintah shell yang ditentukan secara inline dalam skrip server nodeJS. Dan ada skema keamanan berbasis secret_key yang sangat sederhana juga.

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

Server pementasan saya sudah menginstal dan menjalankan node, jadi menulis ini cepat dan mudah.


" domainanda.com:8088/… " - BENAR-BENAR ?! kunci "rahasia" diteruskan di hapus di URL !!!! Tidak ada yang harus menggunakan itu.
Julian Knight

1
Minumlah aspirin dan tenangkan Julian. Dapatkan parameter dienkripsi saat menggunakan https.
Gavin

3

Saya menemukan proyek untuk penerapan mudah menggunakan git.

git-play

Saya pikir itu cara yang tepat untuk Anda.

Saksikan berikut ini.


2

Jika Anda menginginkan solusi berbasis python / tornado, saya menulis skrip untuk menangani permintaan POST dari Layanan Webhook Github . Anda dapat menemukannya di https://github.com/Akobi/ops/tree/master/autodeploy

Ini pada dasarnya menggunakan file konfigurasi JSON untuk mendaftar repo mana yang Anda harapkan akan didorong, perintah mana yang ingin Anda jalankan saat menerapkan, dan direktori mana perintah harus dijalankan. Yang harus Anda lakukan adalah memodifikasi file konfigurasi sesuai keinginan Anda dan menjalankan naskah!

Selain itu, saya menggunakan Nginx sebagai proxy terbalik untuk meneruskan POST ini ke skrip saya. Anda dapat menemukan konfigurasi Nginx di repo Github yang sama di bawah folder 'nginx'.

Selamat mendorong!



1

Saya telah membuat alat penerapan dasar saya sendiri yang secara otomatis akan menarik pembaruan baru dari repo - https://github.com/jesalg/SlimJim - Pada dasarnya alat ini mendengarkan github pasca-terima-kait dan menggunakan proxy untuk memicu perbarui skrip.


1

Saya adalah pendiri https://commando.io dan baru-baru ini kami mengumumkan integrasi dengan GitHub melalui sebuah layanan. Integrasi memungkinkan Anda menjalankan eksekusi di server saat Anda melakukan push ke repo GitHub. Ini adalah peluang sempurna untuk menjalankan skrip penerapan secara otomatis saat Anda memasukkan kode.

Eksekusi adalah skrip yang Anda tulis di dalam Commando.io yang dapat ditulis dalam bash, perl, python, ruby, go, atau node.js. Untuk membaca lebih lanjut, dan melihat contoh skrip eksekusi berjalan git pull, lihat pengumuman entri blog kami: http://blog.commando.io/run-executions-via-github-push/


1

Deepl.io tampaknya menjadi pesaing baru dan menjanjikan di ruang ini.

Fitur (diambil dari situsnya):

  • Tangkap webhook dari GitLab & GitHub
  • Konfigurasikan beberapa repositori
  • Konfigurasikan beberapa cabang per repositori
  • Gunakan skrip penerapan Anda sendiri, baik PHP, shell, atau keduanya
  • Mengirim email konfirmasi

1

Perhatikan juga ada layanan gratis / murah di luar sana seperti REPOMAN.IO yang mengotomatiskan hampir semua ini untuk Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.