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 应用,并在构建后重启相关服务

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

相关推荐
honey ball5 小时前
R & S的EMI接收机面板
linux·运维·网络
木下-俱欢颜6 小时前
搭建基于chrony+OpenSSL(NTS协议)多层级可信时间同步服务
运维·网络安全·udp·ssl
旧故新长7 小时前
访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
运维·docker·容器
柳如烟@7 小时前
在Rocky Linux 9.5上部署MongoDB 8.0.9:从安装到认证的完整指南
linux·运维·mongodb
qianmoQ8 小时前
GitHub 趋势日报 (2025年05月11日)
github
struggle20258 小时前
AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。
人工智能·开源·自动化
搬码临时工8 小时前
电脑怎么远程访问服务器?4种常见的简单方法
运维·服务器·网络·异地访问
北漂老男孩8 小时前
ChromeDriver 技术生态与应用场景深度解析
java·爬虫·python·自动化
QQ2740287568 小时前
Kite AI 自动机器人部署教程
linux·运维·服务器·人工智能·机器人·web3
文牧之8 小时前
PostgreSQL 配置设置函数
运维·数据库·postgresql