ABOUT ME

Today
Yesterday
Total
  • [SVN] 웹 프로젝트 형상관리 - 1
    기타/형상관리 2025. 1. 24. 14:56
    728x90
    반응형

    개발을 하다 보면 프로그램에 변경사항이 생기기 마련이다.

    이 때 형상관리라는 것을 하는데, 여기서는 형상관리 툴인 SVN을 중심으로 다룬다.

     

     

     

    1. 형상관리란?

    소프트웨어의 변경사항을 체계적으로 추적하고 통제하는 것

     

    사전적 의미보다, 실제로 어떤 점이 유용한 것인지 알아보겠다.

     

    프로그램을 변경할 일이 있을 때, 

    백업 파일을 매번 만든다고 가정하자.

    주요 장점에 대해서는 아래와 같다.

     

    장점 1. 변경 이력

    백업 파일을 project_250124 이런 식으로 지으면 유사 형상관리라고 생각할 수 있는데
    이런 방식은 변경이력을 추적하기 어렵고, 어느 부분이 언제, 누가, 어떤 이유로 변경되었는지 기록되지 않는다. 


    장점 2.  충돌 방지
    여러명이 하나의 파일을 수정하면 충돌이 발생할 수 있는데, 
    형상관리 툴은 충돌을 자동으로 감지하고 해결방법을 제공한다.

    장점 3.  병합
    여러명이 다양한 브랜치에서 작업한 후, 
    브랜치를 병합해서 하나의 프로젝트로 통합하는 방식을 편하게 이용할 수 있는 기능을 제공한다.

     

     

     

    2. SVN이란?

    2 - 1. 소개

    중앙집중형 버전 관리 시스템

    파일과 디렉터리의 변경 이력을 관리해준다.

    협업 시 각 구성원이 동일한 프로젝트를 작업하고 변경 사항을 동기화 하도록 도와준다.

     

     

    2 - 2. 주요 특징

    모든 데이터는 중앙 저장소에서 관리되고 클라이언트는 저장소와 상호작용한다.

    변경, 추가, 삭제 등의 이력이 남고 이것을 이용해 상태를 복원 가능하다.

    여러 사용자가 동일한 파일을 수정할때 충돌을 감지하여 해결한다.

    작업이 중앙서버와 연결된 상태에서 이루어 지기때문에 네트워크 의존성을 가진다.

    Tag, Branch, Trunk 라는 이름의 각 라인이 존재한다.

     

     

    2 - 3. 구조

    구조는 크게 저장소, 작업 복사본으로 구분된다.

     

    Repository (저장소)

    저장소는 모든 파일 및 디렉토리의 버전 정보, 변경 기록을 포함하는 중앙 데이터베이스다.

    저장소는 여러 사용자와 클라이언트가 공유하며, 서버에 위치한다.

     

    Working Copy (작업 복사본)

    작업 복사본은 사용자가 로컬 환경에서 작업하는 파일들의 복사본이다.

    이 파일은 저장소에 있는 최신 버전으로 업데이트하거나, 변경 사항을 저장소에 커밋하여 동기화한다.

     

     

    2 - 4. 라인

    trunk

    trunk 프로젝트의 메인 라인 (Git의 main branche와 비슷함) 

    현재 진행 중인 주요 개발 작업이 이루어진다.

    그러므로 가장 최신 상태의 소스코드가 계속 업데이트된다 trunk 기준으로 작업을 시작하거나 병합한다.

    즉 소스의 주 개발 작업을 진행하는 폴더.

     

    branches

    하나의 기능을 개발, 핫픽스, 버그수정등을 하기 위한 작업 directory 보통 trunk에서 복사해서 작업을 분기한다.

    개발이 완료되면 trunk 또는 병합한다.

    독립적으로 동작하고 작업이 완료되면 필요에 따라 삭제 가능하다.

    trunk에 배포할 소스가 올라가는 장소.

    ex) repositoryname/branches/issue-login-dev

     

    tags

    특점 시점의 스냅샷(저장소의 특정 시점 백업)을 저장한다.

    Tag는 SVN내의 특정 디렉토리를 복사해서 생성한다.

    주로 안정성이 검증된 배포가능 릴리스 버전이기에 대개 변경하지 않는다

    ex) tags/1.0.0 첫번째 배포 버전)

     

    만약 로그인을 개발한다면?

    trunk, branches, tags 사용예시

    로그인 개발 기능 필요성

    trunk에서 branches로 /branches/issue-login 분기

    담당 개발자는 /branches/issue-login을 checkout 한 이후에 이 branche에서 개발

    기능 개발 완성시 테스트 이후 trunk로 병합

    안정성 테스트를 위해 /branches/release-1.0.0 생성 이후 품질 테스트 진행

    완성 이후 /tags/release-1.0.0에 버전 저장 릴리스 버전 배포

     

     

    2 - 5. 주요 개념

    Commit (커밋)
    사용자가 작업한 변경 사항을 SVN 저장소에 반영하는 과정이다.

    커밋 시, 변경된 파일과 그 설명이 저장소에 기록된다.

     

    Update (업데이트)
    로컬 작업 복사본을 최신 저장소 상태로 갱신하는 명령어이다.

    다른 사람들이 커밋한 변경 사항을 자신의 작업 복사본에 반영할 때 사용한다.

     

    Branch (브랜치)
    브랜치는 저장소에서 독립적인 작업 영역을 만들어서 다른 사람들과 충돌 없이 별도로 작업할 수 있게 해준다.

    개발 과정에서 실험적인 변경을 테스트하거나, 새로운 기능을 개발할 때 유용하다.

     

    Tag (태그)
    태그는 특정 시점의 소스 코드 상태를 기록하는 용도로 사용된다.

    보통 릴리즈 버전을 표시할 때 사용되고, 버전 정보를 변경하지 않고 고정된 상태로 보존한다.

     

    Merge (병합)
    브랜치에서 작업한 내용을 다른 브랜치로 통합할 때 사용된다.

    예를 들어, 기능 개발이 완료된 브랜치를 메인 브랜치에 병합하는 작업이다.

     

     

     

    3. 설치

    svn 저장소 위치를 리눅스 서버에 둘 것이다.

    리눅스 세팅은 이 글과 같다.


    https://gktjdehd33.tistory.com/152

     

    3 - 1. selinux 설정 끄기

    #편집기로 설정 파일을 연다

    sudo nano /etc/sysconfig/selinux

     

    SELINUX=enforcing을 SELINUX=disabled로 변경

     

     

    3 - 2. 아파치(httpd), svn 설치

    #당시 2.4.62 버전

    sudo dnf install httpd

     

    #subversion 및 mod_dav_svn 버전 1.14.1

    sudo dnf install subversion mod_dav_svn

     

    #2.4.62

    호환성 때문에 가급적 아파치와 버전을 맞추는 것이 좋다고 한다. 

    sudo dnf install subversion mod_ssl

     

    #1.3.4 

    sudo dnf install firewalld

     

     

     

    4. SVN 설정

    4 - 1. svn 저장소 생성

    #최상위 경로 까지 directory 생성

    sudo mkdir -p /var/www/svn

     

    #그 directory 아래에 저장소 생성

    #sudo svnadmin create /var/www/svn/저장소이름

    sudo svnadmin create /var/www/svn/repo1

     

     

    4 - 2. 아파치 권한주기 & 방화벽 설정

    sudo chown -R apache:apache svn최상위경로

     

    #ex) #/var/www/svn/repo1 #/var/www/svn/repo1 #일때

    # /var/www/svn 하위 경로에 아파치가 접근 가능

    sudo chown -R apache:apache /var/www/svn

     

    #방화벽 설치 및 활성화

    sudo systemctl start firewalld

     

    #HTTP 및 HTTPS 포트 열기

    sudo firewall-cmd --permanent --add-service=http

     

    #HTTPS 규칙일때

    sudo firewall-cmd --permanent --add-service=https

     

    #방화벽 재시작

    sudo firewall-cmd --reload

     

     

    4 - 3. 아파치 유저 생성

    #/etc/httpd에 svn-auth-users라는 파일을 생성하고 계정 정보 입력

    #sudo htpasswd -cm 경로/관리파일이름 유저이름

    #m은 암호화 알고리즘 정보,

    # 암호화 방식에 대한 정보는 htpasswd --help 로 확인할 수 있다.

    sudo htpasswd -cm /etc/httpd/svn-auth-users 123

     

    #첫번째 이후 사용자 생성

    sudo htpasswd -m /etc/httpd/svn-auth-users 122

     

    #편집기로 확인후 결과 예시

    sudo nano /etc/httpd/svn-auth-users

     

     

     

     

    5. 저장소 사용자별 권한 설정

     

    5 - 1. 설정 설명

    ex) 현재 리포지토리 이름이 repo1일 경우

     

    [/]

    repo1에 대한 권한

     

    [/appProject]

    repo1의 하위의 appProject에 대한 권한

     

     

    그룹 설정

    webInternalGroup = ga, na

    webInternalGroup에 ga, na 유저를 속하게함 (htpasswd로 생성한 유 저)

     

     

    권한 설정 예시

    유저 na의 경우 webInternalGroup과 webExternalGroup에 속함

     

    ~/repo1/appProject는 appGroup인 ga 유저만 r(읽고)w(쓰기)권한을 허용하므로,

    na 계정을 사용하는 user는 접속하지 못함

     

    ~/repo1/internalWebProject는 webInternalGroup 그룹에게 rw권한 을 허용하므로 na는 읽고 쓸수 있음.

     

     

     

    6. Apache와 Subversion 연동 설정 파일

    #apache와 subversion 연동 파일 생성 및 편집

    #apache의 url와 매핑될 subversion의 규칙 정의

    sudo nano /etc/httpd/conf.d/subversion.conf

     

    subversion.conf 설정파일 예시

    #사용할 모듈
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule dav_svn_module modules/mod_authz_svn.so
    #/repo1 경로로 들어올때 이 규칙 적용
    
    <Location /repo1>
    DAV svn
    SVNPath /var/www/svn/repo1
    AuthType Basic
    AuthName "SVN Repository 1"
    AuthUserFile /etc/httpd/svn-auth-users
    Require valid-user
    AuthzSVNAccessFile /var/www/svn/repo1/conf/authz
    </Location>
    
    <Location /repo2>
    DAV svn
    SVNPath /var/www/svn/repo2
    AuthType Basic
    AuthName "SVN Repository 2"
    AuthUserFile /etc/httpd/svn-auth-users
    Require valid-user
    AuthzSVNAccessFile /var/www/svn/repo2/conf/authz
    </Location>

     

    <Location /repo1>

     

    • Apache 서버에서 http://your-server/repo1 경로에 대한 설정을 정의합니다.
    • 사용자가 /repo1 경로로 접근할 때 이 설정이 적용됩니다

     

     

    DAV svn

     

    • Subversion 리포지토리를 WebDAV(Distributed Authoring and Versioning) 프로토콜을 통해 호스팅한다는 설정입니다.
    • Apache가 Subversion을 지원하도록 하는 mod_dav_svn 모듈과 연결됩니다.

     

     

    SVNPath /var/www/svn/repo1

     

    • /repo1 경로에 연결될 Subversion 리포지토리의 파일 경로를 지정합니다.
    • 실제로 Subversion 리포지토리가 /var/www/svn/repo1 디렉토리에 저장됩니다.

     

     

    AuthType Basic

     

    • 사용자 인증 방식을 정의합니다. 여기서 Basic Authentication(기본 인증)을 사용합니다.
    • Basic Authentication은 사용자 이름과 암호를 평문(Base64)으로 전달하지만,
    • HTTPS를 통해 암호화되어 전송됩니다.

     

     

    AuthName "SVN Repository 1"

    • 사용자 인증 요청 시 사용자에게 표시되는 인증 창 제목을 설정합니다.

     

    AuthUserFile /etc/httpd/svn-auth-users

     

    • 사용자 인증에 사용할 사용자 계정 파일의 경로를 지정합니다.
    • 이 파일은 htpasswd 명령어를 사용하여 생성되며, 사용자 이름과 암호(암호화된 형태)가 저장됩니다.

     

     

    Require valid-user

     

    • 인증된 사용자만 접근을 허용한다는 설정입니다.
    • **AuthUserFile**에서 인증된 사용자만 /repo1 리포지토리에 접근할 수 있습니다.
      • 이 설정이 없으면 인증 없이 누구나 접근 가능해집니다.

     

     

    AuthzSVNAccessFile /var/www/svn/repo1/conf/authz

     

    • SVN 리포지토리의 세부적인 접근 제어 권한을 정의한 파일의 경로를 지정합니다.
    • 이 파일은 Subversion이 사용자나 그룹별로 디렉토리에 대한 권한을 관리할 수 있도록 합니다.

     

     

     

    7. 설치 경로 모음

    #httpd 설치 경로

    /etc/httpd

     

    #방화벽 설치경로

    /etc/firewalld

     

    #mod_dav_svn 설치 위치 (apache의 모듈 subversion 본체)

    Subversion(SVN)을 Apache를 통해 제공하기 위한 모듈

    /etc/httpd/modules/mod_dav_svn.so

     

    #mod_ssl 설치 위치 (apache의 모듈)

    Apache에서 SSL/TLS를 사용한 HTTPS 연결을 지원하는 모듈.

    /etc/httpd/modules/mod_ssl.so

     

     

     

     

    8. 설정 파일 & 기타 경로 모음

    #apache - subversion url 매핑 파일 (연동파일)

    /etc/httpd/conf.d/subversion.conf

     

    #모음(svn 유저)

    /etc/httpd/svn-auth-users

     

    #각 저장소에 대한 svn 유저 권한 관리 설정파일(나중에 변동 될 수 있음)

    /var/www/svn/각 저장소 이름/conf/authz 
    /var/www/svn/repo1/conf/authz

     

    #svn repository 시작 경로 (Location 태그에 적어놓은 경로)

    /var/www/svn

     

    #subversion 문서와 예제파일

    /usr/share/doc/subversion/

     

     

    다음엔 svn을 좀 더 편하게, 명령어 없이 인텔리제이 GUI로 사용하는 걸 알아보겠다.

    728x90
    반응형
Designed by Tistory.