서브버전으로 관리되던 소스들을 git으로 이전하기로 마음 먹었다.

기존에 운용되던 서브버전 서버를 제거하고 git서버를 구축하려다가 그냥 남들 사는대로 살자 싶어서 비트버킷으로 결정했다.


 내친김에 비트버킷을 이용하여 자동화된 코드배포를 구현하고 싶었다.

crontab을 사용해 주기적으로 git clone을 하려다 너무 세련되 보이지 않아 찾다보니 webhooks 라는게 보였다.


이때쯤 김주원님의 "Envoy를 이용한 코드 배포 자동화" 글을 보았다.

envoy를 쓰는 방식도 끌리긴 했지만 나는 그다지 큰 시스템도 아니라... 

그냥 간단하게 써도 될듯했고... webhook을 써보고 싶었다... ^^;;;


 그래서 간단하게 반응할 php를 만들었다...

다른 서버에 복사하기도 귀찮고 정리좀 할까 싶다가 composer package 를 만들어야겠다 싶어서 만들었다.

할꺼 많은데 자꾸 일을 벌인다...


계획 

  • master 브랜치만 적용
    - Git Flow 을 쓸때 master만 배포하고 이 외 develop 이나 feature 등은 배포시에 제외한다. 

  • bitbucket의 webhook 접근만 허용하자.
    - 공개된 주소이므로 아무나 접근이 가능했다. 그래서 bitbucket의 IP인 104.192.143.1~255 까지만 허용하기로 했다.

  • 로그를 남기자
    - 나중을 위해 뭐라도 남겨야....

  • 알림같은게 되었으면 좋겠는데...
    Pushbullet을 사용했다. slack쓸껄 후회도 했다... ㅡ,.ㅡa

  • 가능하면 수정된 파일만 바꾼다.
    - git으로 관리되지 않은 설정파일 혹은 업로드된파일 등은 건드리지 않는다.

이런 계획을 세웠다.



이제부턴 존칭으로.. ^^;;



준비


테스트 및 포스팅 편의를 위해 node1, node2, node3, node4 를 셋팅하여 가상의 상황을 만들었습니다.

주소는 아래와 같습니다. 

 http://node1.wbp.co.kr

 http://node2.wbp.co.kr

 http://node3.wbp.co.kr 

 http://node4.wbp.co.kr

※ 테스트로 셋팅한 환경은 일정시간 유지하겠지만 언제 없어질지 모릅니다. 


비트버킷에 배포가될 코드의 repository를 생성하겠습니다.

git@bitbucket.org:DexterPark/test-site.git 이고...

https://bitbucket.org/DexterPark/test-site 로 접근 가능합니다.

예제로 쓸꺼라 공개 repository이지만 실제는 비공개로 하셔야 겠지요?? ^^ 


요약




요약 하자면 이러한 구조입니다.


1. 개발장비에서 비트버킷에 push를 한다. 

2. master로 push가 들어오면 지정한 url로 hook을 날린다. (브렌치는 master외 다른 것으로 설정 가능)


3. hook을 받은 서버는 비트버킷으로 pull을 요청한다...

사실 pull은 아니고 fetch이다...


4. 그리고 결과를 Pushbullet 을 통해 알려준다.



설치


node1 에 설치해보겠습니다.



$ mkdir /home/git

$ cd /home/git

$ git clone --mirror git@bitbucket.org:DexterPark/test-site.git


/home/git를 만들고 

repository를 clone mirror하였습니다.




/home/git/test-site.git 로 생성되었네요... 

해당 경로가 필요하니 기억해 둡니다.


그리고 node1 으로 이동합니다.



구조는 간단합니다. 


웹 루트는 /home/node1/public_html 이지만 /home/node1 전체를 관리하겠습니다.

왜냐면 저는 프레임웍을 사용하니까요... ^^;

여기도 경로도 아래 설정할때 사용되니 기억해 주세요...


아까 composer로 만들었다던 bitdepoly를 설치하겠습니다.

