Package 이름은 mydate이고, 버전은 1.0.3이며 amd64 아키텍처에서 작동하는 프로그램이라는 걸 지시하고 있다. Description에는 애플리케이션의 설명과 최근 변경 정보를 설정했다.
이제 배포할 파일들을 dist/mydate 밑에 있는 각 디렉토리에 복사하자.
# dpkg -r mydate
(데이터베이스 읽는중 ...현재 290773개의 파일과 디렉터리가 설치되어 있습니다.)
Removing mydate (1.0.3) ...
Processing triggers for systemd (225-1ubuntu9.1) ...
Processing triggers for ureadahead (0.100.0-19) ...
원격 apt 패키지 저장소 만들기
격에 패키지 저장소를 만들기로 했다. 구축이 된다면, apt-get명령을 이용해서 패키지의 설치, 업그레이드, 삭제등을 수행 할 수 있다. 특히 Chef등의 프로비저닝 툴과 통합하면 높은 완성도의 애플리케이션 관리 시스템을 구축할 수 있다.
패키지 저장소의 IP 주소는 192.168.56.5다.
인스턴스를 하나 만든 다음 apt-get을 이용해서 mydate 패키지를 설치해보자. /etc/apt/sources.list에 저장소를 추가하고 update 한다.
# cat /etc/apt/sources.list
deb http://192.168.56.1/joinc/ stable/
# apt-get update
apt-cache로 패키지를 확인 할 수 있다.
# apt-cache search mydate
mydate - mydate web api server
install 명령으로 패키지를 설치할 수 있다.
# apt-get install mydate
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
다음 패키지를 더 설치할 것입니다:
libsqlite3-dev
제안하는 패키지:
sqlite3-doc
다음 새 패키지를 설치할 것입니다:
libsqlite3-dev mydate
0개 업그레이드, 2개 새로 설치, 0개 제거 및 85개 업그레이드 안 함.
2,143 k바이트 아카이브를 받아야 합니다.
이 작업 후 1,616 k바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까? [Y/n] Y
경고: 다음 패키지를 인증할 수 없습니다!
mydate
확인하지 않고 패키지를 설치하시겠습니까? [y/N]
control 파일 관리
control 파일로 부터 deb파일을 만들고 apt 저장소에 올리는 방법까지 살펴봤다. 하지만 실제 프로젝트에서 사용하려면 control 파일을 자동으로 관리 할 수 있어야 한다. 즉
패키지의 버전을 관리 해야 한다. control 파일의 Version 필드를 수작업으로 변경 할 수는 없는 노릇이다.
description에 있는 메시지도 자동으로 관리해야 한다. git의 가장 최근 로그를 남기겨야 할 테다.
등의 작업을 해야 한다.
버전과 로그 관리
git 버전과 연동하면 된다.
tag 명령을 이용해서, 현재 코드에 버전을 붙인다.
# git tag -a 1.0 -m "function a edit"
# git push
이제 코드를 commit 할 때마다 버전정보가 갱신이 된다. 현재 버전 정보는 git describe --tags 로 읽을 수 있다.
# git describe --tags
1.0-1-gdf2d7ed
이렇게 읽어온 버전 정보로 control 파일을 만들면 된다.
로그도 git 명령으로 읽어올 수 있다.
control 파일을 만들고, control 파일로 부터 deb를 만드는 등의 작업은 Makefile로 자동화 할 수 있다. 대략 아래와 같은 느낌이 될 거다.
# cat Makefile
default: build
# 버전 정보를 읽어온다.
Version=$(shell git describe --tags)
devDir=/var/www/html/joinc/stable
releaseDir=/var/www/html/joinc/devel
build:
go build -ldflags "-X main.Version=$(Version)"
deb:
# build를 끝낸 실행파일과 설정파일 등을 배포 디렉토리로 복사한다.
# control 템플릿 파일로 부터 DEBIAN/control 파일을 만든다.
# dpkg -b 로 deb 패키지를 만든다.
# deb 패키지를 devel 디렉토리로 복사한다.
# dpkg-scanpackages으로 Packages 파일을 만든다.
release:
# 최신 버전의 deb 패키지를 stable 디렉토리로 복사한다.
# dpkg-scanpackages으로 Packages 파일을 만든다.
control 템플릿 파일은 아래와 비슷할 것이다. go에서 제공하는 템플릿을 기준으로 만들었다.
Package: mydate
Version: {{.Version}}
Section: devel
Priority: optional
Architecture: amd64
Depends: cmake, sqlite3
Recommends: libsqlite3-dev
Maintainer: yundream <yundream@gmail.com>
Homepage: http://www.joinc.co.kr
Description: mydate web api server
{{.Log}}
나는 git 레포지토리 정보를 읽어서 Version과 Log를 가져와서 템플릿파일로 부터 control을 만드는 간단한 프로그램을 만들었다. 이제 Jenkins와 같은 CI 툴과 연동하면, 완전한 배포 시스템을 만들 수 있다.
젠킨스와의 통합
Makefile까지 만들었다면 간단하게 젠킨스와 통합할 수 있다. 나는 아래와 같이 빌드환경을 구성했다.
build 와 deb 룰만을 수행하기 위한 작업과 release룰을 수행하기 위한 작업을 분리한다.
처음에는 build & deb룰을 수행하고, 이 결과는 devel 레포지토리에 올라간다.
개발및 테스트 과정에서는 devel에 있는 패키지를 install 해서 테스트를 진행한다.
테스트가 끝나면 release작업을 수행한다. release 작업의 경우 새로 빌드 할 필요 없이 가장 최신의 deb 파일을 stable로 복사하면 된다.
chef와의 통합
dev는 192.168.56.5/devel, stable는 192.168.56.5/stable 를 레포지토리로 등록해야 한다. 인스턴스들은 자신이 어느 단계(dev, op)에 있는지 알수 있어야 한다. /etc/hostname으로 위치를 알 수 있도록 설정했다. 즉 dev.webserver.joinc.priv, op.webserver.joinc.priv와 같이 호스트 이름을 설정했다. 인스턴스가 chef client를 실행하면 호스트이름으로 부터 자신의 단계를 읽어오고, 이 정보를 기준으로 레포지토리 정보를 설정하게 했다. 이 과정을 완전히 이해하려면 Chef를 알아야 한다. 시간이 되면 chef는 따로 다루도록 하겠다.
Contents
Ubuntu 패키지 저장소 만들기
deb 패키지 만들기
테스트 애플리케이션
애플리케이션 구성
패키징을 위한 디렉토리 생성
control 파일 만들기
.deb 패키지 생성
.deb 패키지 설치및 삭제
원격 apt 패키지 저장소 만들기
웹 서버 설치 및 패키지 디렉토리 생성
apt 저장소 업데이트
apt-get을 이용해서 패키지 인스톨 하기
control 파일 관리
버전과 로그 관리
Makefile
젠킨스와의 통합
chef와의 통합
Recent Posts
Archive Posts
Tags