Files
smarttms-mysql-rpm-build/rpmbuild/SPECS/smarttms-mysql.spec
2025-12-06 05:26:16 +08:00

190 lines
6.2 KiB
RPMSpec
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
# 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: systemd
BuildRequires: tar
BuildRequires: gzip
# 运行时依赖
Requires: systemd
Requires: shadow-utils
Requires: libaio
Requires: perl-Data-Dumper
%description
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
# 解压 Source0 (MySQL二进制包)
# -q: 静默模式
# -n: 指定解压后目录名,与 Source0 的 tarball 内部顶层目录名一致
%setup -q -n mysql-5.6.47-linux-glibc2.12-x86_64
%build
# 对于预编译二进制包,通常不需要编译步骤。
# 如果需要,可以在这里添加编译命令。
%install
# 清理构建根目录
rm -rf %{buildroot}
# 创建安装路径
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 导入文件
# 复制 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
# 创建 /usr/local/mysql 软链接
ln -s mysql-5.6.47-linux-glibc2.12-x86_64 %{buildroot}/usr/local/mysql
# 复制配置文件
cp %{SOURCE1} %{buildroot}/etc/my.cnf
# 复制 systemd 服务文件
cp %{SOURCE2} %{buildroot}%{_unitdir}/mysqld.service
# 创建 PATH 环境变量配置脚本
echo 'PATH=/usr/local/mysql/bin:$PATH' > %{buildroot}/etc/profile.d/mysql.sh
chmod 0644 %{buildroot}/etc/profile.d/mysql.sh
# 复制初始 SQL 导入文件
cp %{SOURCE3} %{buildroot}/usr/share/smarttms-mysql/tms_db_s3.sql
%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
# 在安装包之后执行的脚本
# $1 是安装类型1 表示安装2 表示升级
# 重新加载 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
# 在卸载包之前执行的脚本
# 停止 MySQL 服务
%systemd_preun mysqld.service
%postun
# 在卸载包之后执行的脚本
# $1 是卸载类型0 表示完全卸载1 表示升级
# 禁用 MySQL 服务并重新加载 systemd 配置
%systemd_postun mysqld.service
# 如果是完全卸载 (即 $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 06 2025 Your Name <your.email@example.com> - 5.6.47-1
- Initial RPM package for SmartTMS MySQL 5.6.47.