yum install -y rpm-build
yum install -y rpmdevtools
rpmdev-setuptree是rpmdevtools中带的初始化环境脚本,执行后会在用户主目录下创建rpmbuild目录和.rpmmacros文件,同时生成所需的子目录和默认的控制参数,执行:
rpmdev-setuptree
自动生成的目录结构:
-- rpmbuild
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
|-- SRPMS
rust_http_proxy.spec
写的比较简单,没有使用内置宏或内置变量,适合我这种不熟悉rpm打包的人。总体思路就是能自己写的全部自己写,最终只用到了%{buildroot}
这一个内置变量,用于控制将编译输出到哪里。
因为没有使用内置宏,所有每个阶段都尽可能使用了绝对路径,或者在一开始cd到目标目录中。下面介绍下具体过程:
- %prep: 使用git拉取代码
- %build:使用cargo编译代码
- %install: 将编译好的二进制文件和相关配置文件install到
%{buildroot}
中 - %files: 指定要将哪些文件打到rpm包中,其中%config被标记为配置文件,升级时会覆盖配置文件,noreplace则不会被覆盖配置文件
- %post: 用户安装该RPM后自动执行的操作。这里是触发
systemctl daemon-reload
,因为rpm包中有service文件
Release没有带el8、el9标识的特别说明:
因为rust静态链接的可执行文件在不同centos版本都可运行,所以不做区分,如果要改回去,可以使用%{?dist}
宏
Release: 3%{?dist}
rpmbuild命令会根据spec文件来生成rpm包,主要用到以下几个参数
rpmbuild --help
-bp 执行到%prep阶段结束
-bc 执行到%build阶段结束
-bi 执行到%install阶段结束
-bl 检测%files文件是否有丢失
-ba 创建src.rpm和二进制包
-bs 只创建src.rpm源码包
-bb 只创建二进制rpm包
常用的参数就这几个,其它的自己看man手册,开始打包:
rpmbuild -bp motan-go.spec
rpmbuild -bc motan-go.spec
rpmbuild -bi motan-go.spec
rpmbuild -bl motan-go.spec
rpmbuild -ba motan-go.spec
分阶段测试,方便排错,如果哪个阶段有错误,可以使用–short-circuit跳过之前成功的阶段,节省时间
rpmbuild -bi --short-circuit ngx_openresty.spec
rpm -ivh ~/rpmbuild/RPMS/x86_64/rust_http_proxy-${verion}.el9.x86_64.rpm #rpm包在此
rpmdev-bumpspec --comment=$(date) --userstring=root rpm/rust_http_proxy.spec
安装rust和musl支持,以打包静态链接的可执行文件
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-host x86_64-unknown-linux-gnu -y
source "$HOME/.cargo/env"
cd /var/
wget http://musl.libc.org/releases/musl-1.2.3.tar.gz -O musl-1.2.3.tar.gz
yum install -y gcc make
tar -zxvf musl-1.2.3.tar.gz
cd musl-1.2.3
./configure
make -j 2
make install
ln -fs /usr/local/musl/bin/musl-gcc /usr/local/bin/musl-gcc
rustup target add x86_64-unknown-linux-musl
## 打包
yum install -y rpm-build
yum install -y rpmdevtools
rm -rf ~/rpmbuild
rpmdev-setuptree
## 打包
if [ -d /var/rust_http_proxy ]; then
cd /var/rust_http_proxy;
git pull --ff-only || {
echo "git pull 失败,重新clone"
cd /var
rm -rf /var/rust_http_proxy
git clone https://github.com/arloor/rust_http_proxy /var/rust_http_proxy
}
else
git clone https://github.com/arloor/rust_http_proxy /var/rust_http_proxy
fi
rpmbuild -bb /var/rust_http_proxy/rpm/rust_http_proxy.spec
## 安装
version=0.1
release=1.all
echo RPM信息
rpm -qpi ~/rpmbuild/RPMS/x86_64/rust_http_proxy-${version}-${release}.x86_64.rpm
echo 配置文件
rpm -qpc ~/rpmbuild/RPMS/x86_64/rust_http_proxy-${version}-${release}.x86_64.rpm
echo 所有文件
rpm -qpl ~/rpmbuild/RPMS/x86_64/rust_http_proxy-${version}-${release}.x86_64.rpm
systemctl stop rust_http_proxy
yum remove -y rust_http_proxy
# rpm -ivh在安装新版本时会报错文件冲突,原因是他没有进行更新或降级的能力,而yum install可以处理可执行文件的更新或降级
yum install -y ~/rpmbuild/RPMS/x86_64/rust_http_proxy-${version}-${release}.x86_64.rpm
## 启动
systemctl daemon-reload
systemctl start rust_http_proxy
systemctl status rust_http_proxy --no-page