Django 어플리케이션을 Apache 서버에서 구동 시키기 위해 Debian 패키지를 만드는 방법입니다. 


이 글에서는 바이너리 패키지를 만드는 방법에 대한 설명만 하도록 하겠습니다. 


deb 패키징을 하려는 어플리케이션이  /home/USERNAME/Workspace/myapp 폴더라고 가정하고 진행하겠습니다.  (django 어플리케이션을 패키징 하는 것이므로 settings.py나 manage.py와 같은 파일들이 들어 있을 겁니다. ) 

myapp 이란 django 어플리케이션을 djangoapp이란 이름이로 패키지를 하는 절차입니다. 


작업을 진행하기 앞서 패키징을 진행할 위치에서 필요한 폴더를 만들고 작업하려는 파일들을 복사해 주어야 합니다. 

$ mkdir ./debian

$ mkdir -p ./debian/usr/share

$ mkdir -p ./debian/etc/init.d

$ mkdir -p ./debian/usr/share/doc/djangoapp

$ cp -r /home/USERNAME/Workspace/myapp ./debian/usr/share/


그 다음 패키징과 관련된 파일들을 넣어줄 'DEBIAN' 폴더도 만들어 줍시다. 


$ mkdir ./debian/DEBIAN



추천은 저를 춤추게 합니다 ^^



DEBIAN 폴더


이 폴더는 아래 파일들을 포함하고 있어야 합니다. 

  • control
  • config
  • conffiles
  • templates
  • postinst
  • postrm
  • preinst
  • prerm

각 파일들을 어떻게 작성해야 하는지 차례대로 알아봅시다. 


control 

이 파일은 패키징에 매우 중요한 파일입니다. 패키지에 대한 정보와 디펜던시(dependency)정보 등을 기술해줍니다. 우리는 바이너리(binary)패키지만 할 것이므로 아래와 같이만 기술해주면 됩니다. 


디펜던시(depends)에 이 패키지를 실행하기 위해 필요한 패키지 들을 나열해 주면 됩니다. 


config

패키지를 설치하기 전에 입력받아야 할 값이 있다면 이 파일에서 질문을 지정해주면 됩니다. 예를 들어 이름을 묻고 싶다면 아래와 같이 작성하세요. 


이 파일에는 질문에 대한 내용이 안보이죠? 그 내용은 아래 나오는 'templates'파일에서 기술하면 됩니다. 


templates

질문을 입력받기 위한 내용입니다. 일반적인 경우 입력 받을 일이 없으니 참고만 하세요. 


conffiles 

이 파일에는 패키지를 설치 할 때 일반적으로 '/etc' 하위 폴더에 넣어 줄 설정 파일과 관련된 정보를 기술해 줍니다. 우리는 django(장고) 시작 스크립트(script)apache(아파치) 설정 파일에 대한 정보를 입력해 주면 됩니다. 


아파치 설정 파일은 아파치 버전에 따라 다르겠지만,  버전 2.2.22 를 사용중인 저의 경우 'site-available'에 설정 파일을 넣어주고 'enable'시켜주는 방식이라 저 폴더에 넣어줬습니다. 


preinst

파일 이름에서 느낄 수 있는 것 처럼 설지를 진행하기 이전에 수행할 작업을 기술해 주는 파일 입니다. 


혹시나 이미 설치가 되어있어서 동작 중이었다면 동작을 중단 하도록 해줬습니다. 


postinst 

이 파일은 패키지를 압축을 푼 다음에 수행할 작업을 기술해 주는 파일입니다. 


설치시에 입력받았던 이름을 사용해서 무언가를 할 수 도 있습니다. 

그 외에도 필요한 폴더를 생성한다거나 다른 명령을 실행 하도록 지정 하는것도 가능합니다. 

( 'a2ensite'는 아파치의 'sites-available' 폴더에 넣어주었던 파일을 사용하도록 지정해 주는 명령어입니다.)


설치가 성공했다면 서비스를 시작하도록 해줍시다. 


prerm

이 패키지를 제거하는 명령어를 실행 했을 때 설치된 패키지를 제거하기 전에 수행할 작업을 기술해 주는 파일입니다. 


postrm

이 패키지를 제거하는 명령어를 실행 했을 때 설치된 패키지를 제거한 다음에 수행할 작업을 기술해 주는 파일입니다. 


여기까지가 'debian/DEBIAN'폴더에 넣어주어야 하는 파일들입니다. 



웹 서버(아파치) 설정

