build rpm

This commit is contained in:
smart
2025-12-06 05:26:16 +08:00
parent b24d47f5a1
commit f6ae4fce9a
8 changed files with 2011 additions and 159 deletions

View File

@@ -16,72 +16,15 @@ TOP_DIR="$PROJECT_ROOT/rpmbuild"
# 3. 定义其他重要目录的绝对路径
SOURCES_DIR="$TOP_DIR/SOURCES"
SPECS_DIR="$TOP_DIR/SPECS"
SPEC_FILE="$SPECS_DIR/smarttms.spec" # SPEC 文件的绝对路径
SPEC_FILE="$SPECS_DIR/smarttms-mysql.spec" # SPEC 文件的绝对路径
# 应用程序源代码的实际目录,它位于 SOURCES_DIR 下面
SOURCE_CODE_ORIGINAL_DIR="$SOURCES_DIR/smarttms"
SOURCE_CODE_ORIGINAL_DIR="$SOURCES_DIR/smarttms-mysql"
echo "脚本路径: $SCRIPT_PATH"
echo "项目根目录: $PROJECT_ROOT"
echo "RPM构建顶层目录 (_topdir): $TOP_DIR"
echo "SOURCES目录: $SOURCES_DIR"
echo "SPEC文件: $SPEC_FILE"
echo "原始源代码目录 (待打包): $SOURCE_CODE_ORIGINAL_DIR"
# 4. 检查原始源代码目录是否存在
if [ ! -d "$SOURCE_CODE_ORIGINAL_DIR" ]; then
echo "错误:找不到应用程序原始源代码目录 '$SOURCE_CODE_ORIGINAL_DIR'。"
echo "请确保你的 'smarttms/' 目录位于 '$SOURCES_DIR' 下。"
exit 1
fi
# 5. 确保 SOURCES 目录存在
mkdir -p "$SOURCES_DIR"
# 6. 从 SPEC 文件中提取 Name 和 Version
# rpmbuild 期望 Source0 的格式为 %{name}-%{version}.tar.gz
# 因此,我们需要确保生成的 tarball 名称和其内部的顶层目录名匹配这个约定。
SPEC_NAME=$(grep "^Name:" "$SPEC_FILE" | awk '{print $2}')
SPEC_VERSION=$(grep "^Version:" "$SPEC_FILE" | awk '{print $2}')
if [ -z "$SPEC_NAME" ] || [ -z "$SPEC_VERSION" ]; then
echo "错误:无法从 '$SPEC_FILE' 中提取 Name 或 Version。"
echo "请确保 SPEC 文件中包含 'Name: <package_name>' 和 'Version: <package_version>'。"
exit 1
fi
# rpmbuild 期望的解压后的顶层目录名 (例如 smarttms-1.0)
EXPECTED_UNPACK_DIR_NAME="${SPEC_NAME}-${SPEC_VERSION}"
# 最终生成的 tarball 文件名 (例如 smarttms-1.0.tar.gz),与 Source0 匹配
TARBALL_NAME="${EXPECTED_UNPACK_DIR_NAME}.tar.gz"
TARBALL_PATH="$SOURCES_DIR/$TARBALL_NAME"
echo "从SPEC文件获取到: Name=$SPEC_NAME, Version=$SPEC_VERSION"
echo "rpmbuild预期的解压目录名: $EXPECTED_UNPACK_DIR_NAME"
echo "最终的tarball名称 (应与SPEC文件中的Source0匹配): $TARBALL_NAME"
# 7. 清理旧的 tarball
echo "清理旧的 tarball: $TARBALL_PATH"
rm -f "$TARBALL_PATH"
# 8. 创建新的 tarball使其解压后为期望的目录名 (例如 smarttms-1.0)
echo "创建新的 tarball: $TARBALL_PATH"
# 创建一个临时目录作为打包的暂存区
STAGING_TEMP_DIR=$(mktemp -d)
# 确保脚本退出时清理临时目录
trap "rm -rf '$STAGING_TEMP_DIR'" EXIT
# 将原始源代码复制到暂存区,并重命名为 rpmbuild 期望的目录名
echo "将原始源代码 '$SOURCE_CODE_ORIGINAL_DIR' 复制到临时暂存区并重命名为 '$EXPECTED_UNPACK_DIR_NAME'"
cp -r "$SOURCE_CODE_ORIGINAL_DIR" "$STAGING_TEMP_DIR/$EXPECTED_UNPACK_DIR_NAME"
# 在暂存区内执行 tar 命令,压缩重命名后的目录
# 这样生成的 tarball 解压后就会得到 EXPECTED_UNPACK_DIR_NAME/ 目录
(cd "$STAGING_TEMP_DIR" && tar -czvf "$TARBALL_PATH" "$EXPECTED_UNPACK_DIR_NAME")
echo "Tarball '$TARBALL_PATH' 已创建,其内容解压后将为顶层目录 '$EXPECTED_UNPACK_DIR_NAME/'。"
# 9. 执行 rpmbuild
echo "执行 rpmbuild 命令..."

