go mod 打包成 deb/rpm

deb

目录

DEBIAN go.mod main.go

1
2
3
4
5
6
7
8
9
total 40
drwxr-xr-x   7 wyx  staff  224 10 25 14:48 .
drwxr-xr-x  23 wyx  staff  736 10 25 16:32 ..
-rw-r--r--   1 wyx  staff  266 10 25 14:48 control #644
-rwxr-xr-x   1 wyx  staff  406 10 18 16:15 postinst # 其他 755
-rwxr-xr-x   1 wyx  staff  208  4  3  2020 postrm
-rwxr-xr-x   1 wyx  staff  240 10 18 16:14 preinst
-rwxr-xr-x   1 wyx  staff  262 10 18 16:16 prerm

DEBIAN 权限

下载依赖

export GOPROXY=https://goproxy.io && go mod download

设置代理快一点

go build

$GOPATH/go.mod exists but should not go build 的时候不要设置 GOPATH

1
export GO111MODULE=off

DEBIAN

打包这个不能缺

  • control 文本文件 相关描述

https://www.debian.org/doc/debian-policy/ch-controlfields.html#binary-package-control-files-debian-control

1
2
3
4
5
6
7
8
9
10
11
12
13
Package: xxxx
Version: {AGENT_VERSION}
Section:
Priority: xxxx
Depends:
Suggests:
Architecture: {DEB_ARCH}
Installed-Size: 
Maintainer: xxxx
Original-Maintainer: xxxx
Provides: xxxx
Description: xxxx
Homepage: xxxx

软件包安装前后自动运行的可执行脚本. 统称为控制文件

  • preinst 解压前执行的脚本
  • postinst 安装完成后所需的配置工作
  • prerm 停止一个软件包的相关进程 卸载软件包的相关文件前执行
  • postrm 卸载软件包的相关文件

/var/lib/dpkg/info可以参考,foo 软件包相关的命名以 foo 开头,以 preinst, postinst, 等为扩展。这个目录下的 foo.list 文件列出了软件包安装的所有文件。

dpkg命令

1
2
3
4
5
6
7
8
9
# 安装
dpkg -i <package_file_path>

# 查看安装情况
dpkg -l |grep xxx

# 卸载 -r 选项只会移除指定的软件包而不对其配置文件产生影响,可以使用 -P 选项在删除软件包的同时清理配置文件
dpkg -r xxx

详细dpkg

rpm

1
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
  • BUILD:源码解压以后放的目录
  • RPMS:制作完成后的rpm包存放目录
  • SOURCES:存放源文件,配置文件,补丁文件等放置的目录【常用】
  • SPECS:存放spec文件,作为制作rpm包的文件,即:nginx.spec……【常用】
  • SRPMS:src格式的rpm包目录
  • BuiltRoot:虚拟安装目录,即在整个install的过程中临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的文件,才是真正的目录文件。最终,Spec文件中最后有清理阶段,这个目录中的内容将被删除

RPM Packaging Guide

scriptlets 执行order

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
Name: xxx-cluster-agent
Version: %{?agent_version}
Release: %{?dist}

Summary: xxx-cluster-agent servcie
Group: Applications/System
License: chinaunion


%description





%install //虚拟根相当于安装后系统根目录 构建工件的放置应符合最终用户系统的文件系统层次结构标准。
mkdir -p %{buildroot}%{_bindir}  
cp xxx-cluster-agent %{buildroot}%{_bindir}
cp -r etc %{buildroot}


