mysql5.5、5.6打包rpm

1、安装rpm工具包

1
yum install rpmbuild rpmdevtools -y

2、初始化rpm基础目录,目录结构如下

1
2
3
4
5
6
7
8
rpmdev-setuptree
ll /root/rpmbuild/
total 20
drwxr-xr-x 2 root root 4096 Jul 5 15:29 BUILD
drwxr-xr-x 2 root root 4096 Jul 5 15:29 RPMS
drwxr-xr-x 2 root root 4096 Jul 5 15:29 SOURCES
drwxr-xr-x 2 root root 4096 Jul 5 15:29 SPECS
drwxr-xr-x 2 root root 4096 Jul 5 15:29 SRPMS

BUILD RPM构建包的地方,编译、配置等操作都在这个目录下执行

RPMS 打包完成RPM包存放路径

SOURCES MySql源码存放路径

SPECS spec文件存放路径(自动应答文件)


3、本次分享打包mysql-5.6.40,将mysql-5.6.40.tar.gz源码文件上传到SOURCES目录下

具体代码 文章末尾


4、执行命令打包

1
rpmbuild -bb rpmbuild/SPECS/mysql.spec

5、完成后在rpmbuild/RPM目录下就会两个rpm包

1
2
-rw-r--r-- 1 root root 52939316 7月 6 10:10 MySQL-5.6.40-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 93863140 7月 6 10:11 MySQL-debuginfo-5.6.40-1.el6.x86_64.rpm

6、直接安装,安装完成后会直接启动Mysql

1
2
3
4
rpm -ivh MySQL-5.6.40-1.el6.x86_64.rpm

不关闭服务直接卸载
rpm -e --nodeps MySQL-5.6.40-1.el6.x86_64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#语法:
#TagName: value
#tag名大小写不敏感。

#自定义宏语法:
#%define ropon 2
#使用%{ropon}或者%ropon调用

#RPM包名称,文件中可使用%{name}调用。
Name:mysql
#RPM包版本号,文件中可使用%{version}调用
Version:5.7.25
#打包特定版本号,常指第几次打包,其中dist centos6下是.el6,centos7下是.el7。
Release:1%{?dist}
#RPM包摘要,简单描述RPM包
Summary: %{name}-%{version} RPM
prefix: /usr/local/mysql%{version}

Group: applications/database
License: GPL
URL: http://www.mysql.com

#指定构建需要的源代码,多个源码包,使用Source1,2...,n
Source0: %{name}-%{version}.tar.gz
#_tmppath是/var/tmp
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: gcc-c++ cmake perl ncurses ncurses-devel libaio numactl numactl-libs perl-Module-Install
Requires: ncurses ncurses-devel libaio numactl numactl-libs perl-Module-Install
Packager: ropon@west.cn

#autoreqprov用来指定自动产生RPM依赖关系
AutoReqProv: no

#RPM包详细描述
%description
%{name} %{version}

%define _mysqlflag 57
%define _runuser mysql
%define _rungroup mysql
%define _dbrootpwd West.cn2020
%define _prefix /local/mysql%{version}
%define _datadir /home/panel/mysql%{_mysqlflag}_data
%define mysqlpath /usr/local/mysql
#对于mysql5.5特殊设置
%define temp #explicit_defaults_for_timestamp

#setup 不加任何选项,仅将软件包打开。
#setup -n newdir 将软件包解压在newdir目录。
#setup -c 解压缩之前先产生目录。
#setup -b num 将第num个source文件解压缩。
#setup -T 不使用default的解压缩操作。
#setup -T -b 0 将第0个源代码文件解压缩。
#setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。

#构建前的准备
%prep
%setup -n mysql-%{version}

#构建
%build
if [ "%{version}" == "5.7.25" ]; then
cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DMYSQL_DATADIR=%{_datadir} -DSYSCONFDIR=/etc -DWITH_BOOST=boost
else
cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DMYSQL_DATADIR=%{_datadir} -DSYSCONFDIR=/etc
fi
make %{?_smp_mflags}

