ฉันจะปรับใช้แอปของฉันโดยอัตโนมัติหลังจากการพุช git (GitHub และ node.js) ได้อย่างไร


92

ฉันมีแอปพลิเคชันของฉัน (node.js) ที่ใช้งานบน VPS (linux) ฉันใช้ git hub เป็นที่เก็บ ฉันจะปรับใช้แอปพลิเคชันโดยอัตโนมัติบน git push ได้อย่างไร


4
คุณได้ตรวจสอบ git hooks progit.org/book/ch7-3.htmlแล้วและยังตรวจสอบ github help.github.com/test-webhooks
Pawel Dubiel

1
อัปเดตสำหรับลิงก์ progit ด้านบน: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code Novitiate

Git 2.10 จะเพิ่มคุณสมบัติที่น่าสนใจ: push options stackoverflow.com/a/38770670/6309
VonC

คำตอบ:


64

ตัวอย่างใน PHP:

ไปที่ github ในที่เก็บ github ของคุณเพิ่มคลิก "Admin"

คลิกแท็บ 'Service Hooks' => 'WebHook URLs'

และเพิ่ม

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

จากนั้นสร้าง 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');
}

ใน build.sh คุณจะต้องใส่คำสั่งปกติเพื่อดึงไซต์ของคุณจาก github


6
สวัสดีขอบคุณมาก อะไรป้องกันไม่ให้ Bob เรียกใช้สคริปต์การปรับใช้ของฉัน
ขั้นสูง

16
@ ขั้นสูง 1 อาจอนุญาตสคริปต์แฟล็กการดำเนินการ ... 2 การเพิ่มแท็กปิดใน PHP เป็นการปฏิบัติที่ไม่ดี
Pawel Dubiel

3
@ ขั้นสูงเทคนิคหนึ่งเพื่อให้แน่ใจว่า Bob ไม่เรียกใช้สคริปต์ของคุณคือตรวจสอบให้แน่ใจว่าคำขอ POST มาจากเซิร์ฟเวอร์ของ Github ตรวจสอบส่วนหัว HTTP ที่พวกเขาส่งเมื่อทำการร้องขอ นอกจากนี้คุณสามารถสร้าง URL "ลับ" ที่เดาไม่ออก
jyap

5
@Purefan ไม่ใช่เรื่องตลก :) stackoverflow.com/questions/3219383/…
Pawel Dubiel

1
@ Arius2038 เคยได้ยินคำว่า "เรียนรู้สิ่งใหม่ ๆ ทุกวัน" ไหม? นี่คือ "สิ่งใหม่" ของฉันในวันนี้ ขอบคุณสำหรับการแบ่งปัน!
Purefan

23

มีการกล่าวถึง Git hooks เป็นคำตอบ / ข้อคิดเห็นซึ่งเคยใช้ได้ผลกับฉันในอดีต .. ดังนั้นนี่คือสูตรอาหารของฉันหากคนอื่นต้องการข้อมูลที่เฉพาะเจาะจงมากกว่านี้

ฉันใช้การรวมกันของgit post-receiver hookและnode-Supervisorเพื่อทำการปรับใช้อัตโนมัติอย่างง่ายให้สำเร็จ (สมมติว่าคุณกำลังใช้ที่เก็บ git ระยะไกลบนเครื่องนั้น)


ตั้งค่าตะขอหลังรับของคุณ

ในที่เก็บของคุณ: sudo vi hooks/post-receive

และควรมีลักษณะดังนี้:

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

ตั้งค่าการอนุญาตไฟล์: chmod +x hooks/post-receive

Git จะรีเฟรชไฟล์ในไดเรกทอรีแอปของคุณหลังจากกดไปที่ repo


รันโหนดด้วย Node-Supervisor

คุณจะต้องติดตั้ง Node-Supervisor บนเครื่องของคุณเป็นโมดูลโหนดส่วนกลาง: sudo npm install supervisor -g

ตอนนี้เพียงแค่เรียกใช้แอปโหนดของคุณด้วยผู้ดูแลโหนดและจะคอยดูการเปลี่ยนแปลงไฟล์ในไดเรกทอรีการทำงานของคุณ:

supervisor /home/path/to/your/www/server.js(หมายเหตุsupervisorแทนnode)


ไม่เป็นไร แต่สิ่งหนึ่งที่ต้องระวังคือหากคุณเพิ่ม npm ใหม่ในแอปในเครื่องของคุณคุณจะต้องทำการติดตั้ง npm สำหรับโมดูลนั้นบนเซิร์ฟเวอร์ด้วย หากไม่เป็นเช่นนั้นคุณอาจมีแอปที่ขัดข้อง
k00k

2
ไม่ .. โมดูลโหนดใด ๆ ที่แอปภายในเครื่องของฉันขึ้นอยู่กับถูกติดตั้งในไดเร็กทอรีย่อย node_modules ของโปรเจ็กต์ของฉันซึ่งเป็นที่เก็บ GIT ในเครื่องของฉันดังนั้นเมื่อฉันเพิ่มคอมมิตแล้วพุชไปยังเซิร์ฟเวอร์ระยะไกลซึ่งจะถูกคัดลอกด้วย
Wes Johnson

8
ถูกต้อง แต่หมายความว่าถ้าโมดูลใด ๆ เหล่านั้นมีโค้ดที่คอมไพล์ (เช่น mhash เป็นต้น) โมดูลนั้นอาจไม่ทำงานบนเซิร์ฟเวอร์อื่นที่เป็นระบบปฏิบัติการและ / หรือสถาปัตยกรรมที่แตกต่างกัน การใช้ package.json เพื่อติดตามการอ้างอิงของคุณจากนั้นกลยุทธ์การปรับใช้ที่ทำnpm install -lบนเซิร์ฟเวอร์ระยะไกลนั้นชาญฉลาด แน่นอนว่าสิ่งนี้สามารถควบคู่ไปกับวิธีการของคุณโดยใช้ตะขอหลังรับ
k00k

1
และคุณสามารถเพิ่มแผนผังงาน Git ลงในคำสั่ง git checkout ได้โดยตรง: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (แทนที่จะสร้าง ตัวแปรและส่งออกในสคริปต์ของคุณ
JasonB

คำถามเกี่ยวกับ Github แม้ว่า
Noah

18

อาจจะสายมากที่จะกลับมาที่นี่ แต่ฉันพบโปรเจ็กต์นี้ใน github และดูเหมือนจะทำในสิ่งที่คุณอยากทำ แต่ด้วยวิธีที่สะอาดกว่า

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

ลองดูสิ นอกจากนี้ยังสนใจที่จะรู้ว่าคนอื่นคิดอย่างไรกับเรื่องนี้ในแง่ของความคิดเห็นและการโหวตเพิ่ม

ไชโย
เอส


16
“ คงจะสายไปแล้วที่จะกลับมาที่นี่” ไม่เคยสายเกินไป. :) คุณมีส่วนร่วมกับชุมชนทั้งหมดจริงๆ (พวกเราชาว Google ส่วนใหญ่ว้าวแค่ดูยอดดูกว่า 20k ครั้ง!) ไม่ใช่ผู้ชายคนเดียวที่ถามคำถาม "เมื่อสักครู่แล้ว" เวลานั้นไม่เกี่ยวข้อง: ตราบใดที่เทคโนโลยีที่เป็นปัญหามีความเกี่ยวข้องคำตอบของคุณก็จะเป็นเช่นกัน (ขอบคุณสำหรับเคล็ดลับ BTW ตรวจสอบ ... )
Sz

1
ขอบคุณสำหรับความคืบหน้า! ;) มันใช้งานได้ดีสำหรับฉันในตอนนั้น ตอนนี้ฉันชอบใช้ travis (travis-ci.org) ( ทุกที่ที่ทำได้ ) สำหรับการปรับใช้อัตโนมัติ @lunakid
Saurabh Kumar

8

ในโครงการที่ฉันกำลังพัฒนาอยู่ฉันปฏิบัติตามแนวทางที่ครอบคลุมในหนังสือ "การจัดส่งแบบต่อเนื่อง" ที่ยอดเยี่ยมของ Jez Humble (ควรค่าแก่การอ่าน)