위에서 아파치 폴더의 'sites-available' 폴더에 넣어줬던 파일에 대한 설명입니다. 


호스트 이름, 포트 명과 같은 서버 설정 정보와 'root'폴더를 지정해줍니다. 

그 아래 정보들은 django(장고)를 apache(아파치)에서 구동되도록 하기 위한 설정 들입니다. 참고만 하세요. 



Django(장고) init.d 스크립트 

시작 스크립트는 './debian/etc/init.d' 폴더에 넣어주면 됩니다. 


저는 웹 페이지 경로를 '/var/www/' 로 지정해 주었습니다. 이를 위해서 '/usr/share/myapp' 폴더의 링크를 '/var/www/djangoapp/myapp'에 만들어 주어야 합니다. 

위의 'DEBIAN/postinst' 에 예제로 적어놓은것 처럼 'postinst'에 지정해 주셔도 됩니다. 



Debian doc 파일들 

해당 패키지에 대한 문서 파일들을 작성해 주어야 합니다. 


changelog (changelog.Debian) 

changelog는 2개의 파일이 필요하지만 초기 설치이므로 같은 내용으로 작성해줍시다. 


이 파일은 은근 문법을 따집니다. 빈 줄을 제거하지 마시고 잘 넣어보시고 그래도 잘 되지 않는다면 changelog 문서를 참고하세요. 

작성한 파일은 './debian/usr/share/doc/djangoapp/'폴더로 복사한 다음 'gz'파일로 압축해 줍니다. 


$ cp changelog changelog.Debian ./debian/usr/share/doc/djangoapp/

$ gzip --best ./debian/usr/share/doc/djangoapp/changelog


copyright

copyright정보를 기술해 주는 파일입니다. 


이 파일도 changelog와 동일하게 복사하고 'gz'파일로 만들어 줍니다. 


$ cp copyright ./debian/usr/share/doc/djangoapp/

$ gzip --best ./debian/usr/share/doc/djangoapp/changelog.Debian



패키지 빌드 실행 


debian은 파일의 권한(permission)을 755(-rwxr-xr-x)나 644(-rw-r--r--)로 할 것을 권장합니다. 

파일의 권한을 목적에 맞게 지정해 줍시다. 


$ find ./debian -type d | xargs chmod 755


이런 식으로 chmod 명령으로 파일 권한을 주시면 됩니다. 


준비를 다 했다면 패키지 빌드를 수행해 봅시다. 


$ fakeroot dpkg-deb --build debian

$ mv debian.deb djangoApp_1.0-1.deb

$ lintian djangoApp_1.0-1.deb


dpkg-deb 명령으로 빌드를 수행하고, 그 결과 생성된 파일을 원하는 이름으로 수정 한 다음 lintian명령으로 패키지에 문제가 없는지 검사하는 순서로 진행하시면 됩니다. 

lintian명령 수행 결과 맨 앞에 'W'로 표시된 'Warning'은 수정하는게 좋지만 수정하지 않아도 배포는 가능하고, 'E'로 표시되는 'Error'는 모두 수정하셔야만 됩니다. 

'Error'가 없다면 deb파일을 배포할 준비가 완료 된겁니다. 


참고한 글 

Posted by KT한
,


RPM (Red Hat Package Manager)은 리눅스에 사용되는 가장 일반적인 소프트웨어 패키지 방법입니다. 

Debian에서 사용하는 deb방식도 있지만 일반적으로 rpm으로 패키징 되어 배포되고 있습니다. 


rpm을 만드는 내용은 .spec 파일에 정의해 주면 됩니다. 

spec파일은 vim 에디터로 name.spec 과 같이 임의의 파일을 생성하면 자동으로 기본 탬플릿을 채워줍니다. 




rpmbuild 명령어로 spec파일을 인자로 주어 실행하게 되면 패키징을 수행합니다. 


$ rpmbuild -bb name.spec


spec파일에는 수행해야할 명령들이 정의해줘야 합니다. (위에 접혀 있는 'spec 파일 탬플릿 열기'를 펼쳐 보세요.)




spec 파일의 각 파트별 역할에 대해 알아봅시다. 


Preamble(서문)


● Source


RPM을 만들기 위해 사용할 압축 파일(.tar.gz) 지정 해 줄 수 있습니다. 

Source 뒤에 숫자를 붙여 여러 소스파일을 지정 해 줄 수 있습니다. 숫자는 '0' 부터 시작해야 합니다. 


Source0: myrpm.tar.gz



