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 패키지 만들기
테스트 애플리케이션
package main import ( "fmt" "net/http" "time" ) func date(w http.ResponseWriter, r *http.Request) { t := time.Now() fmt.Fprintf(w, t.Format(time.RFC3339)) } func main() { http.HandleFunc("/time", date) http.ListenAndServe("localhost:8082", nil) }/home/workspace/mydata ├── dist │ └── mydate ├── Makefile └── mydate.go애플리케이션 구성
/ ├── etc │ └── init.d └── opt └── joinc ├── bin └── conf패키징을 위한 디렉토리 생성
control 파일 만들기
.deb 패키지 생성
# dpkg -I mydate.deb new debian package, version 2.0. size 1655280 bytes: control archive=344 bytes. 313 bytes, 13 lines control Package: mydate Version: 1.0.3 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 1.0.1 : message #1 1.0.2 : message #2 1.0.3 : message #3.deb 패키지 설치및 삭제
원격 apt 패키지 저장소 만들기
웹 서버 설치 및 패키지 디렉토리 생성
apt 저장소 업데이트
apt-get을 이용해서 패키지 인스톨 하기
control 파일 관리
- 패키지의 버전을 관리 해야 한다. control 파일의 Version 필드를 수작업으로 변경 할 수는 없는 노릇이다.
- description에 있는 메시지도 자동으로 관리해야 한다. git의 가장 최근 로그를 남기겨야 할 테다.
등의 작업을 해야 한다.버전과 로그 관리
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 파일을 만든다.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}}젠킨스와의 통합
chef와의 통합
Recent Posts
Archive Posts
Tags