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

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

相关推荐
番茄啊6 小时前
linux 开启xftp连接
linux·运维·服务器
dong_junshuai6 小时前
每天一个开源项目#152 Auto Ontology:让业务口径进入SQL生成链
github
IT利刃出鞘7 小时前
Docker Compose--解决修改配置后不生效的问题
运维·docker·容器
Lsetea7 小时前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
Julien20047 小时前
管理机密(一)
运维·服务器·开发语言·学习方法
一条Go8 小时前
两套权限目录,三重闸门:Alioth 的多租户 RBAC 为什么这么拧
后端·程序员·github
imythu8 小时前
让 Claude Code 在家跑,我在外面用手机盯着:做一个开源工具踩过的几个坑
人工智能·github
十碗饭吃不饱8 小时前
后端运维:网络联通、进程查询、Java服务启动脚本
java·运维·网络
好用斋8 小时前
拾光坞安装网盘聚合LitePan:把Docker命令翻译成图形界面
运维·docker·容器
艾迪的技术之路9 小时前
16k 条慢查询,128 张分表,我这么解决
后端·github