● Requires


이 rpm이 built(설치)되기 이전에 설치 되어 있어야 할 rpm을 지정해줄 수 있습니다. 

기본적으로 이름만 써도 되지만, 버전을 체크 하도록 할 수 있습니다. 

비교 연산자는 ( <, >, =, >=,  <=) 를 지원합니다. 

Requires: gcc >= 4.4.4 


만약 64bit 머신에 32bit rpm을 설치해야 할 일이 있는경우 해당 정보를 지정해 주어야 합니다. 

아래 처럼 괄호안에 지정해 주면 됩니다. 


Requires: libedit(x86-32)

 

 

● BuildRequires 

이 rpm을 build 하기 위해 필요한 rpm을 지정해 줄 수 있습니다.  

빌드에 필요한 rpm이므로 주로 devel 패키지가 될 겁니다. 


BuildRequires: libpcap-devel




- Scriptlets 


실제로 수행할 명령을 지정해주는 섹션으로 bash shell 명령어를 지원합니다. 



● %prep 

Source0에서 지정한 파일을 빌드를 하기 위해 필요한 일들을 지정해 줍니다. 압축을 푸는 작업이 주된 작업이 됩니다.  


-q 옵션을 사용하면 압축을 푸는 과정을 보여주지 않습니다. 진행 과정을 감춘다고 생각하면 됩니다. 

-n 옵션으로는 이름을 지정해 줄 수 있습니다. 


%prep

%setup -q -n myrpm 



● %build

'%prep' 다음에 수행되며, 압축을 푼 소스를 가지고 빌드를 수행합니다. 


주로 './configure'를 실행하여 'Makefile'을 생성하고, 'make'를 수행하여 빌드를 수행합니다. 



● %install

'%build' 다음에 수행되며, 빌드 수행결과 생성된 파일들을 설치 폴더로 복사하는 역할을 수행합니다. 


주로, 'make install'을 수행해서 실행 파일들을 '~/rpmbuild/BUILDROOT' 폴더 아래로 넣는 작업을 수행합니다. 

물론, Makefile에 make install시 수행할 동작에 대해 미리 정의해 주어야 합니다. 

일반적으로 빌드를 통해 생성된 실행 파일을 특정 경로에 넣어주는 작업을 설정해주게 됩니다. 


아래는 'mybin' 이란 파일을 지정한 경로에 설치 하기 위한 Makefile 예제입니다. 


Makefile

install:

test  -z  "$(INSTALLDIR)/"  ||  mkdir  -p  "$(INSTALLDIR)"

install  -m  644  mybin  $(INSTALLDIR)/



물론, Makefile에는 값에 대한 정의가 되어 있어야 겠죠. 


Makefile

INSTALLDIR=$(shell pwd)/myinstall



만약 path를 Makefile에 넘겨줘야 할 상황이 발생하게 되면 아래와 같은 방식으로 지정해 줄 수 있습니다. 


.spec 

%install

make INSTALLDIR=$RPM_BUILD_ROOT install



● %check 


'%install' 다음에 수행되며, 설치 이후에 테스트 케이스 검증같은 작업을 위해 사용합니다. TDD기반의 프로젝트라면 이 위치에 테스트를 수행하도록 설정해주면 됩니다. 



● %clean


빌드 마지막에 수행합니다. 빌드 과정에서 생긴 파일들을 지우도록 설정 할 수 있으며, 주로 설치 폴더를 삭제하도록 설정해줍니다. 

spec파일 기본 탬플릿에 있는 내용을 그대로 사용하시면 됩니다. 



● %files 


rpm 파일에 묶여야(패키징) 하는 파일의 이름을 지정해주게 됩니다. 물론, 폴더 이름을 지정 해주는 것도 가능한데, 하위 폴더를 포함 한 모든 파일을 모두 묶는 의미로 사용됩니다. 

여기서 지정한 파일만 rpm 파일에 묶이게 된다고 생각하면 됩니다. 


파일 리스트를 파일로 입력 받는것도 가능합니다. 


%files -f myfile.list 



패키징 될 파일의 경로(path)정보는 Makefile에서 사용한 값을 사용하게 됩니다. 

다시 말해서.. Makefile에서 install 한 경로 정보와 동일한 값으로 spec 파일에 지정해 주어야 하는 것입니다. 