( 참고 : https://packagist.org/packages/dexterys/bitdepoly )



$ composer require dexterys/bitdepoly


여느 composer 설치법과 같습니다.


이제 bitbucket에서 hook을 받을 파일을 생성합니다.


파일은 /home/node1/public_html/bitbucket-hook.php 에 아래와 같이 생성하겠습니다.

https://bitbucket.org/DexterPark/bitdepoly/src 로 가시면 샘플코드를 비롯한 모든 소스코드를 보실 수 있습니다.


<?php require_once __DIR__ . '/../vendor/autoload.php'; use BitDepoly\Hook; $depoly = new Hook(); $depoly->server_name = 'node1'; // 서버의 이름 $depoly->branch = 'master'; // master 브렌치만 적용합니다. $depoly->repo_dir = '/home/git/test-site.git'; // 아까 git clone한 경로를 적어줍니다. $depoly->web_root_dir = '/home/node1'; // 여기도 아까 기억해 달라던 적용될 경로입니다. $depoly->log_file = '/home/node1/deploy.log'; // 이건 로그를 기록할 위치예요. 적당한 위치로 설정하세요.

$depoly->pushbullet_token = ''; // pushbullet의 token 을 적어주세요. (아래설명) $depoly->pushbullet_user = array('xxxx@wbp.co.kr');// 알림 받을 사람 (아래설명)

 

$depoly->deployment();


저는 pushbullet 을 이용하여 알림 받도록 하였습니다.

slack 으로 하려다 다른곳에서도 사용하고 있어서 pushbullet으로 적용하였습니다.

알림을 받지 않으시려면 token 값을 비워두시면 됩니다.


아래 동영상에서 보이는 알림기능을 합니다.

https://pushbullet.com/ 이곳을 통해 가입하셔서 무료로 사용하실 수 있습니다.


또한 $depoly->pushbullet_user에는 배열로 array('xxxx@wbp.co.kr', 'xxxx222@wbp.co.kr'); 와같이 넘겨주시면 여러명에게 전송 가능합니다.

같은 방법으로 node2~4의 서버에도 동일한 방법으로 설치하였습니다.


/home/node1/public_html/bitbucket-hook.php 에 생성후 자신에 맞게 설정을 바꾸셨으면 이제 bitbucket 에서도 설정해주어야 합니다.



bitbucket repository로 이동후 webhook을 설정합니다.



add webhook 을 선택하시면 아래와 같이 나옵니다.




아까 생성한 bitbucket-hook.php 의 경로를 적어주세요.

비트버킷의 IP인 104.192.143.x 에만 반응합니다. 브라우져로 접속시 에러만 출력해요. 

http://node2.wbp.co.kr/bitbucket-hook.php  <- 에러메시지 구경해 보기


4대의 서버에서 테스트 할것이므로 node2~4까지 같은방법으로 등록했습니다.




이제 다 되었습니다!! 


이제 테스트를 해보겠습니다.

이미지로 설명하는것 보다 동영상이 나을것 같아서 동영상으로 만들어 보았습니다.

( 소리없음 )


이거 녹화한다고 떨리네요... ^^;;;


1. 일단 node1~4까지 열었습니다. 모두 "Hi Dexter" 라고 나오고 있네요.

2. local에 설치한 git bash에서 테스트 합니다. 

3. origin과 같도록 pull부터 하고 master브렌치의 index.php 에서 Hi Dexter를 Hello Dexter 로 바꾸었습니다.

4. 그리고 origin master로 push합니다.

5. 눈에 보이진 않지만 push받은 비트버킷에서 각 서버로 webhook을 날리고 각 서버들은 수정된 사항을 origin master에서 받아 옵니다.

6. 각 서버들은 받아온 수정사항을 적용한 후 설정된 사람에게 알림을 보냅니다. 

7. 4대가 모두 잘 배포되었다는 알림을 확인한 후 실제로 바뀌었는지 브라우져에서 확인 합니다.

8. 이번엔 master가 아닌 다른 브렌치에서 작업된것이 적용되진 ㅇ낳는지 테스트 해봅니다.

9. hotfix 브렌치를 생성하고 index.php 파일의  Hello Dexter 아래에다가 "hotfix" 라고 추가해 봅니다.

10. hotfix 브렌치를 origin에 push하고 반응을 기다려 봅니다. 

11. 의도한대로 반응이 없습니다. 

12. 그럼 master에서 merge를 한후 push를 해보겠습니다.

13. 배포되는데 조금 걸렸습니다만 정상적으로 알림이 오고 브라우져로 확인해보니 수정되었습니다.


잘 되네요... 


글 재주가 없어 잘 전달 되었는지 모르겠습니다.

긴글 읽어주셔서 감사합니다.


이것으로 마무리 하겠습니다...





'개발 > 옛날꺼' 카테고리의 다른 글

Bitbucket을 이용한 코드배포  (0) 2017.03.23
Docker image 배포  (0) 2017.03.07
재미있는 Docker  (0) 2017.03.07
자바스크립트 정규식  (0) 2012.01.19
제이쿼리를 이용한 타이머 기능  (0) 2011.10.10
jQuery 동영상 강의...  (0) 2010.09.24

+ Recent posts

티스토리 툴바