34
rpmbuild/SOURCES/my.cnf Normal file
View File

@@ -0,0 +1,34 @@
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
datadir=/data/mysql #指定mysql的数据目录
innodb_file_per_table=on #在mariadb5.5以上版的是默认值,可不加
skip_name_resolve=on #禁止主机名解析,建议使用
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

View File

@@ -0,0 +1,27 @@
[Unit]
Description=MySQL Server
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
# 直接使用 mysqld
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
ExecStop=/usr/local/mysql/bin/mysqladmin shutdown
# 重启策略
Restart=on-failure
RestartSec=5s
# 超时设置
TimeoutStartSec=300
TimeoutStopSec=60
# 资源限制
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

File diff suppressed because it is too large Load Diff

View File

@@ -1,135 +1,189 @@
Name: smarttms
Version: 1.0
Release: 1%{?dist}
Summary: SmartTMS application suite for managing smart devices.
# smarttms-mysql.spec
#
# 这个 spec 文件用于将 MySQL 5.6.47 及其相关配置打包成 RPM。
# 它会创建 mysql 用户和组初始化数据库设置root密码并导入初始SQL数据。
Name: smarttms-mysql
Version: 5.6.47
Release: 1%{?dist}
Summary: MySQL 5.6.47 Database Server for SmartTMS Application
# 禁用 debuginfo 包的生成
%define debug_package %{nil}
%global __debug_install_post %{nil}
Group: Applications/Databases
License: GPLv2
URL: https://www.mysql.com/
BuildArch: x86_64
License: Proprietary
URL: https://your.company.com/smarttms
Source0: %{name}-%{version}.tar.gz
# Source0 是 MySQL 预编译二进制包
Source0: mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz
# Source1 是自定义的 my.cnf 配置文件
Source1: my.cnf
# Source2 是 systemd 服务单元文件
Source2: mysqld.service
# Source3 是 SmartTMS 应用程序的初始数据库 SQL 文件
Source3: tms_db_s3.sql
# BuildRequires 是构建 RPM 包所需的工具,这里主要是复制和打包,所以通常不需要太多
# BuildRequires: tar, gzip # 这些通常是系统自带的,不需要显式列出
# Requires 是安装 RPM 包后,应用程序运行时所需的依赖。
# 如果你的 smarttms.service 依赖 Java 或特定的运行时环境,需要在这里添加。
# 例如Requires: java-1.8.0-openjdk
# 构建依赖
BuildRequires: systemd
BuildRequires: tar
BuildRequires: gzip
# 运行时依赖
Requires: systemd
Requires: shadow-utils
Requires: libaio
Requires: perl-Data-Dumper
%description
This package installs the SmartTMS application suite, including a
Tomcat server, a starter application, a custom command-line tool,
and a systemd service for automatic startup. It also configures
sudoers for the 'smart' user and places application shortcuts.
This package provides the MySQL 5.6.47 database server specifically configured
for the SmartTMS application. It includes the necessary binaries,
configuration files, systemd service unit, and initial database schema.
# --- 准备阶段 ---
%prep
%setup -q
# 解压 Source0 (MySQL二进制包)
# -q: 静默模式
# -n: 指定解压后目录名,与 Source0 的 tarball 内部顶层目录名一致
%setup -q -n mysql-5.6.47-linux-glibc2.12-x86_64
# 修复模糊的 Python shebangs
# 假设这些脚本是 Python 3。如果它们是 Python 2 脚本,请将 'python3' 改为 'python2'。
# 查找所有 .py 文件,将 #!/usr/bin/env python 替换为 #!/usr/bin/env python3
find . -type f -name "*.py" -exec sed -i 's|^#!/usr/bin/env python$|#!/usr/bin/env python3|g' {} +
# 查找所有 .py 文件,将 #!/usr/bin/python 替换为 #!/usr/bin/python3
find . -type f -name "*.py" -exec sed -i 's|^#!/usr/bin/python$|#!/usr/bin/python3|g' {} +
# 针对日志中提到的 websockify/run 文件,它没有 .py 后缀
sed -i 's|^#!/usr/bin/python$|#!/usr/bin/python3|g' apache-tomcat-7.0.63/webapps/noVNC-master/utils/websockify/run
# --- 构建阶段 ---
%build
# 你的原始脚本没有编译步骤,所以此部分为空
# 对于预编译二进制包,通常不需要编译步骤
# 如果需要,可以在这里添加编译命令。
# --- 安装阶段 ---
%install
# %{buildroot} 是一个临时目录,模拟最终的根文件系统。
# 清理构建根目录
rm -rf %{buildroot}
# 1. 创建目标目录
mkdir -p %{buildroot}/home/smart/.tms3/apache-tomcat-7.0.63
mkdir -p %{buildroot}/home/smart/.tms3/starter
mkdir -p %{buildroot}%{_bindir} # /usr/bin
mkdir -p %{buildroot}%{_sysconfdir}/sudoers.d # /etc/sudoers.d
mkdir -p %{buildroot}%{_unitdir} # /etc/systemd/system 或 /usr/lib/systemd/system
mkdir -p %{buildroot}%{_datadir}/applications # /usr/share/applications
# 创建安装路径
mkdir -p %{buildroot}/usr/local
mkdir -p %{buildroot}%{_unitdir}
mkdir -p %{buildroot}/etc
mkdir -p %{buildroot}/etc/profile.d
mkdir -p %{buildroot}/usr/share/smarttms-mysql # 用于存放 SQL 导入文件
# 2. 复制文件
cp -r apache-tomcat-7.0.63/* %{buildroot}/home/smart/.tms3/apache-tomcat-7.0.63/
cp -r starter/* %{buildroot}/home/smart/.tms3/starter/
cp smarttms %{buildroot}%{_bindir}/smarttms
cp smart %{buildroot}%{_sysconfdir}/sudoers.d/smart # sudoers.d 文件
cp smarttms.service %{buildroot}%{_unitdir}/smarttms.service # systemd 服务文件
cp starter/tmsrestart.desktop %{buildroot}%{_datadir}/applications/tmsrestart.desktop # 桌面快捷方式
# 复制 MySQL 二进制文件到 /usr/local/
# 注意:%setup 已经将内容解压到当前目录 (即 %{_builddir}/mysql-5.6.47-linux-glibc2.12-x86_64)
cp -a . %{buildroot}/usr/local/mysql-5.6.47-linux-glibc2.12-x86_64
# --- 文件列表 ---
%files
# 列出 RPM 包中包含的所有文件和目录。
# 路径必须是相对于根目录 (/) 的绝对路径。
# %attr(MODE, USER, GROUP) 用于设置文件权限和所有者。
# %dir 用于明确声明一个目录。
# 创建 /usr/local/mysql 软链接
ln -s mysql-5.6.47-linux-glibc2.12-x86_64 %{buildroot}/usr/local/mysql
# /home/smart/.tms3 目录及其内容
# 警告:此路径假设 /home/smart 存在且可写。
# 777 权限非常开放,请确保这是你的意图。
# 如果该目录可能包含用户生成的数据RPM 卸载时不会强制删除非 RPM 跟踪的文件。
%attr(0777, root, root) %dir /home/smart/.tms3
%attr(0777, root, root) %dir /home/smart/.tms3/apache-tomcat-7.0.63
/home/smart/.tms3/apache-tomcat-7.0.63/*
%attr(0755, root, root) %dir /home/smart/.tms3/starter
/home/smart/.tms3/starter/*
# 复制配置文件
cp %{SOURCE1} %{buildroot}/etc/my.cnf
# /usr/bin/smarttms
%attr(0755, root, root) %{_bindir}/smarttms
# 复制 systemd 服务文件
cp %{SOURCE2} %{buildroot}%{_unitdir}/mysqld.service
# /etc/sudoers.d/smart
%attr(0440, root, root) %config(noreplace) %{_sysconfdir}/sudoers.d/smart
# 创建 PATH 环境变量配置脚本
echo 'PATH=/usr/local/mysql/bin:$PATH' > %{buildroot}/etc/profile.d/mysql.sh
chmod 0644 %{buildroot}/etc/profile.d/mysql.sh
# /etc/systemd/system/smarttms.service
%attr(0755, root, root) %config(noreplace) %{_unitdir}/smarttms.service
# 复制初始 SQL 导入文件
cp %{SOURCE3} %{buildroot}/usr/share/smarttms-mysql/tms_db_s3.sql
# /usr/share/applications/tmsrestart.desktop
%attr(0644, root, root) %{_datadir}/applications/tmsrestart.desktop
%clean
rm -rf %{buildroot}
%pre
# 在安装包之前执行的脚本
# 创建 mysql 用户和组,如果不存在的话
getent group mysql >/dev/null || groupadd -r -g 306 mysql
getent passwd mysql >/dev/null || useradd -r -g 306 -u 306 -d /data/mysql -s /sbin/nologin mysql
# 创建数据目录并设置权限
# 注意:/data/mysql 是数据目录,不直接打包在 RPM 中,而是在 %pre 或 %post 中创建和管理
mkdir -p /data/mysql
chown mysql:mysql /data/mysql
chmod 0750 /data/mysql
# --- 安装后脚本 ---
%post
# 这个脚本在 RPM 包安装完成后执行。
# 1. 重新加载 systemd 配置,启用并启动服务
systemctl daemon-reload >/dev/null 2>&1 || :
systemctl enable smarttms.service >/dev/null 2>&1 || :
systemctl start smarttms.service >/dev/null 2>&1 || :
# 在安装包之后执行的脚本
# $1 是安装类型1 表示安装2 表示升级
# 2. 更新桌面快捷方式缓存 (重要,让系统识别新的 .desktop 文件)
update-desktop-database %{_datadir}/applications >/dev/null 2>&1 || :
# 重新加载 systemd 配置,启用并启动 MySQL 服务
%systemd_post mysqld.service
# 仅在首次安装时初始化数据库、设置密码和导入数据
if [ "$1" -eq 1 ]; then
echo "Initializing MySQL database..."
# 切换到 MySQL 安装目录
cd /usr/local/mysql/
# 初始化数据库
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
# 确保数据目录权限正确
chown -R mysql:mysql /data/mysql
# 等待 MySQL 服务启动并可用
echo "Waiting for MySQL server to start..."
for i in $(seq 1 60); do
/usr/local/mysql/bin/mysqladmin ping -h 127.0.0.1 -P 3306 &>/dev/null && break
sleep 1
done
if ! /usr/local/mysql/bin/mysqladmin ping -h 127.0.0.1 -P 3306 &>/dev/null; then
echo "Error: MySQL server did not start in time for post-install setup." >&2
exit 1
fi
echo "MySQL server is running. Performing initial setup..."
# 设置 root 密码
/usr/local/mysql/bin/mysqladmin -uroot password PythA90ra5
# 删除匿名用户和 test 数据库
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 -e "DROP USER ''@'localhost'"
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 -e "DROP DATABASE test"
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 -e "FLUSH PRIVILEGES"
# 导入初始数据库
echo "Importing initial database schema from %{_datadir}/smarttms-mysql/tms_db_s3.sql..."
/usr/local/mysql/bin/mysql -uroot -pPythA90ra5 < %{_datadir}/smarttms-mysql/tms_db_s3.sql
echo "Database initialization and import complete."
else
echo "MySQL package upgraded. Skipping database initialization."
fi
# --- 卸载前脚本 ---
%preun
# 这个脚本在 RPM 包卸载前执行。
# 1. 停止并禁用 systemd 服务
systemctl stop smarttms.service >/dev/null 2>&1 || :
systemctl disable smarttms.service >/dev/null 2>&1 || :
# 在卸载包之前执行的脚本
# 停止 MySQL 服务
%systemd_preun mysqld.service
%postun
# 这个脚本在 RPM 包卸载后执行。
# 1. 重新加载 systemd 配置 (清理服务配置)
systemctl daemon-reload >/dev/null 2>&1 || :
# 在卸载包之后执行的脚本
# $1 是卸载类型0 表示完全卸载1 表示升级
# 2. 更新桌面快捷方式缓存 (移除旧的 .desktop 文件)
update-desktop-database %{_datadir}/applications >/dev/null 2>&1 || :
# 禁用 MySQL 服务并重新加载 systemd 配置
%systemd_postun mysqld.service
# 3. 清理 /home/smart/.tms3 目录 (可选,如果确定没有用户数据)
# 注意RPM 会自动删除 %files 中列出的文件。
# 如果该目录中存在非 RPM 安装的文件RPM 不会删除该目录。
# 如果你希望在卸载时强制删除整个 .tms3 目录,即使里面有其他文件,
# 可以添加以下命令,但请慎重考虑数据丢失的风险。
# if [ -d /home/smart/.tms3 ] && [ -z "$(ls -A /home/smart/.tms3)" ]; then
# rmdir /home/smart/.tms3 >/dev/null 2>&1 || :
# fi
# 如果是完全卸载 (即 $1 为 0),则清理用户、组和数据目录
if [ "$1" -eq 0 ]; then
echo "Performing full uninstallation cleanup..."
# 删除数据目录 (请谨慎操作,这会删除所有数据!)
rm -rf /data/mysql
# 删除用户和组
userdel mysql
groupdel mysql
# 删除 PATH 环境变量配置脚本
rm -f /etc/profile.d/mysql.sh
echo "Full uninstallation cleanup complete."
fi
%files
# 列出所有属于这个 RPM 包的文件和目录
%defattr(-,root,root,-)
# MySQL 安装目录及其内容
/usr/local/mysql-5.6.47-linux-glibc2.12-x86_64/
# 软链接
/usr/local/mysql
# 配置文件 (noreplace 表示如果文件被修改,升级时不会覆盖)
%config(noreplace) /etc/my.cnf
# systemd 服务文件
%{_unitdir}/mysqld.service
# PATH 环境变量配置脚本
/etc/profile.d/mysql.sh
# 初始 SQL 导入文件 (作为文档或辅助文件)
%{_datadir}/smarttms-mysql/tms_db_s3.sql
%changelog
* Fri Dec 05 2025 Your Name <your.email@example.com> - 1.0-1
- Initial RPM packaging of SmartTMS application suite with systemd, sudoers.d,
- and /usr/share/applications desktop shortcut.
* Fri Dec 06 2025 Your Name <your.email@example.com> - 5.6.47-1
- Initial RPM package for SmartTMS MySQL 5.6.47.

Binary file not shown.