물론, automake와 같은 툴을 사용한다면 크게 신경쓰지 않아도 되는 부분이기는 하나, Makefile을 직접 만들었다면 절대 경로가 아닌 상대 경로에 설치 하도록 해주어야만 rpmbuild 수행 시 ~/rpmbuild/BUILDROOT/ 아래 설치 하는게 성공 할 수 있습니다. 



파일 리스트 앞에는 Prefix가 붙을 수 있으며, 각각의 의미는 다음과 같습니다. 


◆  [기본] - 아무런 Prefix가 없음 

데이터 파일이라고 생각해서 항상 엎어쓰고 rpm 삭제시에는 제거해줍니다. 혹시 기존에 설치 되었던 파일을 수정했었다 하더라도 신경쓰지 않습니다. 


◆  %config

기존에 설치 된 파일이 수정되었다면 기존 파일을 '.rpmsave' 확장자를 붙여서 백업해놓고 새로운 파일을 설치합니다. 설치 이후에 파일이 수정되었다면 변경된 설정 값을 지우지 않고 백업해 준다는 의미입니다. 


◆  %config(noreplace)

기존에 설치 된 파일이 수정되었다면 기존 파일을 유지하고, 새로 설치될 파일을'.rpmsave' 확장자를 붙여서 설치합니다. 설치 이후에 파일이 수정되었다면 수정된 설정 값을 유지 시키기 위해 사용합니다. 


 옵션 이름

RPM에 포함된 파일 수정?

설치된 파일 편집 안됨 

설치된 파일 편집 됨 

 [기본]

No 

RPM으로 부터 설치 

RPM으로 부터 설치 

 Yes

RPM으로 부터 설치 

RPM으로 부터 설치 

%config 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

RPM으로 부터 설치 기존 파일은 .rpmsave로 이름수정 

%config(noreplace) 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

기존 파일 유지. RPM에서 받아온 파일은 .rpmnew로 저장. 



◆  %attr 

설치된 rpm 권한과 소유권을 지정해 줄 수 있습니다. 


%attr (<mode>, <user>, <group>) filename 


예) %attr (600, root, -) /etc/mybin



◆  %defattr 

기본 권한 값을 설정 해 줄 수 있습니다. 


%deattr(<file mode>, <user>, <group>, <dir mode>)


예) %defattr(644, root, root, -)



◆  %dir

패키지에 포함시킬 폴더를 지정해줘서 생성하도록 합니다. 주로 특정 위치에 빈 폴더를 생성 시키기 위해 사용합니다. 




● %package


서브-패키지를 생성하기 위해 사용합니다. 이름은 당연히 'Name' 필드에 지정해준 이름을 사용하며 여기서 지정해준 이름을 이어서 패키지 이름을 지어주게 됩니다. 


Name은 'foo' 이고 '%package bar' 라고 지정하게 된다면 'foo-bar.rpm' 이란 이름의 rpm 파일이 생성될겁니다. (물론 뒤에 버전 정보 같은것도 들어가겠죠.) 


release 번호는 메인-패키지와 별도로 지정이 가능합니다. 



%if - %else - %endif

빌드 환경을 체크해서 환경에 따라 다르게 동작하게 할 수 있습니다. 


%if 의 종류는... 

아키텍쳐(architecture)를 검사하는 %ifarch 와 %ifnarch가 있습니다.  (i386, alpha, sparc, etc.. )

운영체제(operating system)을 검사하는 %ifos 와 %ifnos가 있습니다.  (linux, etc... )


%else와 %endif는 %if와 짝으로 사용하면 됩니다. 이름만으로 어떻게 동작하시는지 아실겁니다. 


%ifarch i386

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS -I ."

%else

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%endif




● %post


 rpm 설치 이후에 뭔가 추가 작업을 해줘야 할때 사용합니다. 

예를 들면.. 설정 파일에서 값을 변경하거나.. chkconfig 와 같은 작업 지정이 가능합니다. 





※ 참고로 rpmbuild시 path 정보는 rpmmacros 파일에 정의해주면 됩니다. 


$ vi ~/.rpmmacros


%_topdir /home/kyungtae/rpmdir

%_builddir %{_topdir}/BUILD

%_rpmdir %{_topdir}/RPMS

%_sourcedir %{_topdir}/SOURCES

%_specdir %{_topdir}/SPECS

%_srcrpmdir %{_topdir}/SRPMS


물론, BUILD, RPMS, SOURCES, SPECS, SRPMS 폴더는 미리 만들어 줘야 합니다. 



참고 링크 : 

http://www.rpm.org/max-rpm-snapshot/ch-rpm-specref.html


Posted by KT한
,