什么是 FPM ?
fpm 是一个命令行程序,旨在帮助您构建软件包。fpm 的目标是使构建软件包(如rpm,deb,OSX 软件包等)变得轻松快捷。
1. 安装 FPM
安装依赖和语言包
yum -y install ruby rubygems ruby-devel gcc
添加阿里云的 Rubygems 仓库,外国的源慢
gem sources -a http://mirrors.aliyun.com/rubygems/
移除原生的 Ruby 仓库
gem sources --remove http://rubygems.org/
安装 fpm
gem install fpm
此时报错:
[root@ops-rpmbuild01 ~]# gem install fpm
Building native extensions. This could take a while...
Building native extensions. This could take a while...
ERROR: Error installing fpm:
ruby-xz requires Ruby version >= 1.9.3.
解决办法是 先安装 rvm,再把 ruby 版本提升至 2.3.3
$ gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
$ curl -L get.rvm.io | bash -s stable
$ source /usr/local/rvm/scripts/rvm
$ rvm list known
$ rvm install 2.7.0
$ rvm use 2.7.0
$ . /etc/profile
$ ruby -v
1. *# 查看gcc版本是否在5.3以上,centos7.6默认安装4.8.5*
2. gcc -v
3. *# 升级gcc到5.3及以上,如下:*
4. 升级到gcc 9.3:
5. yum -y install centos-release-scl
6. yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
7. scl enable devtoolset-9 bash
8. 需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
9. 如果要长期使用gcc 9.3的话:
10.
11. echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
12. 这样退出shell重新打开就是新版的gcc了
13. 以下其他版本同理,修改devtoolset版本号即可。
再次安装fpm
gem install fpm
# fpm -h #查看命令的帮助,下面对常用的参数进行简单的说明
# -s:指定源类型
# -t:指定目标类型
# -n:指定名字
# -v:指定版本号
# -C:指定打包的相对路径
# -d:指定依赖于哪些包
# -f:第二次打包时目录下如果有同名安装包存在,则覆盖它
# -p:输出的安装包的目录,不想放在当前目录下就需要指定
# --post-install 软件包安装完成之后所要运行的脚本;同--after-install
# --pre-install 软件包安装完成之前所要运行的脚本;同--before-install
2. 实战案例
- 构建 redis RPM 包
tar xf redis-6.0.6.tar.gz
cd redis-6.0.6/
make PREFIX=/tmp/redis install
mkdir /tmp/redis/etc/{redis,systemd/system} -p
cp redis.conf sentinel.conf /tmp/redis/etc
# redis 服务启动脚本
echo '[Unit]
Description=redis server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="REDIS_CONF=/etc/redis/redis.conf"
ExecStart=/usr/bin/redis-server ${REDIS_CONF}
ExecStop=/bin/kill ${MAINPID}
Restart=on-failure
[Install]
WantedBy=multi-user.target'>/tmp/redis/etc/systemd/system/redis.service
cd /tmp
$ cat redis-post-uninstall.sh
#!/bin/bash
#
pidof redis-server && kill $(pidof redis-server)
systemctl daemon-reload
# 构建 RPM 包
fpm -s dir -t rpm -n redis -v 6.0.6 -C ./redis/ --post-uninstall redis-post-uninstall.sh -p redis-VERSION_ARCH.rpm -f
- 构建 jdk RPM 包
tar xf jdk-8u201-linux-x64.tar.gz -C /tmp
cd /tmp/jdk1.8.0_201/
mkdir usr/local/jdk1.8.0_201 -p
mv * usr/local/jdk1.8.0_201/
$ pwd
/tmp/jdk1.8.0_201/usr/local/jdk1.8.0_201
$ cd /tmp/jdk1.8.0_201/
$ mkdir etc/profile.d -p
$ cd etc/profile.d/
$ echo '
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
'>jdk.sh
$ chmod +x jdk.sh
$ cd /tmp/jdk1.8.0_201/usr/local
$ ln -s jdk1.8.0_201/ jdk
$ cat jdk-post-uninstall.sh
#!/bin/bash
#
[ -e /usr/local/jdk1.8.0_201 ] && rm -rf /usr/local/jdk1.8.0_201
$ fpm -s dir -t rpm -n jdk -v 8u201 -C /usr/local/jdk1.8.0_201 -p jdk-VERSION_ARCH.rpm --post-uninstall jdk-post-uninstall.sh -f
- 构建 Tomcat RPM 包
tar xf apache-tomcat-9.0.37.tar.gz -C /tmp
cd /tmp/apache-tomcat-9.0.37/
mkdir usr/local/apache-tomcat-9.0.37 -p
mv * usr/local/apache-tomcat-9.0.37/
mkdir etc/systemd/system/ -p
cd usr/local/
ln -s apache-tomcat-9.0.37/ tomcat9
cd apache-tomcat
$ cat etc/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat9/bin/startup.sh
ExecStop=/usr/local/tomcat9/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
$ cd /tmp
$ cat tomcat-post-uninstall.sh
#!/bin/bash
#
#[ -e /usr/local/apache-tomcat-9.0.37 ] && rm -rf /usr/local/apache-tomcat-9.0.37
#kill $(ps -ef | grep "apache-tomcat" | grep -v grep | awk '{print $2}')
systemctl stop tomcat 2>/dev/null
systemctl daemon-reload
[ -e /usr/local/apache-tomcat-9.0.37 ] && rm -rf /usr/local/apache-tomcat-9.0.37
$ fpm -s dir -t rpm -n apache-tomcat -v 9.0.37 -C ./apache-tomcat-9.0.37/ --post-uninstall tomcat-post-uninstall.sh -p apache-tomcat-VERSION_ARCH.rpm -d jdk -f