go语言之美迅速打rpm包实现详解

目录
  • 引言
    • 各组件版本
    • 准备
    • 开始
    • service配置
    • 运行
  • 总结

引言

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

各组件版本

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

准备

  • rpmbuild命令
sudo yum install -y gcc make rpm-build redhat-rpm-config vim lrzsz
  • git 2.2.1 版本 先用源安装
yum install git -y

如果安装完发现git版本不对就手动安装

  • 编译好的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.rpm

总结

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

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

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

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

以上就是go语言之美迅速打rpm包实现详解的详细内容,更多关于go语言打rpm包的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go1.16新特性embed打包静态资源文件实现

    目录 背景 embed 嵌入 字符串.字节切片.文件嵌入 嵌入文件 嵌入文件夹 嵌入匹配 FS 文件系统 总结: 背景 相信有一部分人喜爱 GO 的初衷大概是:跨平台静态编译,如果在没用通过 CGO 引用其他库的话,一般编译出来的可执行二进制文件部署起来非常方便,但人们在实际中发现,使用 Go 语言开发的后端 WEB 程序存在 HTML 模版.图片.JS.CSS.JSON 等静态资源,部署时需要把这些静态资源与二进制程序一起上传到服务器部署,在现今遍地花容器的今天,为了简化部署流程,能不能更进一

  • goland把go项目打包进docker镜像的全过程记录

    目录 1. goland配置Dockerfile 2. goland构建项目 3. Dockerfile执行 总结 1. goland配置Dockerfile 项目中新建Dockerfile文件 配置Dockerfile 在项目中新建Dockerfile 文件,内容如下 FROM golang:alpine ENV GO111MODULE=on \ CGO_ENABLE=0 \ GOOS=linux \ GOARCH=amd64 \ GOPROXY="https://goproxy.cn,dir

  • go项目打包部署的完整步骤

    目录 1.go项目在window下编译简易打包 2.项目在window下打包成其他系统可运行的文件 3.项目在Mac下打包成其他系统可运行的文件 5.使用goreleaser多平台打包 总结 1.go项目在window下编译简易打包 1).在windows下直接编译生成main.exe文件 在项目main.go同级目录下执行以下命令 go build main.go 2).将当前目录下的main.go打包成gotest.exe文件(在windows下可以直接执行) 在项目main.go同级目录下

  • Golang打包配置文件的实现示例

    目录 背景 实现 工具 打包 调用 总结 众所周知,Golang 适合写 CLI 工具,但你可能还不知道 Golang 还可以打包配置文件. 背景 最近在写一个涉及到管理阿里云 ECS 的 CLI 工具,这里当然就要考虑阿里云资源使用的安全性了,要求阿里云账号的 AccessKeyId 和 AccessKeySecret 不能下发给 CLI 工具的使用者. 所以这里选择将一份包含 AccessKeyId 和 AccessKeySecret 的配置文件打包进了 CLI 工具中,CLI 工具的使用者

  • Go 实现一次性打包各个平台的可执行程序

    第一步: 安装插件 $ go get github.com/mitchellh/gox 第二步: 打包(必须 CD 到Golang 的 Main 文件所在的路径) 这种打包方式有弊端就是都放在了根目录下.而且文件名也改了; $ gox 分别放在不同的文件夹: $ gox -output "{{.Dir}}_{{.OS}}_{{.Arch}}/swbatch" 第三步: 根据需求打包出不同平台的可执行程序 只想打 Linux 系统下的可执行程序: $ gox -os="linu

  • 利用rpm打包上线部署golang代码的方法教程

    前言: 经过一段时间的测试验证,决定使用RPM来做Golang服务的部署方式. 我们组关于代码的部署方式主要有这么几种,Python直接使用virtualenv + py code的方式来上线,Lua 是直接打包,Golang 是先编译生成二进制之后,联合配置文件直接打包. 但由于我们开发的Golang的代码很多是基础组件,需要很多节点都去安装部署.那么这时候自己编译打包跟RPM的方式其实很是想象的,那还不如复用公司内部成熟的基于rpm的上线系统. 下面话不多说了,来一起看看详细的介绍吧. rp

  • Go语言包和包管理详解

    目录 1 包简介 1.1 工作空间 1.2 源文件 1.3 包命名 1.4 main 包 2导包 2.1 两种方式 2.2 包的别名 2.3 简洁模式 2.4非导入模式(匿名导入) 2.5 导包的路径 2.6 远程导入 3 初始化 init 3.1 init总结 4 包管理 4.1 演变过程 4.2 Go Model优点 4.3 启用go module 4.4 GOPROXY 5 go mod详解 5.1 go mod命令 5.2 go.mod说明 5.2.1 依赖的版本 5.2.2 repla

  • Linux 中常用的Rpm命令实例详解

    rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度. 语法 rpm(选项)(参数) 选项 -a:查询所有套件: -b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称: -c:只列出

  • yum安装本地rpm软件方案详解

    概述 面对无法联网的centos系统,安装rpm软件包是一个比较耗时的工作,尤其是那些包含很多依赖的软件包,如果用rpm命令安装,可以说是一个噩梦.这里根据个人实践发布一个比较完整方便的解决方案.(注:本方案在centos6.564bit测试可用) 具体方案 基本环境介绍 目标操作系统:centos6.564bit,下称"目标机"(无法联网用yum安装) 本地环境:在VMware下安装的纯净centos6.564bit,下称"虚拟机"(可以联网用yum下载安装包)

  • go语言入门环境搭建及GoLand安装教程详解

    Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型.编译型语言.Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算. Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

  • python中time包实例详解

    在python中基础的时间运用,离不开time函数的支持.这些函数为了方便调用集中放在一个地方,叫做time包.有的人会仔细追寻time包的来源,会发现它和C语言有密不可分的关系.下面我们简单介绍time包的概念,然后就包中的一些函数进行列举,并附上对应的使用方法. 1.概念 time包基于C语言的库函数(library functions).Python的解释器通常是用C编写的,Python的一些函数也会直接调用C语言的库函数. 2.time包中的函数 time.clock()返回程序运行的整

  • R语言常用两种并行方法之snowfall详解

    上一篇博客(R中两种常用并行方法之parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂到服务器上进行运行时,更看重的是其稳定性. 这时就要介绍R中的另一个并行利器--snowfall,这也是在平时做模拟时用的最多的一种方法. 针对上篇中的简单例子 首先是一个最简单的并行的例子,这个例子不需要载入任何依赖库.函数.对象等.相对也比较简单: library(snowfall) # 载入snowf

  • R语言常用两种并行方法之parallel详解

    目录 并行计算 在模拟时什么地方可以用到并行? 怎么在R中看我们可以使用并行? parallel(简单) 由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfall,这两种方法各有优缺,但还是推荐snowfall,整体较为稳定,不容易因为内存不足或者并行线程过多等原因而报错. 并行计算 并行计算: 简单来讲,就是同时使用多个计算资源来解决一个计算问题,是提高计算机系统计算速度和处理能力的一种有效手段.(参考:并行计算简介) 一个问题被分解成为一系列可以并发执行的离

  • R语言刷题检验数据缺失类型过程详解

    目录 题目 解答 下面考虑三种情况: 1. a = 0, b = 0 2. a = 2, b = 0 3. a = 0, b = 2 题目 解答 由于题目要求需要重复三次类似的操作,故首先载入所需要的包,构造生成数据的函数以及绘图的函数: library(tidyr) # 绘图所需 library(ggplot2) # 绘图所需 # 生成数据 GenerateData <- function(a = 0, b = 0, seed = 2018) { set.seed(seed) z1 <- r

  • Go语言基础go build命令用法及示例详解

    目录 go build 一个Go项目在GOPATH下,会有如下三个目录 使用: 注意: go build 1. 用于测试编译多个包或一个main包 2. build命令编译包丢弃非main包编译结果,只是检查是否能够被编译 3. 保留main包编译结果 一个Go项目在GOPATH下,会有如下三个目录 bin存放编译后的可执行文件 pkg存放编译后的包文件 src存放项目源文件 一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可. 使用:

  • Go语言基础if条件语句用法及示例详解

    目录 概述 语法 格式规则 概述 条件语句需要开发者通过指定一个或多个条件 并通过测试条件是否为 true 来决定是否执行指定语句 并在条件为 false 的情况再执行另外的语句. 语法 package main func main() { //第一种格式 if 条件表达式 { 语句1 } //第二种格式 if 初始化表达式; 条件表达式 { 语句1 } //第三种格式 if 初始化表达式; 条件表达式 { 语句1 }else{ 语句2 } //第四种格式 if 初始化表达式; 条件表达式 {

随机推荐