微服务项目打rpm包

1、需求场景

       最近公司项目上线,部署环境为中科方德涉密版,达梦安全版本;客户要求内网部署不使用Docker,不直接使用shell脚本方式执行,推荐使用rpm包方式部署项目,想必大家也猜到这是对国企厂商进行部署。所以问题就来了,微服务项目其实是非常推荐Docker方式部署的,好处如下:

  1. 便于管理,可以自己搭建镜像,一些公共依赖可以搭建本地镜像仓库;
  2. 便于日志的查看,甚至不需要自己额外的去搭建日志系统。
  3. 安装方便,但是也仅限于公网上使用docker。

        但是Docker有诸多好处,但是始终在面对内网使用内网部署的工厂项目来说还是不太适用,所以大多数时候我们就直接采用shell脚本方式来部署,好处就是快捷,不需要花更多的时间去搭建过多的环境。但是这次项目部署直接要求rpm方式安装部署,这就有点难受了,这个以前只会安装和卸载也不会自己制作rpm啊,没办法苦逼打工人现学现用呗,初步目标能用就行,先把项目部署上去跑起来再说。

2、什么是RPM?

        下面是我问chat给出的回答

        RPM是Red Hat Package Manager(红帽软件包管理器)的缩写,它是一种用于在Linux操作系统中管理软件包的工具。RPM可以用来安装、更新、卸载和查询软件包。它使用.rpm文件作为软件包的格式,并提供了一套命令行工具和图形界面来进行操作。RPM是一种常见的软件包管理工具,在许多基于Red Hat的Linux发行版中广泛使用,如Red Hat Enterprise Linux(RHEL)、Fedora和CentOS等。

3、准备打RPM包的环境

我的打包环境:centos7.6、rpmbuild 、 rpmdevtools

# 安装 rpmbuild
yum install rpm-build
 
# 安装 rpmdevtools
yum install rpmdevtools

3.1 创建生产rpm包的目录结构

使用命令或手动创建都可以

rpmdev-setuptree

创建完成之后具体结构如下

4、准备打包RPM的相关资源

        4.1 打一个基础的rpm包呢其实最主要的文件就是放在以下两个目录

                SOURCES目录下存放的以下内容,无非就是jar包、配置文件、执行jar的脚本文件、.service 文件,其中.service 文件就是使用systemctl命令执行时调用的文件。

                

                SPECS目录下就是存放.spec文件,这个文件就比较重要了,打rpm包时就是通过这个文件来作为打包依据的,它指定了打rpm包的打包过程,还有在安装或卸载时该执行的那些操作。

                

以下就是我提供的.spec文件的示例

Name: test-user
Version: 1.8.0   #版本
Release: 1%{?dist}  
Summary: Common dependencies for microservices   #摘要

Group: Applications/Internet       
License: MIT       
URL: http://******
Packager: ****      #打包的人
Vendor: http://****.com
BuildArch: x86_64      #适配的架构,也就是所要安装的服务器采用的架构

Source0: test-user.jar    #这个就是指定的SOURCES目录下的某个资源文件
Source1: testUser.sh      #同上,但是多个资源文件用0,1,2来区分
Source2: test-user.service
Source3: application-prod.yml
BuildRoot: %{_tmppath}/%{name}/%{version}-%{release}-root

# 指定构建rpm包所需的依赖
BuildRequires: java-devel >= 1.8

# 指定运行rpm包所需的依赖
Requires: java-1.8.0-openjdk

#描述
%description
**********************

#一个宏指令,用于设置软件包的源代码的解压和准备工作。
%setup -q -n %{name}-%{version}
%prep
# 在构建rpm包之前需要执行的操作
# 创建构建目录
mkdir -p %{_builddir}/%{name}-%{version}-%{release}

#build阶段此时会操作到/rpmbuild/BUILD/目录中
%build
cp %{SOURCE0} %{_builddir}/%{name}-%{version}-%{release}
cp %{SOURCE1} %{_builddir}/%{name}-%{version}-%{release}
cp %{SOURCE2} %{_builddir}/%{name}-%{version}-%{release}
cp %{SOURCE3} %{_builddir}/%{name}-%{version}-%{release}

#安装rpm时执行的操作
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p %{buildroot}/data1/ubcs/ubcs-server/test_user
cp %{_builddir}/%{name}-%{version}-%{release}/test-user.jar %{buildroot}/data1/test/test-server/test_user/
cp %{_builddir}/%{name}-%{version}-%{release}/testUser.sh %{buildroot}/data1/test/test-server/test_user
cp %{_builddir}/%{name}-%{version}-%{release}/test-user.service %{buildroot}/data1/test/test-server/ubcs_user
cp %{_builddir}/%{name}-%{version}-%{release}/application-prod.yml %{buildroot}/data1/test/test-server/test_user
chmod +x %{buildroot}/data1/test/test-server/test_user/testUser.sh
#chmod +x %{buildroot}/data1/test/test-server/test_user/test-user.service

#安装完成后设置开机自启动,可以根据需求决定是否设置
%post
#systemctl enable test-user.service

%preun
# 在卸载RPM包之前执行的操作,例如停用服务
systemctl stop test-user.service
# 等待服务停止
sleep 5
# 禁用服务,确保它不会在系统引导时自动启动
systemctl disable test-user.service
# 删除日志文件
rm -rf /data1/test/test-server/logs/userLog.log
# 如果有必要,重新加载systemd配置
systemctl daemon-reload

