2015.06.29 23:06

Git으로 웹/테스터 서버 관리해보기

(GIT으로 웹개발을 하다가 배운 것인데 기록을 위해 정리해 봅니다. 간략하게 적기 위해 경어를 사용하지 않았습니다.)


git으로 많이 하는데 본인이 랩탑 (Mac)에서 개발을 하면서 AWS (Amazon Web Services, http://aws.amazon.com/) 등 여러 서버들을 사용하여 테스트도 하고 (테스트 서버)  또 일부 사용자들에게 베타 테스트도 하고 또 마지막으로 전체 사용자들에게 릴리즈 (프로덕션 서버)할텐데  


1. 로칼에서 개발을 하고 테스트를 한다음 잘되면

2. 테스트 서버로 자동으로 파일들을 보내주고

3. 문제 없으면 프로덕션 서버로 자동으로 보내 준다면

4. 그리고 이 모든것을 본인의 로컬인 렙탑에서 할수 있다면 




위의 그림처럼 할수 있다면 얼마나 좋을까? 많이 사용하는 git push와 hook으로 쉽게 할수 있는 방법이 있다. (http://toroid.org/ams/git-website-howto 에서 배워왔습니다. heroku, https://www.heroku.com/ 도 이와 비슷한 원리.)


우선 (1) Mac에서 간단하게 git (clone) 등으로 개발한다고 가정. 여기서는 간단하게 index.html을 가진 git depository를 만듬.


$ mkdir website && cd website 

$ git init

Initialized empty Git repository in /home/ams/website/.git/

$ echo 'Hello, world!' > index.html

$ git add index.html

$ git commit -q -m "The humble beginnings of my web site."


그런후 서버 (2) 에 로그인 한다음 

$ssh ubuntu@test.serv

---- login 이후 서버 (2) 에서 작업

$ mkdir website.git && cd website.git

$ git init --bare

Initialized empty Git repository in /home/ams/website.git/

$ pwd

/home/ubuntu/website.git    -- git의 디렉토리를 확인하세요.


그런다음 서버 (2)의 웹 디렉토리가 어디인지 확인하고, 이 예에서는 /var/www/html/hunkim 이라 가정하고 이 디렉토리를 GIT_WORK_TREE로 설정하고 git checkout 을 하도록 post-receive hook을 지정하면 된다. 물론 git의 hook을 실행시키는 사용자 (예제의 경우 ubuntu)가 /var/www/html/hunkim 디렉토리에 쓰기 권한이 있어야 한다.

---- 서버 (2) 에서 계속 작업

$ cat > hooks/post-receive

#!/bin/sh

GIT_WORK_TREE=/var/www/html/hunkim git checkout -f

$ chmod +x hooks/post-receive



이제 설정 거의 완료! 마지막으로 로컬인 Mac (1) 으로 돌아 온다음 위 git을 remote에 추가 한다.

--- 로컬 (1) 에서 작업

$ git remote add test ssh://test.serv/home/ubuntu/website.git  -- remote의 이름을 'test'로 붙여줌    

                                                                                -- 아까 서버 (2) 에서 확인한 git directory

                                                                                -- 로그인은 ssh-agent등을 사용 자동으로 되게하면 편리.

$ git push test +master:refs/heads/master  -- git refspec을 통해 master를 가져오도록 설정.


이제 서버 (2)의 지정된 디렉토리 (/var/www/html/hunkim) 에 index.html이 생겨난 것을 확인.


그럼 이제 Mac (1) 로컬에서 마음껏 수정하고 파일도 추가한 다음 늘 하던데로 git commit하고 바로 다음 한명령만 주면 모든 수정된 내용이 test 서버 (2)에 적용! 이렇게 쉬울수가 없죠?


--- 로컬 (1) 에서 작업

$ git push test


이런 방식으로 원격 repository를 --bare로 만들고 work_tree를 분리하는 이유는 지정된 디렉토리 (/var/www/html/hunkim)에 불필요한 git의 메타데이타 (.git 디렉토리)를 남기지 않기 위한이다. 이렇게 하면 지정된 디렉토리에는 작업한 파일만 보내 지게 된다.


그럼 production 서버 (3)나 다른 서버들을 추가 하려면 어떻게 하면 될까? 위와 똑 같은 방법으로 설정하신다음 remote을 add 할때 다른 이름으로 하면 되겠죠? 그럼 git push test, git push production, git push XXX 등으로 각각 다른 서버로 commit된 파일들을 보낼수 있게 된다.


혹 더 좋은 방법이나 툴들이 있다면 댓글로 알려 주세요.


Trackback 0 Comment 2
  1. 김홍식 2015.10.02 18:46 address edit & del reply

    다짜고짜 질문 정말 죄송합니다. 제 나름대로는 너무 중요한 일이라서.... T.T
    mobius9@gmail.com입니다.

  2. 2015.10.02 18:48 address edit & del reply

    비밀댓글입니다

2008.11.03 01:13

간단한 Subversion Branching/Merging

서버버전을 사용하여 소스코드 checkout 및 commit은 많이 하는데 왠지 branch를 만들거나 merge하려니 이거 좀 복잡한 생각이 들때가 있고 메뉴얼을 읽어 봐도 북잡하기만 하다.

그러나 Branch의 기능은 전제 Team의 개발에 영향을 주지 않고 혼자서 (또는 소규모 팀별로) 프로그램을 고치고 테스트 하고 잘 될때 head로 보낼때 아주 유용하게 사용할 수 있다. 서버버전을 사용하면 그 방법도 간단하다.

우선 Checkout 부터 한번 해보자. (Subversion 저장소- https://coolproj.googlecode.com/svn/trunk)


svn co https://coolproj.googlecode.com/svn/trunk/  coolproj
cd colproj
[작업]
svn ci -m"작업 잘 했음. 무엇 무엇 고쳤음. 무슨무슨 버그 잡았음"

이렇게 하는 것이 보통 그냥 branch같은거 사용하지 않고 하는 작업인데 여기서 branch만들기는 너무 간단하다.

svn copy coolproj  https://coolproj.googlecode.com/svn/branches/new-hot-feature

이렇게 하면 끝이난다.

그런다음 이 새로운 branch 를 checkout 해서 작업을 하면 된다.
svn co https://coolproj.googlecode.com/svn/branches/new-hot-feature coolproj-branch

그냥 이전의 coolproj 라는 workspace를 사용하고 싶으면 살짝 'switch' 해주면 된다.


cd dupbug/
svn switch https://coolproj.googlecode.com/svn/branches/new-hot-feature

[작업]
svn ci -m"작업 잘 했음. 무엇 무엇 고쳤음. 무슨무슨 버그 잡았음"

이렇게 checkin 된 코드는 이전에 생성된 branch에 남아 있게 된다.

여러번 작업을 한다음 이 branch가 충분히 훌륭한 관계로 trunk에 보내고 싶다면 merge하면 된다. 우선 바로 merge하기 전에 (trunk가 변했을수도 있으므로) 몇가지 확인 해보자. 우선 --dry-run (예행연습)

svn merge --dry-run  https://coolproj.googlecode.com/svn/branches/new-hot-feature \                                             https://coolproj.googlecode.com/svn/trunk

그러면 무엇이 바뀌는 것인지 보여 준다.

구체적으로 무엇이 달라졌는지 line-by-line으로 보고 싶으면 diff를 사용한다. (주의 URL의 순서가 merge때와 다르게 바뀌었다)

svn diff https://coolproj.googlecode.com/svn/trunk \
            https://coolproj.googlecode.com/svn/branches/new-hot-feature

마지막으로 모든것이 좋아 보여 merge를 하려면 앞에서 dry-run을 하면 된다.
svn merge --dry-run  https://coolproj.googlecode.com/svn/branches/new-hot-feature \ https://coolproj.googlecode.com/svn/trunk

branch와 merge는 작은 단위의 commit이 많이 필요할때는 불필요하게 다른 사람들이 나의 commit을 보이고 싶지 않을때 요긴하게 사용되는 기능이다. 한번만 사용해보면 쉽게 사용할 수 있다. 
Trackback 1 Comment 0