ซึ่งหมายถึงการสร้างไปป์ไลน์การปรับใช้โดยใช้เซิร์ฟเวอร์การรวมแบบต่อเนื่องบางรูปแบบ (ฉันใช้Goรุ่นชุมชนฟรีของ Thoughtworks ) ซึ่งมีหน้าที่ในการตรวจสอบโค้ดของคุณก่อนเพื่อหาคุณภาพความซับซ้อนและการทดสอบหน่วย จากนั้นสามารถทำตามขั้นตอนการปรับใช้ซึ่งส่งผลให้เกิดการพุชไปยังเซิร์ฟเวอร์ที่ใช้งานจริงของคุณ

ฟังดูซับซ้อนมาก แต่ไม่จำเป็นต้องเป็นและทำให้ขั้นตอนการเขียนโค้ดทั้งหมดและทำให้การผลิตปลอดภัยไร้กังวล (ไม่มีวันวางจำหน่ายที่น่ากลัว!)

ฉันใช้ไปป์ไลน์การปรับใช้เต็มรูปแบบสำหรับระบบสดและเวอร์ชันที่ถูกตัดลงสำหรับโมดูล npm ที่ฉันเขียนและทั้งสองใช้เทคนิคการปรับใช้ 1 คลิกเดียวกัน


& อีก +1 สำหรับหนังสือแนะนำ! ฉันกำลังค้นพบ CI ไม่ควรเข้าหาแบบไม่เป็นทางการ
Merrick

มีคนถามคำถามง่ายๆคุณให้คำตอบอย่างเต็มที่ :) ฉันต้องบอกว่านี่คือการโอเวอร์คิล แต่ถ้าคุณใช้การจัดส่งแบบต่อเนื่องอยู่แล้วนี่อาจเป็นเส้นทางที่จะไป
windmaomao

8

ฉันเพิ่งเผยแพร่โซลูชันที่ใช้โหนดสำหรับปัญหาของคุณ: node-cd

ประกอบด้วยในแอปโหนดธรรมดาที่ทำงานบน VPS ของคุณซึ่งจะได้รับGithub post-รับ Hooksและเรียกใช้สคริปต์ที่คุณต้องการ (ตัวอย่างเช่นเชลล์สคริปต์ที่จะฆ่าแอปของคุณ git pull และรีสตาร์ท)


+1 เนื่องจากเป็น node.js ล้วนๆดังนั้นผู้โพสต์จึงไม่ต้องเพิ่มอะไรลงในสแต็กหรือใช้ภาษาที่พวกเขาไม่คุ้นเคย นอกจากนี้รหัสที่วางไว้อย่างสวยงามจริงๆ
code_monk

3

นี่คืออีกหนึ่งการใช้งาน nodeJS ง่ายๆ

เป็นเซิร์ฟเวอร์โหนดที่เรียบง่ายมากที่ทำงานบนชื่อโฮสต์และพอร์ตที่คุณกำหนดค่าและสามารถตั้งค่าเพื่อจัดการโพสต์ GitHub รับเว็บตะขอ และการดำเนินการ Pul / test / deploy ที่แท้จริงสามารถปรับแต่งให้ทำอะไรก็ได้ ในการนำไปใช้งานปัจจุบันเป็นคำสั่งเชลล์ที่ระบุแบบอินไลน์ในสคริปต์เซิร์ฟเวอร์ nodeJS และมีรูปแบบการรักษาความปลอดภัยที่ใช้ secret_key ที่เรียบง่ายมากเช่นกัน

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

เซิร์ฟเวอร์การจัดเตรียมของฉันมีโหนดติดตั้งและทำงานอยู่แล้วดังนั้นการเขียนสิ่งนี้จึงทำได้ง่ายและรวดเร็ว


" yourdomain.com:8088/… " - จริงเหรอ! คีย์ "secret" ถูกส่งผ่านไปอย่างชัดเจนใน URL !!!! ไม่ควรมีใครใช้สิ่งนั้น
Julian Knight

1
กินยาแอสไพรินและนอนราบกับ Julian รับพารามิเตอร์ถูกเข้ารหัสเมื่อใช้ https
Gavin

