thingsboard如何编译出rpm包

整体思路: 在application项目中,引用maven plugin 来调用gradle 任务来编译rpm包。

在pom.xml中配置了gradle-maven-plugin插件,用于调用Gradle构建任务来生成RPM包。相关配置如下:

xml 复制代码
<plugin>
    <groupId>org.thingsboard</groupId>
    <artifactId>gradle-maven-plugin</artifactId>
    <configuration>
        <gradleProjectDirectory>${main.dir}/packaging/${pkg.type}</gradleProjectDirectory>
        <tasks>
            <task>buildRpm</task>  <!-- 指定执行buildRpm任务 -->
        </tasks>
        <args>
            <arg>-PpackagingDir=${main.dir}/packaging</arg>
            <arg>-PprojectBuildDir=${basedir}/target</arg>
            <arg>-PprojectVersion=${project.version}</arg>
            <arg>-PmainJar=${project.build.directory}/${project.build.finalName}-boot.${project.packaging}</arg>
            <arg>-PpkgName=${pkg.name}</arg>
            <arg>-PpkgUser=${pkg.user}</arg>
            <arg>-PpkgInstallFolder=${pkg.installFolder}</arg>
            <arg>-PpkgLogFolder=${pkg.unixLogFolder}</arg>
        </args>
    </configuration>
</plugin>

在packaging/java/build.gradle中定义了buildRpm任务,这是实际生成RPM包的核心逻辑

groovy 复制代码
buildRpm {
    arch = NOARCH
    archiveFileName = "${pkgName}.rpm"
    requires("java-11")  // 依赖Java 11
    
    // 配置文件处理
    from("${buildDir}/conf") {
        include "${pkgName}.conf"
        filter(ReplaceTokens, tokens: ['pkg.platform': 'rpm'])
        into "${pkgInstallFolder}/conf"
    }
    
    // 安装脚本
    preInstall file("${buildDir}/control/rpm/preinst")
    postInstall file("${buildDir}/control/rpm/postinst")
    preUninstall file("${buildDir}/control/rpm/prerm")
    postUninstall file("${buildDir}/control/rpm/postrm")
    
    // 用户和权限设置
    user pkgUser
    permissionGroup pkgUser
    
    // 服务文件
    from("${buildDir}/control/template.service") {
        into "/lib/systemd/system"
        rename { "${pkgName}.service" }
    }
}

其中gradle 也是用nebula.ospackage gradle 插件。

nebula.ospackage 是一个Gradle插件,主要用于构建Linux系统的软件包(RPM和DEB格式)。它的主要功能包括:

  1. 支持多种包格式:可以生成RPM和DEB两种主流Linux包格式
  2. 文件系统布局控制:可以精确控制文件在目标系统中的安装位置
  3. 权限设置:可以为文件和目录设置权限
  4. 依赖管理:可以声明软件包依赖关系
  5. 安装/卸载脚本:支持pre/post安装和卸载脚本
  6. 符号链接创建:可以在安装时创建符号链接
  7. 用户/组管理:可以指定运行用户和组
groovy 复制代码
plugins {
    id "nebula.ospackage" version "8.6.3"
}

version = '1.0.0'

// 通用包配置
ospackage {
    packageName = "myapp"
    version = project.version
    release = 1
    os = LINUX
    type = BINARY
    
    into "/opt/myapp"  // 安装目录
    
    user "myapp"  // 运行用户
    permissionGroup "myapp"  // 用户组
    
    // 添加主jar文件
    from("build/libs/myapp.jar") {
        into "bin"
        fileMode 0500  // 可读可执行
    }
    
    // 添加配置文件
    from("conf") {
        into "conf"
        fileMode 0644  // 可读
    }
    
    // 添加启动脚本
    from("scripts/myapp.sh") {
        into "bin"
        fileMode 0755  // 可执行
    }
    
    // 添加文档
    from("docs") {
        into "usr/share/doc/myapp"
    }
}

// RPM包特定配置
buildRpm {
    arch = NOARCH  // 架构无关
    
    requires("java-11")  // 依赖Java 11
    
    // 安装前后脚本
    preInstall file("scripts/rpm/preinst")
    postInstall file("scripts/rpm/postinst")
    preUninstall file("scripts/rpm/prerm")
    postUninstall file("scripts/rpm/postrm")
    
    // 创建符号链接
    link("/usr/bin/myapp", "/opt/myapp/bin/myapp.sh")
}

// DEB包特定配置
buildDeb {
    arch = "all"  // 架构无关
    
    requires("openjdk-11-jre").or("java11-runtime")  // 依赖Java 11
    
    // 安装前后脚本
    preInstall file("scripts/deb/preinst")
    postInstall file("scripts/deb/postinst")
    preUninstall file("scripts/deb/prerm")
    postUninstall file("scripts/deb/postrm")
    
    // 配置文件标记
    configurationFile("/opt/myapp/conf/app.conf")
    
    // 创建符号链接
    link("/usr/bin/myapp", "/opt/myapp/bin/myapp.sh")
}
相关推荐
有风6310 分钟前
优先级队列详解
后端
雨中飘荡的记忆25 分钟前
ByteBuddy 实战指南
后端
Apifox31 分钟前
Apifox 11 月更新|AI 生成测试用例能力持续升级、JSON Body 自动补全、支持为响应组件添加描述和 Header
前端·后端·测试
有风6344 分钟前
双向循环带头链表详解
后端
找不到对象就NEW一个1 小时前
用wechatapi进行微信二次开发,微信api
后端
charlie1145141911 小时前
勇闯前后端Week2:后端基础——Flask API速览
笔记·后端·python·学习·flask·教程
有风631 小时前
基于顺序表完成通讯录项目
后端
yuuki2332331 小时前
【C++】初识C++基础
c语言·c++·后端
q***87601 小时前
springboot下使用druid-spring-boot-starter
java·spring boot·后端
程序员西西1 小时前
SpringBoot无感刷新Token实战指南
java·开发语言·前端·后端·计算机·程序员