golang 使用 rpm 包交付部署

鼎铭 · · 5310 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

    线上交付代码需要打成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等方式实现,但是就复杂多了。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:鼎铭

查看原文:golang 使用 rpm 包交付部署

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5310 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传