#安装
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}

#rpm安装前执行的脚本
%pre
id -u %{_runuser} >/dev/null 2>&1
[ $? -ne 0 ] && useradd -M -s /sbin/nologin %{_runuser}
[ ! -d %{_datadir} ] && mkdir -p %{_datadir}
chown -R %{_runuser}:%{_rungroup} %{_datadir}
chmod -R 744 %{_datadir}

#rpm安装后执行的脚本
%post
service mysqld stop
mv %{mysqlpath} %{mysqlpath}_bak
ln -sf %{_prefix} %{mysqlpath}
if [ "%{version}" == "5.7.25" ]; then
%{_prefix}/bin/mysqld --initialize-insecure --basedir=%{_prefix} --datadir=%{_datadir} --user=%{_runuser}
else
%{_prefix}/scripts/mysql_install_db --basedir=%{_prefix} --datadir=%{_datadir} --user=%{_runuser}
fi
/bin/cp %{_prefix}/support-files/mysql.server /etc/init.d/mysqld
sed -i "s@^basedir=.*@basedir=%{_prefix}@" /etc/init.d/mysqld
sed -i "s@^datadir=.*@datadir=%{_datadir}@" /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
wget -O /etc/my.cnf --no-check-certificate http://panel.ropon.top/panel/lnmp/config/my.txt
[ "%{version}" == "5.5.62" ] && sed -i "s@explicit_defaults_for_timestamp@%{temp}@" /etc/my.cnf
sed -i "s@/usr/local/mysql@%{_prefix}@" /etc/my.cnf
sed -i "s@/home/mysql@%{_datadir}@" /etc/my.cnf
service mysqld start

[ -z "$(grep ^'export PATH=' /etc/profile)" ] && echo "export PATH=%{_prefix}/bin:\$PATH" >> /etc/profile
[ -n "$(grep ^'export PATH=' /etc/profile)" -a -z "$(grep %{_prefix} /etc/profile)" ] && sed -i "s@^export PATH=\(.*\)@export PATH=%{_prefix}/bin:\1@" /etc/profile
source /etc/profile

%{_prefix}/bin/mysql -e "grant all privileges on *.* to root@'localhost' identified by \"%{_dbrootpwd}\" with grant option;"
%{_prefix}/bin/mysql -uroot -p%{_dbrootpwd} -e "delete from mysql.user where Password='';"
%{_prefix}/bin/mysql -uroot -p%{_dbrootpwd} -e "delete from mysql.db where User='';"
%{_prefix}/bin/mysql -uroot -p%{_dbrootpwd} -e "delete from mysql.proxies_priv where Host!='localhost';"
%{_prefix}/bin/mysql -uroot -p%{_dbrootpwd} -e "drop database test;"
%{_prefix}/bin/mysql -uroot -p%{_dbrootpwd} -e "reset master;"

rm -rf /etc/ld.so.conf.d/{mysql,mariadb,percona,alisql}*.conf
[ -e "%{_prefix}/my.cnf" ] && rm -rf %{_prefix}/my.cnf
echo "%{_prefix}/lib" > /etc/ld.so.conf.d/mysql.conf
ldconfig
service mysqld restart
echo "mysql root:%{_dbrootpwd}" >> /root/mysql%{_mysqlflag}_password.txt

#rpm卸载前执行的脚本
%preun
service mysqld stop
chkconfig --del mysqld
id -u %{_runuser} >/dev/null 2>&1
[ $? -eq 0 ] && userdel %{_runuser}

#卸载后执行的脚本
%postun
Deldir() {
[ -d $1 ] && rm -rf $1
}

Deldir %{_prefix}
Deldir %{_datadir}
rm -rf /usr/local/mysql

%clean
rm -rf %{buildroot}

%files
%defattr(-, %{_runuser}, %{_rungroup})
%attr(744, %{_runuser}, %{_rungroup}) %{_prefix}/*

%changelog