====== 소스관리도구 서버환경 운영 ====== ===== 개요 ===== 전자정부 표준프레임워크는 개발환경의 소스관리도구로 오픈소스인 Subversion을 사용한다.\\ Subversion(SVN, 버전관리 시스템)은 시스템의 콘솔을 통한 직접적인 사용 이외에 사용자의 PC에서 편리하게 사용할 수 있도록 GUI를 가진 다양한 클라언트가 존재한다. Subversion은 프로젝트 전반적으로 사용하는 파일들을 관리하기 위한 시스템이다.\\ Subversion은 다수의 개발자가 프로그램을 개발할 때 버전 관리를 통해 히스토리를 관리하고, 전체 팀의 공통 모듈을 일관성 있게 유지할 수 있도록 한다. ===== 설명 ===== Subversion은 실제의 작업용 디렉터리(작업공간) 이외에, 저장소(repository)라고 하는 영역에 최초의 데이터와 그 이후의 갱신 이력이나 변경 내역을 저장한다.\\ {{:egovframework:dev2:scm:svn_concept.png|버전관리 개요}} * 저장소는 여러 개 생성 가능 * 사용할 파일이나 디렉터리는 import로 저장소에 등록 * checkout을 실행하면 저장소 내용이 작업공간에 복사되며 .svn 디렉터리가 생성됨 * 파일이나 디렉터리를 수정하면 commit을 통해 변경분이 저장소에 등록되며, 저장소의 변경 내용을 반영하려면 update를 수행 * 관리 정보 없이 저장소 내용을 가져오려면 export를 수행 ==== Subversion의 아키텍처 ==== 저장소(Subversion Repository)는 버전화된 모든 데이터를 관리하며, 클라이언트 프로그램은 로컬 환경에서 복사된 데이터를 관리한다. 이들은 다양한 저장소 액세스(RA) 층을 통해 통신한다.\\ {{:egovframework:dev2:scm:svn_architecture.png|Subversion 아키텍처}} ==== Subversion의 구성요소 ==== * svn : 커맨드라인 클라이언트 프로그램 * svnversion : 작업 복사의 상태를 관리하는 프로그램 * svnlook : Subversion 저장소를 조사하는 도구 * svnadmin : 저장소를 조정하거나 복원하는 프로그램으로 시스템 관리자가 사용 * svndumpfilter : 저장소 덤프 파일 데이터를 필터링하는 프로그램 * mod_dav_svn : Apache HTTP 서버용 플러그인 모듈로, 저장소를 네트워크를 통해 공유 가능 * svnserve : 데몬으로 실행되거나 SSH를 통해 동작하는 독립 서버 프로그램 ===== 사용법 ===== ==== 주요 기능 ==== - 디렉터리의 버전 관리 * 디렉터리 트리 전체의 변경을 추적할 수 있는 가상적 버전 관리 시스템 구현 * 디렉터리에도 버전 정보가 추가됨 - 버전 이력 관리 * 파일 및 디렉터리에 대해 추가, 삭제, 복사, 명칭 변경 가능 * 신규 추가되는 모든 파일은 독립적인 변경 이력을 가짐 - Atomic Commit(원자적 커밋) * 변경 사항은 모두 적용되거나, 전혀 반영되지 않음 * Commit 대상 내용의 일부만 저장소에 반영되는 문제 방지 - 메타데이터 버전 관리 * 파일과 디렉터리 속성은 Key-Value 조합임 * 속성도 버전 관리됨 - 네트워크 엑세스 방식 선택 * HTTP 서버 확장 모듈로로서, 서버가 제공하는 기능(인증, 인가, 데이터 압축 등)을 곧바로 활용 가능 * 독립 실행형 서버로 SSH를 이용한 터널 통신 지원 * 저장소 내 액세스용 추상 레어어를 활용하여 새로운 네트워크 프로그램 구현이 비교적 간단함 - 데이터 처리의 일관성 * 동일한 알고리즘을 사용하여 텍스트 및 바이너리 데이터 변경 사항 관리 - 효율적인 브랜치 및 태그 생성 * 하드 링크와 유사한 방식을 사용하여, 프로젝트 복사시 자동으로 브랜치 및 태그 생성 (시간과 공간 효율적) * 브랜치와 태그를 작성하는 비용이 프로젝트 크기에 비례하지 않는다. - 확장성 * API 기반으로 구현되어 유지보수 및 타 시스템과 연동 용이 ==== 주요 명령어 ==== - 체크아웃 (check-out) * 저장소에서 로컬 작업 복사본을 생성 * 최신 버전 이외에 원하는 버전으로 checkout하는 것도 가능함 - 커밋 (commit) * 변경 사항을 저장소에 반영 * 커밋 시 프로젝트 전체 리비전이 증가 - 업데이트 (update) * 저장소의 최신 변경 사항을 로컬 작업 공간으로 반영 * 최우선 원칙 : 파일을 변경하기 전에 언제나 갱신을 수행 - 임포트 (import) * 최초로 저장소에 소스를 등록하는 작업 - 익스포트 (export) * 버전 관리 파일 없이 순수한 소스 파일만 가져오기 * 오픈소스 프로젝트의 경우 소스를 압축하여 릴리즈 할 때 사용함 - 충돌 (conflict) * 동일한 파일을 여러 사용자가 수정할 경우 발생 - 리비전 (revision) * 변경 사항이 커밋될 때마다 증가하는 저장소의 버전 번호 * 여러개의 파일 중 하나만 변하여 commit 하더라도 모든 파일의 버전은 올라가며, 버전은 프로젝트 단위로 증가함 - 트렁크 (trunk) * 프로젝트의 메인 개발 브랜치 * trunk 디렉터리 아래에는 바로 소스들의 파일과 디렉터리가 들어가게 됨 - 브랜치 (branches) * 특정 기능을 개발하거나 테스트할 때 트렁크를 분기하여 사용하는 공간 - 태그 (tag) * 특정 시점의 프로젝트 소스를 저장하는 공간 * 태깅은 기본적으로 개정판 번호(Revision Number)와 상관없이 각 파일에 라벨을 붙이는 것이며, 이 작업은 작업 사본에 할 수도 있고 저장소 자체에 할 수도 있음 - 후크 (hook) * 저장소 이벤트(새로운 개정판의 생성이나 버전 관리가 되지 않은 속성의 수정 등) 발생 시 실행되는 스크립트 * 그 이벤트가 무엇인지, 어떤 목표로 작동하는지, 이벤트를 실행한 사람의 사용자 이름이 무엇인지 알려줌 - 잠금 (lock) * 파일의 수정 권한을 특정 사용자에게 할당 - 병합 (merge) * 한 브랜치의 변경 사항을 다른 브랜치에 적용 ==== 서버 운영관리 - CLI 방식 ==== - 저장소 만들기\\ Subversion repository는 향후 repository의 추가와 관리가 용이하도록 복수 개의 repository 구성을 추천한다. * Root Repository 를 위한 directory를 생성한다. > mkdir repository * 각각의 Repository를 생성한다. > cd repository > svnadmin create --fs-type fsfs repo1 > svnadmin create --fs-type fsfs repo2 - 인증/권한 정보 설정 (conf/svnserve.conf) * 각 repository conf 폴더(또는 디렉토리)의 svnserve.conf 파일에서 해당 repository의 사용권한을 설정한다. * anon-access (익명사용자), auth-access (인증된 사용자)에 대한 설정을 하지 않는 경우, default로 익명사용자는 읽기권한, 인증된 사용자는 쓰기권한이 부여된다. * 다음은 svnserve.conf 작성의 예이다. [general] ### These options control access to the repository for unauthenticated ### and authenticated users. Valid values are "write", "read", ### and "none". The sample settings below are the defaults. # anon-access = read # auth-access = write # 익명 사용자는 접근을 허용하지 않고 인증된 사용자만 쓰기 권한을 부여한다. anon-access = none auth-access = write ### The password-db option controls the location of the password ### database file. Unless you specify a path starting with a /, ### the file's location is relative to the conf directory. ### Uncomment the line below to use the default password file. # 패스워드 파일은 기본값인 conf/passwd 파일을 사용한다. password-db = passwd ### The authz-db option controls the location of the authorization ### rules for path-based access control. Unless you specify a path ### starting with a /, the file's location is relative to the conf ### directory. If you don't specify an authz-db, no path-based access ### control is done. ### Uncomment the line below to use the default authorization file. # 리포지토리의 디렉토리별, 사용자 그룹별 권한관리를 하지 않는 경우, 추가적인 권한 # 설정을 사용하지 않는다. # authz-db = authz ### This option specifies the authentication realm of the repository. ### If two repositories have the same authentication realm, they should ### have the same password database, and vice versa. The default realm ### is repository's uuid. # 이 리포지토리의 인증 시 나타나는 타이틀을 지정한다. realm = eGovFrame SVN Repository - 저장소 만들기\\ 각 repository conf 폴더(또는 디렉토리)의 passwd 파일에서 사용자를 등록한다. 형식은 사용자 'id = 패스워드'이며, 패스워드는 현재 평문 형식이다. ### This file is an example password file for svnserve. ### Its format is similar to that of svnserve.conf. As shown in the ### example below it contains one section labelled [users]. ### The name and password for each user follow, one account per line. [users] # harry = harryssecret # sally = sallyssecret developer01 = 123qwe developer02 = 123qwe - 백업 및 복구 * Dump : 표준 입출력을 통해서 저장소의 내용을 파일로 생성한다. svnadmin dump 명령을 사용하며 이 명령은 저장소 디렉토리 바깥에서 사용해야 한다. > ls repository > svnadmin dump repository > repository.dump * Load : 저장소 백업 파일을 이용해서 저장소를 복구한다. svnadmin load 명령을 사용하며, 빈 저장소를 생성한 뒤 백업 파일을 이용해서 복구 한다. > svnadmin create repository > ls repository repository.dump > svnadmin load repository < sample.dump ==== 서버 운영관리 - GUI 방식 ==== GUI 방식은 현재 Windows 운영체제만 지원한다. [[egovframework:dev4.3:svrinstall|서버 개발환경 설치 가이드]] 내 {{:egovframework:dev4.3:egovci-4.3.0-installation-guide.pdf|[표준프레임워크] CI 및 Nexus 환경구축 가이드 v4.3}}을 활용하여 SVN을 설치 및 구성한다. ===== 참고자료 ===== * Subversion 오픈소스 프로젝트 사이트: http://subversion.tigris.org/