The Twelve-Factor App

5. 빌드(Build), 릴리스(Release), 런(Run)

빌드와 실행 단계 엄밀하게 분리하기

코드베이스는 3단계에 걸쳐서 (개발환경이 아닌) 배포로 변환된다.

코드는 빌드가 되고, 빌드는 설정과 결합되어 하나의 릴리스가 된다.

Twelve-Fator App은 빌드, 릴리스, 실행 단계를 엄밀하게 구분한다. 예를 들어 런타임에서 변경한 코드를 빌드 스테이지에 역전파할 수 있는 방법은 존재하지 않으며, 따라서 이러한 코드 수정은 애시당초에 불가능하다.

배포 툴은 일반적으로 릴리스 관리 툴을 제공한다. 이러한 릴리스 관리 툴은 이전 릴리스로 되돌리는 롤백(roll back) 기능도 가지고 있다. 예를 들어 Capistrano는 다수의 릴리스를 releases라는 서브 디렉토리 안에 저장한다. 이 디렉토리 아래에서 현재 릴리스는 현재 릴리스 디렉토리를 가리키는 심볼릭 링크이다. rollback 명령어를 사용하면 쉽고 빠르게 이전 릴리스로 되돌릴 수 있다.

모든 릴리스는 자기 고유의 릴리스 ID를 가져야한다. 대개 릴리스 ID로는 릴리스 시점의 타임스탬프(예를 들어 2011-04-06-20:32:17)나 자동으로 증가하는 번호(예를 들어 v100)를 사용한다. 릴리스는 오직 입력만 가능하며 한번 만들어지면 변경할 수 없다. 모든 변화는 새로운 릴리스를 통해서 적용된다.

빌드 스테이지는 새로운 코드가 배포되는 시점에 프로그래머에 의해 실행된다. 반면에 실행 단계는 서버가 재부팅되거나 프로세스 매니저에 의해 종료된 프로세스가 재실행될 때도 자동적으로 실행될 수 있다. 프로그래머가 대기하고 있지 않은 한밤중에라도 문제는 발생할 수 있기 때문에 실행 단계에서 변경 가능한 부분은 가능한 최소화되어야 한다. 반대로 빌드 단계에 발생하는 에러는 프로그래머가 확인할 수 있으므로 빌드 과정은 복잡해도 무방하다.