Git 푸시 (GitHub 및 node.js) 후 내 앱을 자동으로 배포하려면 어떻게해야합니까?


92

내 애플리케이션 (node.js)이 VPS (리눅스)에 배포되어 있습니다. git 허브를 저장소로 사용하고 있습니다. git push에서 애플리케이션을 자동으로 배포하려면 어떻게해야합니까?



1
: 위의 progit 링크에 대한 업데이트 git-scm.com/book/en/Customizing-Git-Git-Hooks
코드 수련원

Git 2.10은 흥미로운 기능을 추가 할 것입니다 : 푸시 옵션 stackoverflow.com/a/38770670/6309
VonC

답변:


63

PHP의 예 :

github 저장소로 이동하여 "Admin"을 클릭하십시오.

'서비스 후크'=> 'WebHook URL'탭을 클릭하십시오.

그리고 추가

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
@Advanced 1 어쩌면 스크립트 권한, 실행 플래그 ... 2 PHP에서 닫는 태그를 추가하는 것은 나쁜 습관입니다.
Pawel Dubiel 2013 년

3
@Advanced 한 가지 기술은 Bob이 스크립트를 실행하지 않도록하는 것입니다. POST 요청이 Github의 서버에서 오는지 확인하는 것입니다. 요청시 보내는 HTTP 헤더를 확인하십시오. 또한 추측 할 수없는 '비밀'URL을 만들 수도 있습니다.
jyap


1
@ Arius2038 "당신은 매일 새로운 것을 배운다"는 말을 들어 본 적이 있습니까? 이것이 오늘 제 "새로운 것"입니다. 공유해 주셔서 감사합니다!
Purefan 2014 년

23

답변 / 코멘트로 Git 후크에 대한 언급이 몇 개 있었는데, 이는 과거에 저에게 효과적이었습니다. 다른 사람이 더 구체적인 정보를 필요로하는 경우 여기에 제 레시피가 있습니다.

git post-receive hooknode-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은 저장소에 푸시 한 후 앱 디렉토리의 파일을 새로 고칩니다.


Node-Supervisor로 노드 실행

머신에 전역 노드 모듈로 Node-Supervisor를 설치해야합니다. sudo npm install supervisor -g

이제 node-supervisor로 노드 앱을 실행하기 만하면 작업 디렉토리의 파일에 대한 변경 사항을 감시합니다.

supervisor /home/path/to/your/www/server.js( supervisor대신 참고 node).


이것은 괜찮지 만주의해야 할 한 가지는 로컬 앱에 새 npm을 추가하면 서버에서도 해당 모듈에 대해 npm 설치를 수행해야한다는 것입니다. 그렇지 않으면 앱이 충돌 할 수 있습니다.
k00k

2
아니요 .. 내 로컬 앱이 의존하는 모든 노드 모듈은 내 프로젝트의 node_modules 하위 디렉터리에 설치됩니다.이 디렉터리는 내 로컬 GIT 리포지토리입니다. 따라서 추가, 커밋 한 다음 원격 서버로 푸시하면 복사됩니다.
Wes Johnson

8
맞습니다.하지만 그 모듈 중 하나에 컴파일 된 코드가있는 경우 (예 : mhash) 다른 OS 및 / 또는 아키텍처 인 다른 서버에서 실행되지 않을 수 있습니다. 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

확인 해봐. 댓글과 찬성에 대해 다른 사람들이 어떻게 생각하는지 알고 싶을 것입니다.

건배,
S


15
"아마 여기에 응답하기에는 아주 늦었을 것입니다." 너무 늦지 않았습니다. :) 당신은 실제로 전체 커뮤니티에 기여하고 있습니다 (대부분의 Google 사용자, 와우, 그 20k 조회수 만보고 있습니다!). 한 사람이 "언젠가"라는 질문을 한 사람이 아닙니다. 시간 자체는 무관합니다. 문제 의 기술 이 관련이있는 한 귀하의 대답도 마찬가지입니다. (팁 감사합니다, BTW, 확인해보세요 ...)
Sz.

1
고마워요! ;) 그 당시 나를 위해 잘 작동했습니다. 지금은, (travis-ci.org) 트래비스를 사용하는 (선호 어디든지 내가 할 수있는 자동화 된 배포). @lunakid
Saurabh Kumar

8

현재 개발중인 프로젝트에서 Jez Humble의 훌륭한 책 "Continuous Delivery"(읽을만한 가치가 있음)에서 다루는 지침을 따릅니다.

즉, 어떤 형태의 지속적인 통합 서버를 사용하여 배포 파이프 라인을 생성하는 것을 의미합니다 (저는 Go의 Thoughtworks 무료 커뮤니티 에디션을 사용 합니다 ). 먼저 코드의 품질, 복잡성 및 실행 단위 테스트를 확인해야합니다. 그런 다음 배포 파이프 라인을 따라 프로덕션 서버로 푸시 할 수 있습니다.