%triggerin --test-user
# 在RPM包被安装时触发的操作
# 复制.service文件到指定位置
cp /data1/test/test-server/test_user/test-user.service /etc/systemd/system/

%triggerun --test-user
# 在RPM包被卸载时触发的操作
rm -rf /etc/systemd/system/test-user.service
#rm -rf /data1/t/testest-server/test_user/%{name}.jar
#rm -rf /data1/test/test-server/test_user/testUser.sh

#构建完成后删除/rpmbuild/BUILDROOT/中的打包过程文件
%clean
rm -rf $RPM_BUILD_ROOT

%files
# 定义RPM包中的文件列表,也就是安装后存放相关资源的的文件路径
%defattr(-,root,root,-)
%attr(755,root,root) /data1/test/test-server/test_user/testUser.sh
/data1/test/test-server/test_user/%{name}.jar
/data1/test/test-server/test_user/testUser.sh
/data1/test/test-server/test_user/test-user.service
/data1/tet/test-server/test_user/application-prod.yml

#打包日志,一般也就是更改的时间节点记录
%changelog
* Sun Aug 30 2023 Ludc
* Sun Aug 12 2023 Ludc
- Initial version

下面就来讲解一下需要注意的部分:

  1. Group字段:Group字段用于指定软件包所属的分类或组别。它可以帮助用户在安装软件包时更好地组织和查找软件包。常见的Group值包括"Development/Tools"(开发工具)、"System Environment/Base"(系统环境/基础)等。通过指定适当的Group,可以将软件包与相关的软件包进行关联,并方便用户按照功能或用途进行软件包的选择和安装。
  2. License字段:License字段用于指定软件包的许可证信息。它描述了软件包的许可证类型和使用条款。许可证信息对于开源软件包特别重要,因为它可以告知用户软件包的使用和分发条款,以及用户是否可以对软件进行修改和重新分发。常见的License值包括"GPL"(GNU通用公共许可证)、"MIT"(麻省理工学院许可证)等。通过指定适当的License,可以帮助用户了解软件包的法律和使用限制。

  3. %files阶段,这个阶段就是指定了安装时资源文件存放的路径,和文件权限的授予。

4.2 .service文

件的编写

[Unit]
Description=test-user
After=syslog.target

[Service]
Type=forking
ExecStart=/data1/test/test-server/test_user/testUser.sh start #启动,根据自己的shell来写ExecStop=/data1/test/test-server/test_user/testUser.sh stop   #停止
ExecStatus=/data1/test/test-server/test_user/testUser.sh status #状态查看
ExecRestart=/data1/test/test-server/test_user/testUser.sh restart #重启

PrivateTmp=true #服务将有一个独立的、隔离的临时文件系统,不会与其他服务共享
Restart=always  #指示当服务意外终止时,自动重新启动服务
SuccessExitStatus=143  #服务的成功退出状态码。在这种情况下,143表示服务成功退出
WorkingDirectory=/data1/test/test-server/test_user #指定服务的工作目录

[Install]
WantedBy=multi-user.target #指定服务应该在哪个target(目标)下启动,这儿需要配置正确,否则无法设置开机自启动,也就是无法正确执行systemctl enable 服务名
Alias=test-user  #指定服务应该在哪个target(目标)下启动

 值得注意的是,如果你的代码中配置了日志输出到本地的相关配置,那么就需要正确的配合WorkingDirectory=/data1/test/test-server/test_user,否则使用systemctl执行命令时就会导致日志文件无法正常创建。

此外就需要准备好自己执行项目的的shell脚本,这个编写风格比较多,网上也有很多其他教程就不详细赘述了。

5、开始打包

        接下来就只需要将资源文件放入到SOURCES目录下,.sepc文件放在SPECS目录下,然后cd到SPECS目录下,执行以下命令即可完成打包

rpmbuild -ba .spec文件名

其中-ba是指定的打包的构建类型,具体解释如下文

  1. "-bb":表示构建二进制软件包,但不执行安装阶段。这个参数常用于在构建软件包之前进行测试和验证。

  2. "-bs":表示仅构建源码软件包,不构建二进制软件包。这个参数常用于构建源码软件包,以便将其分发给其他用户或系统。

  3. "-bc":表示只执行编译阶段,不执行打包和安装阶段。这个参数常用于只编译软件包,而不需要生成二进制软件包或安装软件包。

  4. "-bp":表示仅执行预处理阶段,不执行编译、打包或安装阶段。这个参数常用于在构建软件包之前进行预处理操作。

  5. "-bi":表示仅执行安装阶段,不执行编译或打包阶段。这个参数常用于在构建软件包之前进行安装操作。

  6. "-bl":表示列出软件包的文件列表,而不执行其他操作。这个参数常用于查看软件包中包含的文件。

  7. "-ba":表示构建并打包软件包的所有阶段,包括编译、打包和安装。这是默认的rpmbuild行为,如果不指定其他参数,则会执行"-ba"操作。

执行完打包语句,没有报错,就代表打包完成了。

6、打包完成

        最后到/root/rpmbuild/RPMS/x86_64/目录下查看即可看到打好的rpm包,接下来只需要使用rpm -ivh rpm包名进行安装即可。

7、总结

        总体来说打一个基础的rpm还是比较简单的,但是如果需要打一个比较严谨且规范的rpm包还是需要多研究研究的。

        以上便是我个人对于打rpm包的相关的示例,如有错误的地方可在评论区指正,咱们互相学习,共同进步。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值