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

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

相关推荐
喵叔哟1 小时前
2. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务概述与演变
运维·微服务
苹果醋32 小时前
Kubeflow——K8S的机器学习利器
运维·vue.js·spring boot·nginx·课程设计
数据的世界013 小时前
VMware下Linux和macOS遇到的一些问题总结
linux·运维·macos
兔兔爱学习兔兔爱学习3 小时前
使用Cline+deepseek实现VsCode自动化编程
ide·vscode·自动化
深蓝宇科技3 小时前
激光工控机在自动化领域中有哪些作用?
计算机视觉·自动化·激光工控机
向着开发进攻3 小时前
Linux 常用命令与实战教程
linux·运维·服务器
九州~空城5 小时前
Linux中系统相关指令(一)
linux·运维·服务器
程序员光一6 小时前
2周2.5k星! 网络问题排查神器 kyanos 介绍
后端·开源·github
你好呀我是裤裤7 小时前
Linux:指令大全(二)
linux·运维·服务器