본문 바로가기
HW 프로그래밍/라즈베리파이

SVN 서버 설치 방법 정리 2

by N2info 2021. 2. 6.

* 수정이력 *
2018.08.31 : PC상 접근방법 추가

흔히 들 거론하는 형상관리서버를 우리 라즈베리파이로도 훌륭히 구축할 수 있다.
어쩌면 매우 작은비용으로 서버가 구축되며 유지관리 비용 또한 매우매우 작기에 개인프로젝트나 소규모 프로젝트에서는 충분히 써먹을만 하다고 보며 최대장점은 작은 유지관리비용이 아닐까 한다.
아래는 라즈베리파이상에서 Subversion기반 형상관리서버를 구축하고 PC에서 TortoiseSVN 클라이언트 프로그램을 통해 접속하여 실제 개발을 진행하는 전 과정을 다뤄본다.
즉 레파지토리는 네트웍상에서 라즈베리파이로 만들고 각 개발자는 LAN으로 접속하여 체크아웃, 커밋, Export를 진행하며 개발 작업을 할 수 있는 환경이 만들어 지는 것이다.

* PC TortoiseSVN Project Monitor상에서 기본 용어정리

Show log : 소스의 변경내역을 확인코자 할 때
Revision graph : 리비젼의 변경내역을 도식화 하여 보여준다.
Export : SVN으로 관리한 내역을 제거하고 순수 코드만 추출하고자 할 때 사용
Check-out : 레파지토리에 올려진 소스를 로컬로 내려 받되 SVN으로 형상관리 개시
Import : SVN의 레파지토리에 소스를 등록하는 작업
Commit(Check-in) : 내려 받은 소스를 수정한 후 레파지토리에 반영 하는 작업
   - 만일 파일추가가 발생하는 상황이라면 이때 Change made [v]에서 체크

SVN 관리자(형상관리 시스템) 역할 분장
   - 형상관리시스템 관리자 : 프로젝트의 생성, 삭제, 백업관리 및 접근계정관리
   - 각 프로젝트의 개발 담당자
     . 자신의 로컬컴퓨터에 클라이언트기반 버전 관리툴인 TortoiseSVN을 설치한다.
     . 개발 프로젝트파일 Import(trunk, binary, branch 트리)
     . 소스의 변경작업은 반드시 소스서버로부터 check-out 받은 다음에 작업한다.
     . 소스 변경작업이 완료되면 지체 없이 Check-in 한다.

트리명 명명규칙
    Target-+PIC-+PIC32MM-+binary
                                             +branch
                                             +etc
                                             +trunk
     - binary : 실행파일이 저장되는 폴더.
      새로운 버전이 릴리즈 될 때마다 프로젝트 담당자는 binary 트리에 실행파일을 커밋
     - branch : 메인트리에서 갈라져 나오는 브랜치 트리
       트렁크트리에 소스를 브랜치 트리에 바로 따지 말고 반드시 브랜치 하위 트리를 만들고 그 트리에다 브랜치를 따도록 한다 이는 여러 개의 브랜치가 동시에 진행될 수 있기 때문이다. 브렌치에서 개발을 한후 메인에 머지를 한다.
     - etc : 소스 외 프로젝트에서 생성되는 각종 문서, 이미지 등의 리소스를 저장한다.
     - trunk : 최종 소스가 저장된 메인 트리

커밋로그 작성 규칙
   (trunk 트리) 소스가 변경되거나 추가되는 배경 및 이유를 명기하고 소스가 변경되는 내용이 특정 티켓과 연관이 있다면 커밋창에서 ticket: 레이블에 티켓번호를 기입 한다.
    (binary 트리) 배포할 버전 번호를 명기한다. 어떤 소스트리에서 컴파일/빌드한 것인지를 명기한다.

* 라즈베리파이에 Subversion을 설치하고 테스트 하는 과정
1. 라즈베리파이의 pi계정에서 시스템 업데이트
$sudo apt-get update
$sudo apt-get upgrade
최신 보안패치, 각종 프로그램 업데이트가 자동으로 진행된다.

2.Subversion을 구축하는데 필요한 필수 모듈을 설치한다.
$sudo apa-get install subversion
$sudo apa-get install apache2 libapache2-svn
subversion  <- SVN 데몬을 돌리기 위한 소프트웨어
apache2    <- 웹브라우져를 통한 접근에 사용키 위함
libapache2-svn  <-- 아파치 웹브라우져와 SVN 연동에 사용됨

3. 저장소(레파지토리 : Repository Folder) 생성
(접근방식A) 레파지토리에 svn://172.30.1.100 등과 같이 직접 접속
(접근방식B) 웹브라우져와 연계하여 http://172.30.1.100/svn 등과 같이 접속 

