linux环境自动化golang项目启动脚本解析

一.场景介绍

当在本地创建了golang项目,修改了代码功能,怎么在远程测试服务器上更新该功能呢,可以使用下面的步骤来解决该问题(这只是其中一种方法):

(1).推送最新代码到远程仓库

(2).在测试服务器上创建该项目并拉取最新代码

(3).创建deploy.sh脚本

(4).运行deploy.sh脚本

二.具体步骤

1.推送最新代码到远程仓库

这里不用多说,直接git push 到对应的分支即可,如果想了解更多git相关常用命令,请看:git常用命令

2.在测试服务器上创建该项目并拉取最新代码

这个也非常简单, 通过xshell等远程工具,进入测试服务器, 安装git后,使用git clone克隆远程仓库中的项目代码即可

3.创建deploy.sh脚本

创建deploy.sh脚本,在该脚本中编写需要的命令,比如: 拉取代码 git pull, 获取项目分支 git rev-parse --abbrev-ref HEAD, 清理和更新 Go 模块依赖 go mod tidy, 编译 Go 应用 go build, 重启服务 supervisorctl restart xxx等, 具体deploy.sh脚本案例如下:

bash 复制代码
#!/bin/bash
# 这个 Bash 脚本主要用于在生产环境中编译一个 Go 应用

#检查当前分支
#这部分代码获取当前 Git 分支的名称,并检查它是否为 dev 分支
#如果当前分支不是 dev 分支,则输出一条信息并退出脚本,返回状态码 1 表示失败
currentBranch=$(git rev-parse --abbrev-ref HEAD)
if [ $currentBranch != "dev" ]; then
  echo "当前分支不在dev分支上..."
  exit 1
fi

#创建输出目录:使用 mkdir -p 创建一个名为 bin 的目录。如果该目录已经存在,-p 参数将避免错误
mkdir -p ./bin


#更新代码库:拉取最新的代码,这将更新当前分支的内容
git pull


#获取信息
#获取当前 Go 版本
GoVersion=$(go version)
#当前 Git 分支: 如果获取 Git 分支信息失败,则返回 unsupported
GitBranch=$(git rev-parse --abbrev-ref HEAD  || echo unsupported)
#当前 Git 提交哈希:: 如果获取提交信息失败,则返回 unsupported
GitCommit=$(git rev-parse HEAD || echo unsupported)
#当前 Git 构建时间
BuildTime=$(date "+%Y-%m-%d %H:%M:%S")

#输出信息:输出获取到的信息,方便开发者进行调试和确认
echo "Go Version:" $GoVersion
echo "Git Branch:" $GitBranch
echo "Git Commit:" $GitCommit
echo "Build Time:" $BuildTime
echo "build dev start..."

#依赖管理:清理和更新 Go 模块依赖,确保 go.mod 和 go.sum 文件中的依赖是最新的
go mod tidy

#编译 Go 应用:
#设置 CGO_ENABLED=0,表示禁用 CGO,确保生成的二进制文件为纯 Go 编译
#设置目标操作系统为 linux,架构为 amd64
#使用 go build 命令编译当前目录下的 Go 应用,并通过 -ldflags 传递构建时的变量(Go 版本、分支、提交和构建时间)到 main 包中
#-o 指定输出路径,编译后的二进制文件将被放置在 /server/backend/bin/dev/dev
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "\
  -X 'main.GoVersion=$GoVersion' \
  -X 'main.GitBranch=$GitBranch' \
  -X 'main.GitCommit=$GitCommit' \
  -X 'main.BuildTime=$BuildTime' \
  " -o /server/backend/bin/dev/dev.
echo "build dev end..."

#使用 supervisorctl restart dev命令重启名为 dev的服务,以应用新的代码和更改
supervisorctl restart dev

对于上面代码:

-X 'main.GoVersion=$GoVersion' \

-X 'main.GitBranch=$GitBranch' \

-X 'main.GitCommit=$GitCommit' \

-X 'main.BuildTime=$BuildTime' \

传递构建时的变量(Go 版本、分支、提交和构建时间)到 main 包中,参考:

Go 复制代码
package main

import (
	"www.mygitlab.com/base/mylog"
)

var (
	GoVersion string
	GitBranch string
	GitCommit string
	BuildTime string
)

func init() {
	mylog.Infof("Go Version: %s", GoVersion)
	mylog.Infof("Git Branch: %s", GitBranch)
	mylog.Infof("Git Commit: %s", GitCommit)
	mylog.Infof("Build Time: %s", BuildTime)
}

4.运行deploy.sh脚本

使用sh delpoy.sh运行脚本即可重新自动化构建脚本,确保在特定的 Git 分支上编译 Go 应用,并在构建后重启相关服务

好了, 简单的自动化脚本部署就完成了

相关推荐
陈猪的杰咪16 小时前
GitHub Copilot 2026计费新规:AI Credits消耗解析与节省策略
人工智能·ai·架构·github·copilot
comcoo16 小时前
电脑自动干活不用值守!OpenClaw 本地部署完整实操流程
windows·开源·github·open claw部署·open claw部署包
Tokai_Teio_116 小时前
第四届黄河流域 misc
运维·服务器
hj28625117 小时前
Linux 网络服务综合笔记(概念 + 命令 + 实操案例)2
linux·运维·网络
what_201817 小时前
Linux 磁盘 (查看、划分、inode)
linux·运维·服务器
ManageEngine卓豪17 小时前
从性能故障到安全风险,现代企业数字化转型下的网络丢包运维管控指南
运维·网络安全·网络故障·网络丢包
海兰17 小时前
【web应用】Excel 项目数据自动化分析系统(AI 驱动分析)详细设计与部署指南(附源代码)
前端·人工智能·自动化·excel
Urbano18 小时前
工装 T 恤、Polo 衫全生产工序、痛点解析及多品牌自动化设备应用方案
运维·自动化
AOwhisky18 小时前
Redis 学习笔记(第一期):概述、安装配置与核心理论
运维·数据库·redis·笔记·学习·云计算
苏州邦恩精密19 小时前
2026江苏GOM三维扫描仪定制厂家找哪家?企业数字化转型视角
人工智能·机器学习·3d·自动化·制造