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

embedded/2025/2/8 4:04:48/

一.场景介绍

当在本地创建了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脚本案例如下:

sh">#!/bin/bash
# 这个 Bash 脚本主要用于在生产环境中编译一个 Go 应用#检查当前分支
#这部分代码获取当前 Git 分支的名称,并检查它是否为 dev 分支
#如果当前分支不是 dev 分支,则输出一条信息并退出脚本,返回状态码 1 表示失败
currentBranch=$(git rev-parse --abbrev-ref HEAD)
if [ $currentBranch != "dev" ]; thenecho "当前分支不在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 包中,参考:

package mainimport ("www.mygitlab.com/base/mylog"
)var (GoVersion stringGitBranch stringGitCommit stringBuildTime 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 应用,并在构建后重启相关服务

 

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


http://www.ppmy.cn/embedded/160455.html

相关文章

离线安装Appium Server

1、问题概述? 安装Appium通常有两种方式: 第一种:下载exe安装包,这种是Appium Server GUI安装方式,缺点是通过命令启动不方便。 第二种:通过cmd安装appium server,可以通过命令方式启动,比较方便。 问题:在没有外网的情况下,无法通过命令在cmd中安装appium server…

操作系统和中间件的信息收集

在浏览器中收集操作系统与中间件信息时,主要通过客户端JavaScript(用于操作系统/浏览器信息)和服务器端脚本(用于中间件信息)实现。以下是分步指南: 一、客户端操作系统信息收集(JavaScript&am…

OSCP - Other Machines - sar2HTML

主要知识点 路径枚举cronjob提权 具体步骤 nmap扫描,只开了一个80端口 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-31 19:13 CST Nmap scan report for 172.16.33.13 Host is up (0.035s latency). Not shown: 65534 closed tcp ports (conn-refus…

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

React中为每个列表项显示多个DOM节点的解决方案

React中为每个列表项显示多个DOM节点的解决方案 问题背景&#xff1a;Fragment的简写形式的限制解决方案&#xff1a;使用显式的<Fragment>组件实现步骤 其他替代方案方法一&#xff1a;使用<div>包裹节点方法二&#xff1a;使用React.createElement创建Fragment 为…

C++中的pair,pair和map的结合

文章目录 1. pair 的基本用法语法&#xff1a;示例&#xff1a; 2. pair 和 map 的结合map 的基本用法语法&#xff1a;示例&#xff1a; 3. pair 和 map 中的具体应用(1) map 中的 pair 存储(2) insert 方法插入 pair(3) 使用 auto 获取 pair 对象(4) 使用 pair 和 map 返回多…

芝士AI(paperzz):最新AI论文、AI降重、AI降重工具,解决论文写作低效和AI率

相信大家都有经历过毕业论文查重&#xff0c;有些严格的学校甚至只有1次查重机会&#xff0c;令人心惊胆战。“东拼西凑”的论文怎么保证查重率符合要求成为每个大学生的毕业必修课题。 芝士AI&#xff08;paperzz&#xff09;官网&#xff1a;https://www.paperzz.cn/ 不过…

Tomcat 的几种部署方式

Apache Tomcat 是一个广泛使用的开源 Servlet 容器&#xff0c;用于部署和运行 Java Web 应用程序。Tomcat 支持多种部署方式&#xff0c;每种方式都有其特点和适用场景。以下是几种常见的 Tomcat 部署方式的详细讲解&#xff1a; 1. 通过 webapps 目录自动部署 这是最简单也…