go-应用-打包-rpm-发布

go应用程序可以打包成rpm包在centos系统发布

我们可以采取以下两种方式打包rpm包:

  1. 直接把源码包放到打包路径的SOURCES目录下
  2. 把应用编译成二进制文件放到打包路径的BUILDROOT目录下

本文采用第二种方式

系统环境

OS版本:Centos7.5
Go版本:go-1.12.9

环境依赖

安装打包软件

1
yum install rpmdevtools

打包

准备打包目录

1
rpmdev-setuptree

会在当前用户home目录下生成如下目录:

1
2
3
4
5
6
7
--rpmbuild/
--BUILD/
--BUILDROOT/
--RPMS/
--SOURCES/
--SRPMS/
--SPECS/

rpmbuild/SOURCES 是用于放置源文件压缩包的(eg: *.tar.gz), rpmbuild/BUILD 源文件会解压到当前目录, rpmbuild/BUILD 放置编译后的二进制文件, rpmbuild/RPMS 放置生成的rpm包, rpmbuild/SRPMS 放置生成的包含源码的rpm包, rpmbuild/SPECS 放置编译文件
我们通过编辑rpmbuild/SPECS/ 下的配置文件,然后执行如下命令生成rpm包:

1
rpmbuild -bb SPECS/client.specs

生成二进制文件

到我们应用放置main包的目录,执行:

1
go build main.go // 如果有多个go文件,有依赖的都需要加上:go build main.go version.go, 否则会报错

然后把生成的二进制文件放置到: rpmbuild/BUILDROOT/ 目录下

编辑spec文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
cat rpmbuild/SPECS/client.spec
Name: client
Version: 1.0.0
Release: 1%{?dist}
Summary: Test rpm build
License: GPL
#Source0: %{name}-%{version}.tar.gz
#BuildRoot: %_topdir/BUILDROOT
#BuildRequires: gcc,make
%description
Gocm test
# rpm安装前执行的脚本
%prep
# rpm安装后执行的脚本
%post
systemctl daemon-reload
# rpm卸载前执行的脚本
%preun
# rpm卸载后执行的脚本
%postun
rm -rf /usr/local/client
rm -rf /usr/lib/systemd/system/client.service
systemctl daemon-reload
%build
%install
mkdir -p $RPM_BUILD_ROOT/usr/local/client
mkdir -p $RPM_BUILD_ROOT/usr/local/client/logs
mkdir -p $RPM_BUILD_ROOT/usr/local/client/conf
mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/system
cp -f /root/client.conf $RPM_BUILD_ROOT/usr/local/client/conf/
cp -f %{_topdir}/BUILDROOT/client $RPM_BUILD_ROOT/usr/local/client/
cp -f /root/go_projects/src/gocm/scripts/systemd/client.service $RPM_BUILD_ROOT/usr/lib/systemd/system/client.service
%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
# 定义哪些文件或目录会放入rpm中
%files
%defattr(-,root,root)
/usr/local/client/client
/usr/local/client/conf/client.conf
/usr/lib/systemd/system/client.service

设置启动文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat client.service
[Unit]
Description=client
After=network.target
[Service]
ExecStart=/usr/local/client/client
Type=simple
PIDFile=/usr/local/client/client.pid
Restart=always
RestartSec=5
StandardOutput=null
[Install]
WantedBy=default.target

打包

1
2
cd rpmbuild
rpmbuild -bb SPECS/client.spec

然后再RPMS/ 目录下会看到生成的rpm文件

注意事项

  • 不同的操作系统生成的二进制文件不同,不能混淆(Mac下编译的二进制,在Centos下不能使用)