mysql5.5、5.6打包rpm

作者: ropon 分类: 经验分享 发布时间: 2018-07-06 12:25
1、安装rpm工具包
yum install rpmbuild rpmdevtools -y

2、初始化rpm基础目录,目录结构如下
 
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、执行命令打包
rpmbuild -bb rpmbuild/SPECS/mysql.spec

5、完成后在rpmbuild/RPM目录下就会两个rpm包
-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
rpm -ivh MySQL-5.6.40-1.el6.x86_64.rpm

不关闭服务直接卸载
rpm -e --nodeps MySQL-5.6.40-1.el6.x86_64

#语法:
#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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!