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