Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@miconblog
Last active July 2, 2017 16:41
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miconblog/c3c786a5363219350d25 to your computer and use it in GitHub Desktop.
Save miconblog/c3c786a5363219350d25 to your computer and use it in GitHub Desktop.
deploy node app when git pushed.

Git 레파지토리 커밋하면 자동으로 배포하기

사전에 필요한 것들 (requirement..)

  1. git 프로토콜 사용을 위해 SSH 설정을 미리 해두세요! ( need SSH key )
  2. 배포 스크립트를 미리 만들어 두세요! ( need a script for dist )

데몬을 실행하는 방법 (How to start demon..)

$> node git2distd.js & 

배포 시나리오

  • 배포 서버: node, git, grunt 가 동작하는 환경
  • Git 저장소: github, bitbuket 혹은 직접 구축한 git 서버
  • 개발 환경: local이든 원격이든 git push만 할수있으면 됨.
  1. 먼저 배포 서버에 git2distd 데몬을 실행시킨다. 이녀석은 데몬이 실행됨과 동시에 지정된 Git 저장소의 해시값을 모니터링 하게 된다.
  2. 개발자는 배포할 코드를 master 브랜치로 머지하고 git저장소에 push한다.
  3. git2distd가 git저장소의 해시값이 변경됨을 감지하고, 지정된 배포 스크립트를 실행한다.
  4. 지정된 배포 스크립트는 git pull로 먼저 새로운 소스를 받은 다음 테스트를 돌리든, 빌드를 돌리든,.. 알아서 하시고,..
  5. 노드 애플리케이션 데몬을 재시작한다. (ex) $> forever restartall )

롤백 시나리오

  1. 어머! 배포된 녀석에 버그가 있네?... 문제점이 발견되는 즉시,...
  2. 배포 서버에 들어가서 git checkout을 이용해 원하는 지점으로 소소코드를 롤백한다.
  3. 그리고 애플리케이션 데몬을 재시작한다.
  4. 롤백 끝!

롤백후 재배포가 필요한 경우

  1. 재배포가 필요하면 다시 push 한다.
  2. 재배포 끝!
{
"intervalTime": 10000,
"git": {
"repository": "git@bitbucket.org:USER/PROJECT.git", // or https://USER@bitbucket.org/USER/PROJECT.git
"branch": "master"
},
"dist": {
"command": "grunt release",
"cwd": "./"
}
}
var exec = require('child_process').exec,
config = require('./git2distConfig.json'),
cmd = "git ls-remote --heads",
moment = require("moment"),
timer, fs = require('fs');
function getTime(){
return moment().format("YYYY-MM-DD mm:hh:ss");
}
function rewriteConfig(){
fs.writeFile("./git2distConfig.json", JSON.stringify(config, null, 2), function(err) {
if(err) {
console.log(err);
} else {
console.log("[",getTime(),"]", "DONE.");
}
});
}
function exectueScript(){
console.log("[",getTime(),"]", "distribute HEAD: ", config.git.HEAD);
var sh = config.dist;
rewriteConfig();
exec(sh.command, {cwd:sh.cwd}, function (error, stdout, stderr) {
console.log(stdout);
});
}
console.log("[", getTime(),"]", "start git2dist demon...");
(function chkHashChanged(){
var git = config.git;
//console.log("[", getTime(),"]", "Check '", git.branch,"' Hash Changed...");
exec([cmd, git.repository].join(" "), function (error, stdout, stderr) {
var data = stdout.split("\n");
for(var i=0, len=data.length; i<len; ++i){
var heads = data[i].split("\t"), head;
var regx = new RegExp(git.branch);
if ( regx.test(heads[1]) ){
head = heads[0];
break;
}
}
if(!head){
clearTimeout(timer);
console.error("[", getTime(),"]", "There is no", git.branch, "branch");
}else{
if(git.HEAD != head ) {
git.HEAD = head;
exectueScript();
}
}
});
timer = setTimeout(chkHashChanged, config.intervalTime);
})();
@miconblog
Copy link
Author

forever restartall 할 경우 데몬이 설정파일이 제대로 쓰여지지 않는 문제를 해결하기 위해 exectueScript() 함수에서 rewriteConfig() 함수의 위치를 변경함.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment