分享
  1. 首页
  2. 文章

golang 使用 rpm 包交付部署

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

线上交付代码需要打成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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