%clean
rm -rf %{_builddir}/*

%files   // The list of files that will be installed in the end user’s system.
%{_bindir}/xxx-cluster-agent
/etc/unilin_cluster_agent/*
/etc/systemd/system/xxx-cluster-agent.service

%post //安装后准备操作
systemctl daemon-reload
systemctl enable xx.service
systemctl restart xx.service

%preun //卸载前准备操作
systemctl stop xx.service
systemctl disable xx.service

%postun //卸载后准备操作
systemctl daemon-reload
rm -rf /etc/xxx

rpmbuild –showrc

Spec文件的宏定义:

rpmbuild –showrc | grep topdir #工作车间目录:_topdir /root/rpmbuild -14: _builddir %{_topdir}/BUILD -14: _buildrootdir %{_topdir}/BUILDROOT -14: _rpmdir %{_topdir}/RPMS -14: _sourcedir %{_topdir}/SOURCES -14: _specdir %{_topdir}/SPECS -14: _srcrpmdir %{_topdir}/SRPMS -14: _topdir /root/rpmbuild

看到一个不熟悉的宏,您可以使用以下命令对其进行评估

1
2
rpm --eval %{_bindir}
rpm --eval %{?dist}

rpm 命令

1
2
3
4
5
6
7
8
# 安装
rpm -ivh xxx.rpm
# 更新
rpm -Uvh xxx.rpm
# 查看
rpm -qa | grep PackageName
# 卸载
rpm -e [ PackageName ]

docker 构建

编译环境

deb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM ubuntu:18.04

COPY sources.list /etc/apt/sources.list

# 安装依赖
RUN apt update \
    && apt upgrade -y \
    && apt install -y --no-install-recommends wget tar build-essential pkg-config ca-certificates \
    && update-ca-certificates

# 安装 golang 环境
#  https://golang.org/dl/go1.17.2.linux-amd64.tar.gz
RUN wget  https://studygolang.com/dl/golang/go1.17.2.linux-amd64.tar.gz \
    && tar -C /usr/local -xzf go1.17.2.linux-amd64.tar.gz \
    && rm go1.17.2.linux-amd64.tar.gz

# 编译
ENV GOPROXY="https://goproxy.cn"  \
    PATH="${PATH}:/usr/local/go/bin"

rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM centos:7

COPY Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo

## 安装依赖
RUN yum update -y \
    && yum upgrade -y \
    && yum install -y wget rpm-build


# 安装 golang 环境
#  https://golang.org/dl/go1.17.2.linux-amd64.tar.gz
RUN wget  https://studygolang.com/dl/golang/go1.17.2.linux-amd64.tar.gz \
    && tar -C /usr/local -xzf go1.17.2.linux-amd64.tar.gz \
    && rm -f go1.17.2.linux-amd64.tar.gz

# 编译
ENV GOPROXY="https://goproxy.cn"  \
    PATH="${PATH}:/usr/local/go/bin"

构建

deb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM xxxx/go/ubuntu_builder
ARG AGENT_VERSION
ENV WORK_DIR=/xxx-cluster-agent
ENV BUILD_PATH=${WORK_DIR}/build

# go build
WORKDIR ${WORK_DIR}
COPY go.* ${WORK_DIR}/
RUN go version && go mod download
COPY . ${WORK_DIR}
RUN go build -ldflags "-w -s"


# build deb
RUN mkdir -p ${BUILD_PATH}/usr/bin\
    && cp xxx-cluster-agent ${BUILD_PATH}/usr/bin \
    && cp -r etc ${BUILD_PATH} \
    && cp -r DEBIAN ${BUILD_PATH} \
    && sed -i "s/AGENT_VERSION/${AGENT_VERSION}/g" ${BUILD_PATH}/DEBIAN/control \
    && dpkg -b ${BUILD_PATH} xxx-cluster-agent-${AGENT_VERSION}.deb
1
2
3
4
5
6
7
8
9
10
11
12
AGENT_VERSION=1.0.1
IMAGE_NAME=xxx-cluster-agent/deb
CONTAINER_NAME=agent_deb

docker build  \
    --build-arg AGENT_VERSION=${AGENT_VERSION} \
    -t ${IMAGE_NAME} -f deb.Dockerfile .

# 把编译好的东西拿出
docker run -d --rm --name ${CONTAINER_NAME} ${IMAGE_NAME} sleep 1m
docker cp ${CONTAINER_NAME}:/xxx-cluster-agent/xxx-cluster-agent-${AGENT_VERSION}.deb xxx-cluster-agent-${AGENT_VERSION}.deb
docker kill ${CONTAINER_NAME}

rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM xxxx/go/centos_builder
ARG AGENT_VERSION
ENV WORK_DIR=/xxx-cluster-agent
ENV BUILD_PATH=/root/rpmbuild/BUILD

# go build
WORKDIR ${WORK_DIR}
COPY go.* ${WORK_DIR}/
RUN go version && go mod download
COPY . ${WORK_DIR}
RUN go build -ldflags "-w -s"


# build rpm
RUN mkdir -p ${BUILD_PATH}  \
    && cp xxx-cluster-agent ${BUILD_PATH} \
    && cp -r etc ${BUILD_PATH} \
    && rpmbuild -bb xxx-cluster-agent.spec --define "agent_version ${AGENT_VERSION}"
1
2
3
4
5
6
7
8
9
10
11
12
AGENT_VERSION=1.0.1
IMAGE_NAME=xxx-cluster-agent/rpm
CONTAINER_NAME=agent_rpm

docker build  \
    --build-arg AGENT_VERSION=${AGENT_VERSION} \
    -t ${IMAGE_NAME} -f rpm.Dockerfile .


docker run -d --rm --name ${CONTAINER_NAME} ${IMAGE_NAME} sleep 1m
docker cp ${CONTAINER_NAME}:/root/rpmbuild/RPMS/x86_64/xxx-cluster-agent-${AGENT_VERSION}-.el7.x86_64.rpm .
docker kill ${CONTAINER_NAME}