Linux下编译RPM包

Linux下编译RPM包

作者: yym439 时间: 2022-03-31

一、rpmbuild编译打包rpm

1.1 编写build.sh脚本

BUILD_DIR=$(dirname $(readlink -f "${BASH_SOURCE[0]}"))

rm -rf "$BUILD_DIR/build-out/"
mkdir -p "$BUILD_DIR/build-out/"


$BUILD_DIR/build_rpm.sh

cp $BUILD_DIR/pkg/RPMS/x86_64/*.rpm   $BUILD_DIR/build-out/
rm -rf "$BUILD_DIR/pkg"

1.2 编写build_rpm.sh脚本

#!/bin/bash

BASE=`pwd`
_TOP="$BASE/pkg"
SPEC="name.spec"


cp_src() {
    local dest=$1
	#拷贝源码路径到目标文件夹
    cp -a your_dir $dest
}

build_rpm() {

    name=工程名称
    TARBALL=$name.tgz
    SRPM=$_TOP/SRPMS/$name.src.rpm

    rm -rf $_TOP
    echo "Creating rpm build dirs under $_TOP"
    mkdir -p $_TOP/{RPMS,SRPMS,SOURCES,BUILD,SPECS,tmp}
    mkdir -p $_TOP/tmp/$name

    cp_src $_TOP/tmp/$name
	  cp $SPEC $_TOP/SPECS/$SPEC

    echo "Creating tgz $TARBALL"
    tar -czf $_TOP/SOURCES/$TARBALL -C $_TOP/tmp/$name/ ./

    echo "Creating rpm"
    rpmbuild -bs --define="_topdir $_TOP" $_TOP/SPECS/$SPEC

    rpmbuild -bb --define="_topdir $_TOP" $_TOP/SPECS/$SPEC

}


pushd $BASE
build_rpm
popd

1.3 编写spec文件

Name:       name #设置rpm包的名字
Version:    1.0.0
Release:    0
Summary:    Summary #rpm包的简要信息
Packager:   email #rpm包制作者的名字和email
Source:     %{name}.tgz
BuildRoot:  %{_tmppath}/%{name}-%{version}
License:    GPLv2
Url:        #官网路径
Prefix:     %{_prefix}


%description
描述信息

#全局变量
%global __os_install_post    \
    /usr/lib/rpm/redhat/brp-compress \
    %{!?__debug_package:\
    /usr/lib/rpm/redhat/brp-strip %{__strip} \
    /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \
    } \
    /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \
    %{!?__jar_repack:/usr/lib/rpm/redhat/brp-java-repack-jars} \
%{nil}


#定义准备编译的命令
%prep
#在解压之前创建子目录
%setup -c 

#编译软件
%build

#定义安装之后执行的脚本
%post

#安装软件
%install
rm -rf %{buildroot}
install -d %{buildroot}
install -d %{buildroot}/usr/share/sourcefile
cp -r usr/share/sourcefile  %{buildroot}/usr/share/sourcefile
%check

#清除编译和安装时生成的临时文件
%clean
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

#rpm包中要安装的所有文件列表
%files
%defattr(-,root,root)
/usr/share/sourcefile

1.4 编译打包

./build.sh  即可生成rpm安装包

二、fpm编译打包rpm (推荐方式)

2.1 fpm环境搭建

# 安装ruby模块, fpm是ruby写的,因此系统环境需要ruby,且ruby版本号大于1.8.5。
yum -y install ruby rubygems ruby-devel

# 查看当前使用的rubygems仓库
gem sources list

# 添加国内Rubygems仓库,外国的源慢,移除原生的Ruby仓库
gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/
gem sources --add https://ruby.taobao.org/ --remove http://rubygems.org/

# 安装fpm
gem install fpm

2.2 创建pack.sh

#!/bin/bash

VERSION="1.0"
SVN_VERSION_CUR=$(LC_ALL=en_US.utf8 svn info . | grep "Revision:" | awk '{print $2}')
if [ -z "$SVN_VERSION_CUR" ];then
    SVN_VERSION_CUR="0"
fi
VERSION=${VERSION}.${SVN_VERSION_CUR}
PACK_NAME="YOUR_PACK_NAME"
BUILD_DATE=$(date +"%G%m%d")

copy_src()
{
    # Clear and make new dir
    rm -rf _install
    mkdir -p _install

    # Copy file
    cp -af ./etc _install/
    cp -af ./usr _install/
    

    pushd _install >/dev/null 2>&1
    find . -type d -name "__pycache__" | xargs rm -rf
    popd >/dev/null 2>&1
}

#s 设置依赖包
get_depend()
{
    depend_packs="python3"
    depend_args=""

    for d in $depend_packs;do
        depend_args="$depend_args -d $d"
    done
    echo "$depend_args"
}

pack_rpm()
{
    arch=$(uname -m)
    
    fpm -f -s dir -t rpm \
        -v "$VERSION" -a "$arch" -n "$PACK_NAME" \
        -C _install -p ./ \
        --before-install ./rpm/befinstall.sh \
        --after-install ./rpm/aftinstall.sh \
        --before-remove ./rpm/befremove.sh \
        --after-remove ./rpm/aftremove.sh \
        --before-upgrade ./rpm/befupgrade.sh \
        --after-upgrade ./rpm/aftupgrade.sh \
        $(get_depend) \
        --verbose

    dst_name="$PACK_NAME-$VERSION-$BUILD_DATE-1.$arch.rpm"
    mv ${PACK_NAME}-${VERSION}-1.${arch}.rpm ${dst_name}
    md5sum ${dst_name} > ${dst_name}.md5.txt

    # rm -rf out/${BUILD_DATE}
    mkdir -p out/${BUILD_DATE}
    mv ${dst_name} ${dst_name}.md5.txt out/${BUILD_DATE}
}

main()
{
    # Change to sh dir
    cd $(dirname "$0")

    copy_src
    pack_rpm
}

main

2.3 编写befinstall.sh、aftinstall.sh等安装脚本

aftinstall.sh:

#!/bin/bash

BASE="/usr/XXX"
CONF="/etc/XXX"
LOG="/var/log/XXX"
VENV="$BASE/XXX-venv-linux"
REQ="$BASE/requirements"

#python3安装虚拟环境
python3 -m venv $VENV

#离线安装python依赖包,requirements.txt记录需要安装的包版本信息,#req_pack文件夹存放whl离线包
$VENV/bin/pip install \
    --no-index --find-links="$REQ/req_pack" \
    -r $REQ/requirements.txt \
    >/dev/null 2>&1

mkdir -p $LOG

2.4 ./pack.sh编译打包