打rpm包是如此的迅速(go语言之美)

简介: 打rpm包是如此的迅速(go语言之美)

之前写过一篇如何手操rpm包,这次写写go语言打包有多爽。



aHR0cHM6Ly9pbWdrci5jbi1iai51ZmlsZW9zLmNvbS8wODE5OWY1ZC1iN2Q0LTQxOTMtYTJkNy1hZDZhMjlmZWRlMjUucG5n.png

各组件版本


# git大版本小于2搞不了
git 2.2.1
go 1.13.6


准备


  1. rpmbuild 命令
sudo yum install -y gcc make rpm-build redhat-rpm-config vim lrzsz


  1. git 2.2.1 版本
    先用源安装
yum install git -y


如果安装完发现git版本不对就手动安装(参考今天的第二篇文章)


  1. 编译好的 go 文件或者等待安装的文件(不局限于 go 打包)
    当然啦,不准备好能跑的文件搞鸡毛啊。


开始


你需要一个 json 文件,告诉系统你想把哪些文件放到rpm包里,

build,安装前,安装后做什么事情。


这里以打openstack-exporter为例(一个 go 程序)

{
  "name": "openstack-exporter",
  "version": "0.9.0",
  "release": "release",
  "arch": "amd64",
  "summary": "RPM_SUMMARY",
  "description": "RPM_SUMMARY",
  "license": "Tencent.com",
  "url": "http://git.code.oa.com/",
  "postinst": "ci/package/rpm/postinst",
  "files": [
    {
      "from": "./bin/LinuxAmd64/!name!",
      "to": "/usr/local/bin/",
      "base": "",
      "type": ""
    },
    {
      "from": "!name!.service",
      "to": "/usr/lib/systemd/system/",
      "base": "",
      "type": ""
    },
    {
      "from": "clouds.yaml",
      "to": "/etc/openstack/",
      "base": "",
      "type": ""
    }
  ]
}


核心配置含义:


“name”: “openstack-exporter” 代表你的rpm服务名,你可以

rpm -e openstack-exporter直接卸载他。

“arch”: “amd64” 内核:x86_64,也可以用其他内核。

files 要拷贝到rpm包中的文件,from to 从本地某个文件到包内目录。

“postinst”: “ci/package/rpm/postinst” 安装完执行的脚本

脚本内容

systemctl daemon-reload

我打算把这个服务用systemctl托管起来,如果不需要删掉就可以


service 配置


这是给systemctl用的,上面也写了拷贝后的路径/usr/lib/systemd/system/

配置文件取名:服务名+.service


openstack-exporter.service

[Unit]
Description=openstack exporter
After=network.target
[Service]
Environment=
User=root
Group=root
PermissionsStartOnly=true
ExecStart=/usr/local/bin/openstack-exporter default
Restart=always
LimitNOFILE=65535
WorkingDirectory=/
[Install]
WantedBy=multi-user.target

含义一看不是今天要说的,不解释。当然你也可以用任何守护进程来托管你的服务。


运行


我比较喜欢把好用的go包放在一个公共目录里例如/root/go

编译后得到的二进制当系统命令来用,只需要执行

echo "export PATH=\$PATH:/root/go/bin" >> /etc/bashrc
export PATH=$PATH:/root/go/bin

/root/go是默认的GOPATH,可以不管。

安装go-bin-rpm命令

GOPATH=/root/go
mkdir -p $GOPATH/src/github.com/mh-cbon/go-bin-rpm
cd $GOPATH/src/github.com/mh-cbon/go-bin-rpm
git clone https://github.com/mh-cbon/go-bin-rpm.git .
glide install
go install

打包只要一行命令


go-bin-rpm generate -f rpm_linux_amd64.json -o ./rpms/openstack-exporter-0.9.0_amd64.rp


总结


要用这个组件来打包要准备


  1. json文件用来描述拷贝哪些文件到实际安装的目录,打包前后运行哪些命令
  2. 注册相应守护进程需要的文件


我们还学会了新建一个目录专门防止go语言共同包以及编译好的go二进制文件,当作新的命令使用。


如果你把这个东西封装到 持续集成 里,会有多爽,你懂的。

相关文章
|
5天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
23 2
|
9天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
3天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
11 2
|
3天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
14 2
|
8天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
30 7
|
8天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
38 5
|
8天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
25 1
|
7天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
84 58
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
7天前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
25 9