一、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