이것은 매우 복잡하게 들리지만 반드시 그럴 필요는 없으며 코드를 작성하는 전체 프로세스를 만들어 안전하고 걱정없이 프로덕션에 들어갈 수 있도록합니다 (두려운 릴리스 날짜 없음!).

라이브 시스템에는 전체 배포 파이프 라인을 사용하고 내가 작성한 npm 모듈에는 축소 버전을 사용하며 둘 다 동일한 원 클릭 배포 기술을 공유합니다.


& 도서 추천에 대한 또 다른 +1! 나는 CI가 우연히 접근하지 않는다는 것을 발견했습니다.
메릭

글쎄, 사람들은 간단한 질문을하고 완전한 해결책을 제시합니다. :). 나는 이것이 과잉이라고 말해야한다. 그러나 이미 지속적 배포를 사용하고 있다면 이것이 갈 길일 것입니다.
windmaomao

8

문제에 대한 노드 기반 솔루션을 게시했습니다. node-cd

VPS에서 실행되는 간단한 노드 앱으로 구성되어 Github 수신 후 후크를 수신 하고 원하는 스크립트를 실행합니다 (예 : 앱을 종료하고 git pull 및 다시 시작하는 셸 스크립트).


순수 node.js이기 때문에 +1하기 때문에 포스터는 스택에 아무것도 추가하거나 익숙하지 않은 언어를 사용할 필요가 없습니다. 또한 정말 멋지게 배치 된 코드
code_monk 2014-02-22

3

여기 또 다른 간단한 nodeJS 구현이 있습니다.

구성한 호스트 이름 및 포트에서 실행되는 매우 간단한 노드 서버이며 GitHub 포스트 수신 웹 후크를 처리하도록 설정할 수 있습니다. 그리고 실제 pul / test / deploy 작업은 원하는 모든 작업을 수행하도록 사용자 정의 할 수 있습니다. 현재 구현에서는 nodeJS 서버 스크립트에 인라인으로 지정된 쉘 명령입니다. 또한 매우 간단한 secret_key 기반 보안 체계도 있습니다.

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

내 스테이징 서버에는 이미 노드가 설치되어 실행 중이므로 작성하는 것이 빠르고 쉽습니다.


" yourdomain.com:8088/…"- 정말?! "비밀"키가 URL에서 일반으로 전달되었습니다 !!!! 아무도 그것을 사용해서는 안됩니다.
Julian Knight

1
아스피린을 먹고 줄리안을 진정 시키세요. https를 사용할 때 가져 오기 매개 변수가 암호화됩니다.
Gavin

3

쉽게 배포 할 수있는 프로젝트는 git을 사용합니다.

git-play

나는 그것이 당신에게 적절한 방법이라고 생각합니다.

확인 해봐.


2

Python / tornado 기반 솔루션을 원한다면 Github의 Webhook Services 에서 POST 요청을 처리하는 스크립트를 작성했습니다 . 당신은 그것을 찾을 수 있습니다https://github.com/Akobi/ops/tree/master/autodeploy

기본적으로 JSON 구성 파일을 사용하여 푸시를 예상하는 저장소, 배포시 실행할 명령, 명령이 실행되어야하는 디렉토리를 나열합니다. 원하는대로 구성 파일을 수정하고 실행하기 만하면됩니다. 스크립트!

또한 Nginx를 역방향 프록시로 사용하여 이러한 POST를 내 스크립트로 전달합니다. Nginx 구성은 'nginx'폴더 아래의 동일한 Github 저장소에서 찾을 수 있습니다.

행복한 추진!



1

리포지토리 ( https://github.com/jesalg/SlimJim) 에서 새 업데이트를 자동으로 가져 오는 기본 배포 도구를 만들었습니다. 기본적으로 github post-receive-hook을 수신하고 프록시를 사용하여 업데이트 스크립트.


1

저는 https://commando.io 의 창립자입니다. 이며 최근에 서비스를 통해 GitHub와의 통합을 발표했습니다. 통합을 통해 GitHub 저장소로 푸시 할 때 서버에서 실행을 실행할 수 있습니다. 이는 코드를 푸시 할 때 배포 스크립트를 자동으로 실행할 수있는 완벽한 기회입니다.

실행은 bash, perl, python, ruby, go 또는 node.js로 작성할 수있는 Commando.io 내부에 작성하는 스크립트입니다. 자세한 내용을 읽고 running의 예제 실행 스크립트를 git pull보려면 블로그 게시물 공지를 참조하십시오. http://blog.commando.io/run-executions-via-github-push/


1

Deepl.io 는이 분야에서 새롭고 유망한 경쟁자 인 것 같습니다.

기능 (웹 사이트에서 가져옴) :

  • GitLab 및 GitHub에서 웹훅 잡기
  • 여러 저장소 구성
  • 저장소 당 여러 분기 구성
  • 자체 배포 스크립트 (PHP, 셸 또는 둘 다) 사용
  • 확인 이메일을 보냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.