본문 바로가기

Operating Systems/Linux

[ Linux ] RPM 패키지 생성

[ 클라이언트 ]

echo Input Your Name : 
NAME=hmwoo # read NAME

echo Input Your Email : 
EMAIL=hmwoo@hmwoo.com # read EMAIL

echo Input Your Build File Name : 
FILE_NAME=hello # read FILE_NAME

echo Input Your Build File Version : 
FILE_VERSION=1.0.0 # read FILE_VERSION

# rpm 파일 빌드 툴 설치
yum -y install rpm-build rpm-sign

# 기본적으로 실행중인 rngd 종료
kill -9 `ps -ef | grep rngd | grep -v grep | awk '{print $2}'`

# 기본적으로 실행 중인 gpg 생성 툴 종료
kill -9 `ps -ef | grep gpg-agent | grep -v grep | awk '{print $2}'`

# gpg key를 랜덤으로 만들어주는 rngd 실행
# r : 난수를 전달받는 장치 지정
rngd -r /dev/urandom

# gpg 생성 툴 실행
gpg-agent --use-standard-socket --daemon

# gpg 가 관리하는 개인키 모두 제거(gpg를 처음 사용할 경우 실행)
gpg --fingerprint --with-colons | grep "^fpr" | sed -n 's/^fpr:::::::::\([[:alnum:]]\+\):/\1/p' |  xargs gpg --batch --delete-secret-keys

# gpg 가 관리하는 공개키 모두 제거(gpg를 처음 사용할 경우 실행)
gpg --fingerprint --with-colons | grep "^fpr" | sed -n 's/^fpr:::::::::\([[:alnum:]]\+\):/\1/p' | xargs gpg --batch --delete-keys

# gpg 개인키 생성
# Expire Date: 0으로하면 영구사용
# --batch  : 대화식(사용자가 입력하여 선택) 이 아닌 비대화식으로 실행
# --no-tty : batch와 함께 사용하는 명령어(오류 발생시에도 비대화식으로 실행)
cat <<EOF | gpg2 --batch --no-tty --gen-key
%echo Generating a standard key
Key-Type: default
Key-Length: 2048
Subkey-Type: default
Subkey-Length: 2048
Name-Real: ${NAME}
Name-Email: ${EMAIL}
Expire-Date: 0
Passphrase: P@ssw0rd!
%commit
%echo done
EOF

# gpg key 저장
GPG_KEY=`gpg --fingerprint ${NAME} | grep ^pub | awk '{print $2}' | awk -F "/" '{print $2}'`

# gpg 공개키 키 파일 추출
gpg -a --yes -o /root/RPM-GPG-KEY --export ${GPG_KEY}

# rpm 빌드 시 gpg key 참조 정보 저장
echo '%_gpg_name '${GPG_KEY} > /root/.rpmmacros

mkdir -p /app/script && cd /app/script

# 패키지 폴더 생성 (패키지명 - 버전) 형태로 생성
mkdir -p /app/script/${FILE_NAME}-${FILE_VERSION}

# 패키지 생성
cat <<EOF > /app/script/${FILE_NAME}-${FILE_VERSION}/${FILE_NAME}
#!/bin/bash
echo world
EOF

# 패키지 압축 (폴더를 명시하여 압축하여 폴더까지 압축)
cd /app/script && tar czvf ${FILE_NAME}-${FILE_VERSION}.tar.gz ${FILE_NAME}-${FILE_VERSION}/

# SPEC 파일 생성 ( rpm 생성을 위한 레시피 파일)
# mktemp는 tmp파일을 랜덤한 이름으로 생성하는 명령어
# u옵션을 주어서 생성은 하지 않고 랜덤으로 생성된 이름만 출력
# d옵션으로 디렉토리도 생성하도록 한다
cat <<SPEC_FILE > /app/script/${FILE_NAME}.spec
Name:           ${FILE_NAME}
Version:        ${FILE_VERSION}
Release:        1%{?dist}
Summary:        A ${FILE_NAME} package
 
Group:          Testing
License:        GPL
URL:            http://www.hmwoo.com/testing
Source0:        %{name}-%{version}.tar.gz
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires:  /bin/rm, /bin/mkdir, /bin/cp
Requires:       /bin/bash
 
%description
 A ${FILE_NAME} package
 
%prep
%setup -q

%build

#configure
#make %{?_smp_mflags}

%install
rm -rf \$RPM_BUILD_ROOT
#make install DESTDIR=\$RPM_BUILD_ROOT
mkdir -p \$RPM_BUILD_ROOT/usr/local/bin
cp ${FILE_NAME} \$RPM_BUILD_ROOT/usr/local/bin

%clean
rm -rf \$RPM_BUILD_ROOT
 
%files
%defattr(-,root,root,-)
#%doc
 
%attr(0755,root,root)/usr/local/bin/${FILE_NAME}
 
%changelog
* Sat May 17 2014 hmwoo <hmwoo@hmwoo.com> - ${FILE_VERSION}
- Initial RPM
SPEC_FILE

# 빌드를 위한 폴더 구조 생성(No such file or directory 에러는 무시)
rpmbuild /app/script/${FILE_NAME}.spec

# 레시피 파일 이동
echo y | cp /app/script/${FILE_NAME}.spec /root/rpmbuild/SPECS/

# 압축 파일 이동
echo y | cp /app/script/hello-1.0.0.tar.gz /root/rpmbuild/SOURCES/

# spec 파일 정보에 해당하는 rpm 파일 생성
rpmbuild -ba /app/script/${FILE_NAME}.spec

# rpm sign
# setsid 로 내부적 새션을 만들어 비밀번호 ASK를 echo로 전달해 주도록함
echo P@ssw0rd! | setsid rpmsign --addsign /root/rpmbuild/RPMS/x86_64/${FILE_NAME}-${FILE_VERSION}*.rpm

# rpm 서명 추가
rpm --import /root/RPM-GPG-KEY

# 패키지 설치
rpm -ivh /root/rpmbuild/RPMS/x86_64/${FILE_NAME}-${FILE_VERSION}*.rpm

# rpm 패키지 정보 확인
rpm -qa ${FILE_NAME}

# 파일 위치 확인
which ${FILE_NAME}

# 파일이 속한 rpm 패키지 확인
rpm -qf /usr/local/bin/${FILE_NAME}

# 파일 실행 확인
${FILE_NAME}

'Operating Systems > Linux' 카테고리의 다른 글

[ Linux ] TELNET 서버 설치  (0) 2021.07.31
[ Linux ] KERBEROS 서버 설치  (0) 2021.07.30
[ Linux ] MAIL 서버 설치  (0) 2021.07.24
[ Linux ] LDAP 서버 설치  (0) 2021.07.20
[ Linux ] 고정 아이피 설정  (0) 2021.07.11