3

ฉันพบว่าโครงการสำหรับการปรับใช้งานง่ายโดยใช้ git

git-play

ฉันคิดว่ามันเป็นวิธีที่เหมาะสมสำหรับคุณ

ลองดูสิ


2

หากคุณต้องการแก้ไขหลาม / พายุทอร์นาโดตามที่ผมเขียนสคริปต์เพื่อจัดการแสดงโพสต์จาก Github ของWebhook บริการ คุณสามารถค้นหาได้ที่https://github.com/Akobi/ops/tree/master/autodeploy

โดยทั่วไปจะใช้ไฟล์กำหนดค่า JSON เพื่อแสดงรายการ repos ที่คุณคาดหวังว่าจะพุชจากคำสั่งใดที่คุณต้องการเรียกใช้ในการปรับใช้และไดเรกทอรีใดที่คำสั่งต้องรันสิ่งที่คุณต้องทำคือแก้ไขไฟล์ config ตามที่คุณต้องการและเรียกใช้ สคริปต์!

นอกจากนี้ฉันใช้ Nginx เป็น reverse proxy เพื่อส่งต่อ POST เหล่านี้ไปยังสคริปต์ของฉัน คุณสามารถค้นหาการกำหนดค่า Nginx ใน Github repo เดียวกันภายใต้โฟลเดอร์ 'nginx'

ดันมีความสุข!


1

คำตอบของ PHP นั้นถูกต้องตามกฎหมายในความคิดของฉัน แต่ถ้าคุณชอบ Ruby ฉันก็บล็อกวิธีแก้ปัญหา มันเหมือนกับคำตอบของ PHP เพียง แต่เป็นภาษาอื่น คุณใช้เว็บเบ็ดและคุณมีสคริปต์ง่ายๆสำหรับฟังคำขอ HTTP ที่เกี่ยวข้อง

http://gilesbowkett.blogspot.com/2012/06/heroku-style-deployment-on-ec2.html


1

ฉันได้สร้างเครื่องมือปรับใช้พื้นฐานของตัวเองซึ่งจะดึงการอัปเดตใหม่จาก repo โดยอัตโนมัติ - https://github.com/jesalg/SlimJim - โดยทั่วไปแล้วจะฟัง github post-received-hook และใช้พร็อกซีเพื่อทริกเกอร์ อัปเดตสคริปต์


1

ฉันเป็นผู้ก่อตั้งhttps://commando.ioและเมื่อเร็ว ๆ นี้เราได้ประกาศการรวมเข้ากับ GitHub ผ่านบริการ การรวมช่วยให้คุณรันการดำเนินการบนเซิร์ฟเวอร์เมื่อคุณพุชไปยังที่เก็บ GitHub นี่เป็นโอกาสที่ดีในการเรียกใช้สคริปต์การปรับใช้โดยอัตโนมัติเมื่อคุณพุชโค้ด

การเรียกใช้งานคือสคริปต์ที่คุณเขียนภายใน Commando.io ซึ่งสามารถเขียนด้วย bash, perl, python, Ruby, go หรือ node.js หากต้องการอ่านเพิ่มเติมและดูตัวอย่างสคริปต์การเรียกใช้งานgit pullโปรดดูประกาศโพสต์บล็อกของเรา: http://blog.commando.io/run-executions-via-github-push/


1

Deepl.ioดูเหมือนจะเป็นคู่แข่งรายใหม่และมีแนวโน้มในพื้นที่นี้

คุณสมบัติ (นำมาจากเว็บไซต์):

  • จับ webhooks จาก GitLab & GitHub
  • กำหนดค่าหลายที่เก็บ
  • กำหนดค่าหลายสาขาต่อที่เก็บ
  • ใช้สคริปต์การปรับใช้ของคุณเองไม่ว่าจะเป็น PHP, เชลล์หรือทั้งสองอย่าง
  • ส่งอีเมลยืนยัน

1

นอกจากนี้โปรดทราบว่ามีบริการฟรี / ราคาไม่แพงเช่นREPOMAN.IOที่เกือบทั้งหมดนี้ให้คุณโดยอัตโนมัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.