3.1 접근방식 A (svn://172.30.1.100)
직접 레파지토리 생성과 보안설정을  단번에 하는 방식으로서 필자는 이 방식을 추천한다.
우선 아래와 같이 레파지토리를 만든다.
 pi@raspberrypi ~ $ sudo svnadmin create /home/pi/svn
이 작업으로 인해 기본적으로 svn://172.30.1.100 형태로 접근할 경로가 생긴다.
이때 폴더명은 반드시 svn으로 함에 유의한다.
다음으로 이 폴더에 엑세스할 권한을 아래의 3.3,을 참조하여 진행한다.
pi@raspberrypi ~ $ sudo vi /home/pi/svn/conf/passwd
pi@raspberrypi ~ $ sudo vi /home/pi/svn/conf/svnserve.conf
이 폴더에 접근권한이 생겨나면 Target-ARDUINO-WeMOS-08.Client-myESP8266RTC
등 과 같이 자신의 업무계층에 적절한 경로를 만들고 그 하위에 (binary, branch, etc, trunk) 폴더를 만들어 소소관리를 본격 시작한다.

3.2 접근방식 B (http://172.30.1.100/svn)
우선 pi계정 하위에 repos라는 레파지토리를 만든다.
pi@raspberrypi ~ $ mkdir -p /home/pi/repos
시험용으로 사용할 helloworld란 프로젝트를 만든다면 다음과 같다.
prj_helloworld라는 프로젝트를 SVN상에서 생성하는 명령어를 내린다.
이 디렉토리명 하부에 conf, db, hooks, locks등의 폴더가 생겨난다.
특히 conf폴더는 해당 프로젝트에 접근을 허용할 ID, PASSWORD등이 수록된다.
pi@raspberrypi ~ $ sudo svnadmin create /home/pi/repos/prj_helloworld
아파치웹서버에서 접근이 가능하도록 권한을 부여한다.
pi@raspberrypi ~ $ sudo chown -R www-data:www-data /home/pi/repos/prj_helloworld

3.3. 레파지토리에 접근할 SVN 계정 및 암호생성
해당 프로젝트에 접근을 허용할 ID와 PASSWORD는
pi@raspberrypi ~ $ sudo vi /home/pi/repos/prj_helloworld/conf/passwd
[users]
myID1 = myPASSWORD1
myID2 = myPASSWORD2
myID3 = myPASSWORD3
등으로 설정한다.

해당 프로젝트에 접근할 보안정책을 설정한다.
pi@raspberrypi ~ $ sudo vi /home/pi/repos/prj_helloworld/conf/svnserve.conf
[general]
anon-access = read
auth-access = write
password-db = passwd
realm = My First Repository

4. 리눅스상에서 SVN 기본 기능 테스트
아파치랑 연동해서 웹에서 접근하는 것을 설정하기 전에 SVN이 잘 동작하는지를 테스트 해본다. 우선 helloworld라는 프로젝트를 SVN 레파지토리 밖에서 디렉토리도 만들고 프로그램도 작성해 본다.

4.1. Sample 파일 생성해 보기
pi@raspberrypi ~ $ sudo mkdir /home/pi/projects/helloworld
pi@raspberrypi ~ $ cd /home/pi/projects/helloworld
pi@raspberrypi ~ $ sudo vi main.c
ex)
// main.cpp v .1
#include <iostream>
using namespace std;
int main ()
{
  cout << "Hello World!";
  return 0;
}

4.2. 커맨드라인 방식으로 Import 하기
우선 연습 삼아 위 helloworld라는 폴더를 폴더 째로 SVN에 추가하도록 해본다. 이렇게 SVN에 관리대상을 올리는 작업을 Import한다라고 한다.
pi@raspberrypi ~ $ sudo svn import /home/pi/projects/helloworld/ file://localhost/home/pi/repos/prj_helloworld/

위 명령을 치면 해당 리비젼에 대한 설명을 적으라고 나오며 설명을 모두 적은 후 Ctrl+X하면 저장되면서 리비전1이 생성된다.

아래와 같은 메시지가 나온다.
Adding /home/pi/projects/helloworld/main.cpp
Committed revision 1.
여기까지가 정상이라면 SVN의 기본적인 테스트는 끝난 것이다.

5. 방식B를 위해 웹에서도 접속할 수 있도록 설정하고자 할때
5.1. 기본설정
웹브라우져나 TortoiseSVN Project Monitor상에서 Subversion에 간편하게 접속할 수 있도록 아래와 같이 아파치 환경설정을 한다.
이로 인해 웹브라우져 상에서
http://172.30.1.100/svn/qa 등으로 접근이 가능하게된다.
여기서 URL에 svn이 등장하게 된 것은 아래와 같은 환경설정 파일 내용 때문이다.

pi@raspberrypi ~ $ sudo vi /etc/apache2/mods-available/dav_svn.conf 를 열어서 아래와 같은 부분을 바꿔주되 아랫줄에 다음과 같이 같은 내용을 추가한다.

<Location /svn>
  DAV svn
|
  SVNParentPath /home/pi/repos
|
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd
|
  <Limit GET PROPFIND OPTIONS REPORT>
   Require valid-user
  </Limit>
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
</Location>

위와 같이 설정하면 읽기/쓰기 모두 로그인을 해야 접근할 수 있다.

5.2. 웹브라우져를 위한 폴더 접근권한 부여 및 아파치 재시작
pi@raspberrypi ~ $ sudo chown -R www-data:www-data /home/pi/repos
pi@raspberrypi ~ $ sudo /etc/init.d/apache2 restart

5.3. 웹브라우져를 통한 접근권한 부여를 위해 아래와 같이 계정을 생성한다.
pi@raspberrypi ~ $ sudo htpassword -c /etc/apache2/dav_svn.passwd mysvnid
mysvnid  부분엔 실제로 본인이 사용할 ID를 넣어준다.

ID를 처음 생성하는 때에만 -c 옵션을 붙여주며 비밀번호를 변경코자 하는 경우
pi@raspberrypi ~ $ sudo htpasswd -m /etc/apache2/dav_svn.passwd id

6.  Subversion 데몬 관리하기
SVN 서버를 데몬형태로 띄워 사용한다. (-r 옵션은 서비스될 SVN 저장소를 지정한다.)
$sudo svnserve -d -r /home/pi/repos

프로세스 확인하기
pi@raspberrypi ~ $ ps -ef | grep svnserve
root      3560     1  0 22:15 ?        00:00:00 svnserve -d -r /home/pi/repos

Listen Port 확인
pi@raspberrypi ~ $ netstat -anpt |grep 3690
tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN      -
위와 같이 나온다면 잘 운영중인 것이다.

매 부팅시마다 자동으로 데몬이 올라오게 하고 싶다면 /etc/rc.local를 열어 fi아래에 다음 한줄을 추가 한다.
pi@raspberrypi ~ $ sudo vi /etc/rc.local
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
  sudo svnserve -d -r /home/pi/repos

7. PC상에서 TortoiseSVN 사용법
7.1. PC기반 소스관리 클라이언트 툴 PC TortoiseSVN 설치
다운로드 사이트: http://tortoisesvn.net/downloads.html
파일을 다운로딩 후 더블클릭하면 다음과 같은 설치과정을 밟는다. TortoiseSVN의 설치과정은 그리 어렵지 않다. 그냥 화면에 나오는 데로 쭉쭉 진행하기만 하면 된다

7.2. 소스등록
자신의 로컬 컴퓨터에 저장되어 있는 프로젝트 소스를 소스저장소(Repository)에 처음 등록하는 절차는 TortoiseSVN에서는 소스를 저장소에 등록하는 것을 Import라고 부른다.
먼저 탐색기에서 소스가 저장되어 있는 폴더를 선택하고 오른쪽 마우스 버튼을 누르면 나타나는 컨텍스트 메뉴에서 [TortoiseSVN] -> [Import] 메뉴를 선택한다 그럼 Import창이 나타나고 여기에서 "URL of repository"에 소스저장소 주소와 프로젝트 이름, 그리고

소스트리명을 입력하고 "Import Message"란에는 소스에 대한 설명이나 코멘트를 입력한 후에 "OK" 버튼을 누른다.
그러면 다음에는 인증을 위한 아이디와 패스워드를 묻는 창이 나타난다.
10단계 때 등록한 계정과 암호를 입력하고 "OK" 버튼을 누른다.

그러면 다음과 같이 소스저장소에 소스들이 등록되었음을 알리는 결과창이 나타난다.
아래와 같이 소스가 담겨질 폴더(app)를 미리 만들어 두어야한다.
bin, my_projects, obj 등은 SVN에 포함시키지 않는다. 그 이유는 개발을 위해 보조적으로 사용되는 파일 들로 변경이 가해진다 하더라도 개발에 영향을 주지 않기 때문이다.

7.3. Check-out
실제 소스에 대한 수정이나 유지보수 작업을 하려면 처음에 소스저장소에서 소스를 내려 받아야 한다. 이를 check-out이라고 한다. 소스저장소에서 소스를 check-out하려면 탐색기에서, 혹은 소스를 내려 받고자 하는 폴더에서 마우스 오른쪽 버튼을 눌러 나타나는 컨텍스트 메뉴에서 [SVN Checkout...]을 선택한다.

check-out 대화상자가 나타나면 "URL of repository"에 소스저장소 주소와 프로젝트명, 내려 받고자 하는 소스트리명을 입력하고 "Checkout directory"에는 자신의 로컬 컴퓨터에 소스를 내려 고자 하는 폴더명을 입력하고 "OK"버튼을 누른다.
그러면 다음과 같이 소스가 check-out되는 결과를 확인할 수 있다.

7.4. Commit
check-out 받은 소스를 수정했거나 기능을 첨가했다면 소스저장소에 저장되어 있는 소스에 반영을 해야 한다. 이를 commit이라고 부른다. 소스를 커밋하려면 check-out받은 소스 폴더를 선택하고 마우스 오른쪽 버튼을 누르면 나타나는 컨텍스트 메뉴에서 [SVN Commit...]을 선택한다.

변경이 발생된 폴더가 적색으로 보인다.
커밋을 할 app 폳더 하위에 변경이 있음을 알 수 있다.

그러면 다음과 같은 커밋 대화창이 나타난다.

여기서 상단의 "Message" 입력박스는 변경사항에 대한 코멘트를 입력하는 곳이고 하단의 "Changes made"는 변경된 파일들을 나타내준다. 소스의 변경내용을 확인하고 싶다면 "Changes made"에 표시해주는 파일명을 더블클릭하면 다음과 같이 diff내용을 보여준다.
"OK" 버튼을 누르면 인증과정을 거친 후에 다음과 같이 소스저장소에 변경내용이 반영되는 모습을 볼 수 있다.

7.5. 소스변경내역 확인
전체 소스의 변경이력을 확인하려면 소스의 프로젝트 폴더를 선택하고, 만약 개별 파일에 대한 이력을 확인하고 싶다면 해당 파일을 선택하여 마우스 오늘쪽 버튼을 누르면 컨텍스트 메뉴가 나타난다. 이때 [TortoiseSVN] -> [Show log]를 클릭한다.
그럼 다음과 같이 로그창이 뜨면서 그동안 변경된 이력이 나타난다. 맨 위의 상단이 그동안 변경된 이력을 나타나며, 2번째 박스는 커맨트를, 3번째 박스는 해당 변경이력에서 실제로 변경된 파일명을 보여준다. 여기서 파일명을 선택하고 더블클릭하면 변경된 내용이 diff로 출력된다.

7.6. 배포작업
개발작업이 일단락 된다면 배포를 진행한다.
이는 개발작업과는 별도로 운영 내지는 사용을 위한 배포버젼을 만들어 사용함을 의미 한다.
ex)
(원본) 개발이 일단락된 소스 :
svn://172.30.1.100/STM32F103_MYTFT-LCD/trunk/src
(배포) 원본소스의 배포 버전 :
svn://172.30.1.100/STM32F103_MYTFT-LCD/release/R20180105B_Revision13/src

