TeamCity 로 AWS + GitHub + .NET Continuous Integration 만들어보기 (3)

3번째 포스트.. 글 쓰는게 쉬운게 아니구나를 느낀다.
teamcity 셋팅 이후로 업데이트 일이 정말 현저하게 많이 줄었다. 가장 최고의 셋팅은 역시 미리보기 서버를 만든 것이다.
각 feature branch 마다 해당 기능을 개발할텐데 그 해당 기능을 다른 팀과 공유 하려면 내부는 상관없었지만, 외국의 지사와 공유하기에는 큰 불편이 따랐다. Public 공간에서 공유를 해야 했기 때문에 branch 만들 때마다 셋팅을 해야 하는 큰 불편함이 있었다. 그.래.서. 만들었다. 각 브랜치를 자동 배포 할 수 있도록.

이번 포스트는 미리보기 서버에 대한 이야기다.

테스트 서버(Staging Server)에 자동 배포 만들기

Build 설정이 완료 되었으면, 사실 테스트 서버에 자동 배포를 만드는 방법은 간단하다.

  • 새로운 Build 설정을 하나 만들자.
  • 이름은 Deploy to Staging.
  • Staging 서버에서는 batch 파일을 만들어서 특정 위치에 놓아둔다.
  • Build Step : Command Line Script Execute 를 통해 Batch 파일을 경로에 둔다.
  • Triggers 를 통해 배포 완료 이후 실행 설정하는게 가장 이상적이고 확실한 방법이다.
    • 배포 실패 했을 때 파일을 복사시키면 안되니깐
  • Branch filter 를 통해 특정 브랜치만을 배포 이후에 자동 실행 할 수 있게 해둘 수 있다.

Triggers

Windows 서버의 특성상 batch 파일을 이용했는데, Unix/Linux 계열이라면 쉘스크립트 하나 만드는 것이다.
Batch 파일은 일반적으로 (2)번 글에서 실행했던 /p:OutDir=%system.outRootPath% 에 Deploy 된 파일들이 전부 들어가 있다. 그것을 스테이징 서버에 Web sites folder로 옮긴 것 밖에 없다.
xcopy %system.outRootPath% %web.sites.folder% /s/e/k/y/q 같은 형식이 주를 이루는 코드다.

문제는 이렇게 해두었을 때는 default:master 와 develop branch들만 자동 배포가 된다는 단점이 있었다. 도대체 미리보기 서버는 어떻게 만들어야 하는 것인가? 를 고민했다가, 카카오스토리 팀의 코드리뷰 글을 읽다가 실마리가 풀렸다.

브랜치 미리보기 서버

  • 깃헙의 gh-pages에서 아이디어를 얻음
  • 공유하고자 하는 브랜치를 특정 패턴의 이름으로 푸시하면, 해당 기능의 스냅샷이 배포되도록 서버를 구성함
  • 예를 들어, 개발자는 작업하던 feature/XXX 브랜치를 preview/XXX로 푸시하면 됨
  • 푸시 후엔 XXX.story.kakao.com 같은 URL로 공유할 수 있음

이 부분에서 내가 아이디어를 얻은 것은 3차 도메인 부분에 대한 내용이다. 냉큼 도메인 서버(DNS)를 통해 3차 도메인을 생성했다. 3차 도메인을 생성하는 방법은

예를 들어

  • staging.clo3d.com A 123.123.123.123 으로 하나 만들고
  • *.staging.clo3d.com CNAME staging.clo3d.com 으로 하나 만들고
  • staging.clo3d.com NS 123.123.123.123. 으로 하나 또 만들어 두면 간단하게 해결된다.

이렇게 만든건 예시일 뿐 DNS 관련 내용은 회사마다 달라서 서버 관리자 에게 해달라고 부탁하는게 제일 좋다. 그리고 이게 왜 이렇게 만들어지는 이 글에서 다룰 내용이 아니라고 생각...

*.{staging}.{domain}.com 으로 생성한 도메인을 staging 서버를 바라보게 하고, iis 에서 host header를 생성시켜주는 걸로 마무으리~~

이게 무슨 말인지 이해가 안된다면 아래의 순서대로 진행되는 결과다.

  • TeamCity 에서 모든 branch는 push 이후 빌드가 된다
  • feature/something1 브랜치 push
  • TeamCity 에서 자동 빌드
  • Preview 미리보기 Build 설정 실행 (이부분은 teamcity에서 클릭 한 번의 수동으로 진행)
    • Custom Script 실행
      • /p:OutDir=%system.outRootPath% 에 있던 feature/something1 의 Deploy 파일들을
      • 미리보기 게시용 폴더로 복사한다 ex) c:\web\preview\something1
      • IIS 사이트 create (app pool 도 같이 생성, virtual directory도 환경에 맞게 생성)
      • host header 에 something1.{staging}.{domain}.com 추가
  • Preview 사이트 접속 잘되나 something1.{staging}.{domain}.com 브라우저에서 확인
  • 미리보기가 다 끝났으면 삭제 하는 스크립트로 생성
    • 위와 반대로 iis 삭제하고, 폴더 삭제 하는 스크립트를 생성한다.
이 코드는 preview 를 만드는 script의 일부분이다.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 2. File Copy 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if exist "!DeployFolderPath!!websitesFolderName[%1]!" RD !DeployFolderPath!!websitesFolderName[%1]! /s/q

mkdir !DeployFolderPath!!websitesFolderName[%1]!

xcopy !outWebPath!!websitesFolderName[%1]!\*.* !DeployFolderPath!!websitesFolderName[%1]!\ /s/e/k/y/q

copy !WebFolderPath!!websitesFolderName[%1]!\web.config !DeployFolderPath!!websitesFolderName[%1]!\web.config

echo !outWebPath!!websitesFolderName[%1]!\*.* to !DeployFolderPath!!websitesFolderName[%1]!\ Copied.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 3. IIS 셋팅을 하고 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

%WINDIR%\system32\inetsrv\appcmd.exe add sites /name:"[PREVIEW] !PreviewBranchName!.staging.clo3d.com" /bindings:"http/*:80:!PreviewBranchName!.staging.clo3d.com" /physicalPath:"!DeployFolderPath!!websitesFolderName[%1]!"
%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"PREVIEW_!PreviewBranchName!" /managedRuntimeVersion:v4.0
%WINDIR%\system32\inetsrv\appcmd.exe set app "[PREVIEW] !PreviewBranchName!.staging.clo3d.com/" /applicationpool:"PREVIEW_!PreviewBranchName!"
%WINDIR%\system32\inetsrv\appcmd.exe add vdir /app.name:"[PREVIEW] !PreviewBranchName!.staging.clo3d.com/" /path:/web.upload /physicalpath:"D:\UploadFiles\"

회사 솔루션은 여러 사이트가 한 번에 deploy 되는 바람에 사이트를 고를 수 있도록, 간단하게 C# 프로그램을 만들었다. 이 프로그램으로 인해 회사의 쥬니어들도 쉽게 preview 서버를 만들 수 있게 되었다. 간단하게 feature 페이지를 공유하고, 눈에 보이니까 바로 피드백을 주고 받으면서 기능들이 발전해나가는 모습을 바라볼 수 있기에 이번 작업은 꽤나 보람찬 작업이었다.

Ssemi

Read more posts by this author.