golang 使用 rpm 包交付部署

    线上交付代码须要打成rpm 包,而后呢,我给运维的时候,运维说了句,你有空教我下,怎么打rpm包,当时我就惊呆了,表情是这样的,😳。python

 该文章后续仍在不断的更新修改中, 请移步到原文地址http://dmwan.ccgolang

    其实 golang 能build 成二进制文件,因此,其实打rpm包和c 基本是一致的,使用rpmbuild 模块便可。下面以一个具体。重点就是编写spec 文件。bash

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 阶段添加安装后启动和添加开机启动。而后,完了。下面是我具体一个项目的实例:app

#软件包简要介绍
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等方式实现,可是就复杂多了。运维

相关文章
相关标签/搜索