线上交付代码需要打成rpm 包,然后呢,我给运维的时候,运维说了句,你有空教我下,怎么打rpm包,当时我就惊呆了,表情是这样的,????。
其实 golang 能build 成二进制文件,所以,其实打rpm包和c 基本是一致的,使用rpmbuild 模块即可。下面以一个具体。重点就是编写spec 文件。
Name: hellorpm #名字为源码tar.gz 包的名字
Version: 1.0.0 #版本号,一定要与tar.gz包的一致哦
Release: 1%{?dist} #释出号,也就是第几次制作rpm
Summary: helloword #软件包简介,最好不要超过50字符
License: GPL #许可,GPL还是BSD等
URL: #可以写一个网址
Packager: abel
Source0: %{name}-%{version}.tar.gz
#定义用到的source,也就是你的源码
BuildRoot: %_topdir/BUILDROOT
#这个是软件make install 的测试安装目录.
BuildRequires: gcc,make #制作过程中用到的软件包
Requires: python-apscheduler >= 2.1.2-1.el7,python-daemon >= 1.6-1.el7 #软件运行依赖的软件包,也可以指定最低版本如 bash >= 1.1.1
%description #描述,随便写
%prep #打包开始
%setup -q #这个作用静默模式解压并cd
%build #编译制作阶段,主要目的就是编译,如果不用编译就为空
./configure \
%{?_smp_mflags} #make后面的意思是:如果就多处理器的话make时并行编译
%install #安装阶段
rm -rf %{buildroot} #先删除原来的安装的,如果你不是第一次安装的话
cp -rp %_topdir/BUILD/%{name}-%{version}/* $RPM_BUILD_ROOT
#将需要需要打包的文件从BUILD 文件夹中拷贝到BUILDROOT文件夹下。
#下面的几步pre、post、preun、postun 没必要可以不写
%pre #rpm安装前制行的脚本
%post #安装后执行的脚本
%preun #卸载前执行的脚本
%postun #卸载后执行的脚本
%clean #清理段,删除buildroot
rm -rf %{buildroot}
%files #rpm要包含的文件
%defattr (-,root,root,-) #设定默认权限,如果下面没有指定权限,则继承默认
/etc/hello/word/helloword.c #将你需要打包的文件或目录写下来
### 7.chagelog section 改变日志段
%changelog
我们要写的重点是什么呢?在% build 阶段build,在%install 阶段移动文件到目标文件夹,在 %pre 阶段做些清扫工作,在post 阶段添加安装后启动和添加开机启动。然后,完了。下面是我具体一个项目的实例:
#软件包简要介绍
Summary: build refresh_agent
#软件包的名字
Name: refresh_agent
#软件包的主版本号
Version: 0.0.1
#软件包的次版本号
Release: 1
#源代码包,默认将在上面提到的SOURCES目录中寻找
Source0: %{name}-%{version}.tar.gz
#授权协议
License: GPL
#软件分类
Group: Development/Tools
#软件包的内容介绍
%description
refresh_agent服务
#表示预操作字段,后面的命令将在源码代码BUILD前执行
%prep
#BUILD字段,将通过直接调用源码目录中自动构建工具完成源码编译操作
%build
cd /devops/app/go/src/refresh_agent
go build -o refresh_agent cmd/agent_bin.go
#file
#安装字段
%install
# 二进制执行文件
mkdir -p ${RPM_BUILD_ROOT}/usr/local/bin/
cp -f /devops/app/go/src/refresh_agent/refresh_agent ${RPM_BUILD_ROOT}/usr/local/bin/refresh_agent
# 日志目录
mkdir -p ${RPM_BUILD_ROOT}/bbd/logs/refresh_agent
# 配置文件
mkdir -p ${RPM_BUILD_ROOT}/etc/refresh_agent
cp -f /devops/app/go/src/refresh_agent/etc/online.config.ini ${RPM_BUILD_ROOT}/etc/refresh_agent/config.ini
#logrotate
mkdir -p ${RPM_BUILD_ROOT}/etc/logrotate.d
cp -f /devops/app/go/src/refresh_agent/etc/refresh_agent_logrotate.conf ${RPM_BUILD_ROOT}/etc/refresh_agent/refresh_agent_logrotate.conf
#日志搜集
mkdir -p ${RPM_BUILD_ROOT}/etc/rsyslog.d
cp -f /devops/app/go/src/refresh_agent/scripts/refresh_agent.conf ${RPM_BUILD_ROOT}/etc/rsyslog.d/refresh_agent.conf
# 控制脚本
mkdir -p ${RPM_BUILD_ROOT}/etc/init.d
cp -f /devops/app/go/src/refresh_agent/scripts/refresh_agent.sh ${RPM_BUILD_ROOT}/etc/init.d/refresh_agent
%post
# 添加开机自启动
# 更改权限
chmod 775 /etc/init.d/refresh_agent
# 加入自启动
chkconfig --add refresh_agent
echo -e "has added refresh_agent to chkconfig \n"
# 安装启动
/etc/init.d/refresh_agent start
echo -e "start log rewrite to /var/log/messsge \n"
#调用源码中安装执行脚本
#文件说明字段,声明多余或者缺少都将可能出错
%files
%defattr(-,root,root)
/usr/local/bin/refresh_agent
/etc/init.d/refresh_agent
/etc/rsyslog.d/refresh_agent.conf
/etc/refresh_agent/refresh_agent_logrotate.conf
%dir
/etc/refresh_agent
/bbd/logs/refresh_agent
因为golang 能打成二进制文件,所以制作rpm 很简单,相比起来,python 虽然也可以用ominibus等方式实现,但是就复杂多了。
有疑问加站长微信联系(非本文作者)