탐색기에서 TortoisSVN > Repo-browser > Copy to...;.를 실행한다.

릴리즈 버전은 release/Ryyyymmdd#_RevisionXX/src 등으로 경로를 지정한다.
이때 맨 끝에 src 등 디렉토리 이름을 정확히 지정해 주어야 한다.

운영자(사용자)는 이 버젼을 내려 받아 실제 사용한다.

7.7 소스전달
개발작업의 결과물을 다른 곳에 전달하거나 판매하는 경우에는 로그 등을 제거한 상태로 전달함이 바람직하다. 이때는 Export기능을 활용한다.

8. subversion 백업방법
8.1. 레파지토리를 백업하기
레파지토리를 통째로 백업하고 싶다면 다음과 같이 한다.
pi@raspberrypi ~ $ cd /home/pi
pi@raspberrypi ~ $ sudo tar -cvzf repos.tar.gz repos

만일 특정 프로젝트만 백업하고 싶다면
pi@raspberrypi ~ $ cd /home/pi/repos
pi@raspberrypi ~ $ sudo tar -cvzf prj_helloworld.tar.gz prj_helloworld

8.2. 백업을 복원하기
pi@raspberrypi ~ $ cd /home/pi
pi@raspberrypi ~ $ sudo tar -xvzf repos.tar.gz

< 글쓴이 :  금강초롱(blog.naver.com/crucian2k3) >

자료참고
1. http://guzene.tistory.com/233
2. http://powerkkim.tistory.com

cnfcj : m.blog.naver.com/PostView.nhn?blogId=crucian2k3&logNo=221178780548&proxyReferer=https:%2F%2Fwww.google.com%2F