温馨提示×

Golang在CentOS打包流程是怎样的

小樊
38
2025-12-23 15:58:32
栏目: 编程语言

在 CentOS 上打包 Golang 应用的标准流程


一 准备环境

  • 安装 Go(两种常用方式,二选一)
    • 使用 yum 安装发行版包:sudo yum install -y golang
    • 或下载官方二进制包并解压到 /usr/local:
      • wget https://dl.google.com/go/go1.23.3.linux-amd64.tar.gz
      • sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
  • 配置环境变量(写入 /etc/profile 或 ~/.bashrc)
    • export GOROOT=/usr/local/go
    • export GOPATH=$HOME/go
    • export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    • 使配置生效:source /etc/profile 或 source ~/.bashrc
  • 验证安装:go version 应输出版本号

二 编译与本地打包

  • 使用 Go Modules 管理依赖
    • go mod init example.com/myapp
    • go mod tidy
  • 交叉编译为 Linux 目标(在 CentOS 上构建 Linux amd64 常用)
    • GOOS=linux GOARCH=amd64 go build -o myapp main.go
  • 常用编译优化
    • 减小体积:go build -ldflags “-s -w” -o myapp
    • 完全静态链接(避免外部 C 库依赖):CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags “-extldflags ‘-static’” -o myapp
  • 产物打包为压缩归档(便于传输与备份)
    • tar -czvf myapp-linux-amd64.tar.gz myapp config/ 或 upx --best myapp(需安装 UPX)

三 制作 RPM 包便于分发与安装(可选)

  • 安装构建工具
    • sudo yum install -y rpm-build rpmdevtools
  • 初始化 rpmbuild 目录结构
    • rpmdev-setuptree(生成 ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS})
  • 准备源码与 spec
    • 将可执行文件与配置放入 ~/rpmbuild/SOURCES/myapp-1.0.tar.gz
    • 编辑 ~/rpmbuild/SPECS/myapp.spec(示例要点)
      • Name: myapp
      • Version: 1.0
      • Release: 1%{?dist}
      • Summary/License/URL 按需填写
      • Source0: %{name}-%{version}.tar.gz
      • BuildRequires: golang
      • Requires: golang
      • %description、%prep、%build、%install、%files、%changelog 按需填写
  • 构建 RPM
    • rpmbuild -ba ~/rpmbuild/SPECS/myapp.spec
    • 产物位于:~/rpmbuild/RPMS/x86_64/myapp-1.0-1.el7.x86_64.rpm(路径随系统和版本变化)
  • 使用 go-srpm-macros 与 Mock(CentOS 7/8 推荐)
    • 安装 go-srpm-macros 并在 .spec 中使用相关宏
    • 生成 SRPM:rpmbuild -bs SPECS/myapp.spec
    • 用 Mock 在隔离环境构建:mock -r centos-7-x86_64 --rebuild SPECS/myapp.src.rpm

四 部署与运行

  • 上传与权限
    • scp myapp-linux-amd64 user@host:/opt/myapp/
    • ssh user@host “chmod +x /opt/myapp/myapp”
  • 运行与守护
    • 前台:/opt/myapp/myapp
    • 后台:nohup ./myapp > app.log 2>&1 &
    • 进程守护示例脚本(循环检测并拉起):
      • PROGRAM=“/opt/myapp/myapp”
      • LOG=“/opt/myapp/app.log”
      • start() { nohup “$PROGRAM” >> “$LOG” 2>&1 & }
      • check() { pgrep -f “$PROGRAM” >/dev/null || start; }
      • while true; do sleep 120; check; done
  • 前端静态资源与反向代理(如 Go + Vue)
    • Vue 先打包:npm run build,将产物放到 Nginx/宝塔静态站点
    • Go 二进制作为后端服务,通过域名反向代理到后端端口

五 常见问题与优化建议

  • 静态编译更通用:在目标服务器缺少 C 库时,使用 CGO_ENABLED=0 静态构建可显著降低运行失败概率
  • 构建参数建议:生产构建常用 -ldflags “-s -w” 去除符号与调试信息,必要时再配合 UPX 压缩
  • 多架构交付:同一代码库可批量交叉编译(GOOS=linux, windows, darwin;GOARCH=amd64, arm64 等),分别产出产物
  • 自动化交付:结合 GitHub Actions 或 Jenkins,在 CI 中完成构建、制品归档与 SSH 发布,缩短发布链路

0