优雅的通过Shell脚本生成Go的程序包

概要

本文将介绍如何使用 Shell 脚本打包来优雅地生成Go的程序包。我们将创建一个简单的脚本,用于构建、测试和部署 Golang 项目。

前言

随着Go语言的普及,越来越多的开发人员选择使用Go编写代码。虽然越来越多的公司项目已使用持续集成/持续部署(CI/CD)工具,用于自动化构建、测试和部署Go程序包,但存在一些部署在ECS服务器的Go程序包或需要手动编译打包上传镜像仓库的镜像。然而,手动创建和管理这些程序包可能会变得相当繁琐。因此,为了提高开发效率,使用Shell脚本来自动化这个过程是一个不错的选择。

Shell脚本

针对上述说到的两种情况:一个是部署在ECS上Go服务程序包、另一个是手动部署K8s上的Go服务镜像包,下面分别给出代码。

一键生成Go程序包

本人使用Window系统开发,使用Go的gracehttp实现服务平滑重启,但Window对信号量处理存在问题,导致在Window环境下生成的Go程序包无法平滑重启,所以这里使用alpine将项目编译生成程序包到本地项目目录中,完美解决该问题。

deploy.sh
#!/bin/bash# 定义环境变量
environments=("test" "prod")
image="go-demo"# 函数:显示绿色成功信息
function success {echo -e "\033[1;32m$1\033[0m"
}# 函数:显示绿色成功信息
function info {echo -e "\033[33m$1\033[0m"
}# 函数:显示红色错误信息并退出
function error {echo -e "\033[1;31m$1\033[0m"exit 1
}info "Please select the packaging environment:(Select number) "
select env in "${environments[@]}"; doif [ "$env" == "test" ]; thenport="80"success "The packaging environment you entered is: $env"breakelif [ "$env" == "prod" ]; thenport="8080"success "The packaging environment you entered is: $env"breakelseerror "Invalid environment selection, please re-enter"exit 1fi
doneinfo "\nbuild start:"info "\n1) docker build running..."
docker build --build-arg PORT="$port" -t "$image:$env" -f deploy/docker/Dockerfile . &> /dev/nullinfo "\n2) docker running..."
docker run -itd --name "$image-$env" "$image:$env" &> /dev/nullinfo "\n3) docker cp package..."
docker cp "$image-$env:/app/main_$port"  ./info "\n4) delete containers..."
docker ps -a | grep "$image-$env"* | awk '{print $1}' | xargs docker rm -f &> /dev/nullinfo "\n5) remove images..."
docker rmi -f $(docker images "$image:$env"* -q | sort | uniq) &> /dev/nullinfo "\nbuild done!"exit 0
Dockerfile
FROM golang:1.17.6-alpineLABEL maintainer="xxx@xxx.com"# 文件名称
ARG PORT# 设置工作目录
ENV WORKDIR /app# 关闭CGO
ENV CGO_ENABLED 0# 设置GOOS和GOARCH
ENV GOOS linux
ENV GOARCH amd64
ENV GOPROXY https://goproxy.cn,direct# 声明工作目录
WORKDIR $WORKDIR# 拷贝整个项目到工作目录
COPY . .# 项目依赖包
RUN go mod download# 项目编译
RUN go build -ldflags="-s -w" -o $WORKDIR/main_$PORT ./main.go# 运行300s
# CMD ["sleep", "300"]
执行结果

一键生成Go镜像包

现在我们很多项目部署在K8s上,所以将程序编译打包成进行镜像,其中需要将代码打包成程序包,而且需要将程序包上传到仓库,供k8s下载使用,通过编写Xshell程序,可以大大提高效率。

deploy.sh

#!/bin/bash# 仓库域名
WAREHOUSE_DOMAIN="harbor.xxx.com"
# 镜像路径
MIRROR_PATHNAME="xxx/login"# 函数:显示绿色成功信息
function success {echo -e "\033[1;32m$1\033[0m"
}# 函数:显示绿色成功信息
function info {echo -e "\033[33m$1\033[0m"
}read -p "Please enter the packaging version:" version
success "The packaging version you entered is: $version\n"info "build start:\n"info "1) docker build...\n"
docker build -f ./deploy/docker/Dockerfile -t "$MIRROR_PATHNAME:$version" . &> /dev/nullinfo "2) docker tag...\n"
docker tag "$MIRROR_PATHNAME:$version" "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME:$version" &> /dev/nullinfo "3) docker push...\n"
docker push "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME:$version" &> /dev/nullinfo "4) delete containers...\n"
docker ps -a | grep "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME*" | awk '{print $1}' | xargs docker rm -f &> /dev/nullinfo "5) remove images...\n"
docker rmi -f $(docker images "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME*" -q | sort | uniq) &> /dev/nullinfo "build done!"exit

Dockfile

# =========================================== 第一阶段:构建应用程序  ===========================================  
FROM golang:1.17.6-alpine AS builder  # 设置维护者信息  
LABEL maintainer="xxx@xxx.com"  # 设置工作目录  
ENV WORKDIR /app  # 关闭CGO,以减少构建过程中的依赖和体积  
ENV CGO_ENABLED 0  # 设置目标操作系统和架构  
ENV GOOS linux  
ENV GOARCH amd64  
ENV GOPROXY https://goproxy.cn,direct  # 切换到工作目录  
WORKDIR $WORKDIR  # 拷贝当前目录下的所有文件到工作目录  
COPY . .  # 下载项目依赖包  
RUN go mod download  # 查看工作目录中的文件列表,可以用来检查文件是否正确拷贝  
RUN ls -al  # 编译项目,-ldflags参数用于优化生成的二进制文件大小和性能  
RUN go build -ldflags="-s -w" -o $WORKDIR/main ./main.go  # =========================================== 第二阶段:构建Docker镜像  ===========================================  
FROM loads/alpine:3.8# 设置维护者信息  
LABEL maintainer="xxx@xxx.com"  # 设置工作目录和时区  
ENV WORKDIR /app  
ENV TZ  Asia/Shanghai  # 将第一阶段构建的应用程序复制到当前镜像的工作目录  
COPY --from=builder /app/main $WORKDIR/main  
RUN chmod +x $WORKDIR/main# 切换到工作目录  
WORKDIR $WORKDIR  # 设置容器启动时的命令为应用程序的可执行文件路径  
CMD ["./main"]

执行结果

结语

通过编写Shell脚本,我们可以大大简化Golang项目的打包和部署流程,提升工作效率。当然,实际生产环境中可能还需要考虑更多因素,如版本管理、依赖处理、日志收集等,但以上步骤已经构成了一个基础的自动化部署框架。随着需求的增加,你可以在这个基础上不断扩展和完善你的部署脚本,使其更加符合你的业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CnosDB容灾方案概述

本文主要介绍了跟容灾相关的关键技术以及技术整合后形成的几种具体方案,每种方案都在RTO、RPO、部署成本和维护成本等方面有自己的特点和区别,可以根据具体场景选择最合适的方案。 基本概念 RTO(Recovery Time Objective)&#x…

欧几里得算法总结

知识概览 欧几里得算法也叫辗转相除法,核心原理是(a, b) (b, a mod b),时间复杂度为O(logn)。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构,给出相应代码模板,并会布置、讲解相应的基础算法题目。https://www…

力扣(leetcode)第434题字符串中的单词数(Python)

434.字符串中的单词数 题目链接:434.字符串中的单词数 统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。 请注意,你可以假定字符串里不包括任何不可打印的字符。 示例: 输入: “Hello, my name is John” 输出: 5 解释: 这…

四、C语言中的数组:数组的创建与初始化

其实在之前的学习中我们已经或多或少接触到了数组,有关scanf()的安全用法中我们提到了如何避免数组溢出的问题,详情可以查看二、C语言数据类型与变量(scanf和printf (4)完) 这一章我们将详细学习数组在C语言中的应用 1.数组的概…

1.3学习记录

PCB学习 CH340C有内部晶振,而CH340G无内部晶振,故需要更多的元器件 1.5学习 光储充 光储充,顾名思义,这种一体化充电站的核心由三部分组成——光伏发电、储能电池和充电桩。这三部分组成一个微网,利用光伏发电&…

用Python爬取电影数据并可视化分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

2024.1.7-实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功)

实战-docker方式给自己网站部署prometheus监控ecs资源使用情况-2024.1.7(测试成功) 目录 最终效果 原文链接 https://onedayxyy.cn/docs/prometheus-grafana-ecs 参考模板 https://i4t.com/ https://grafana.frps.cn 🔰 额,注意哦: 他这个是通过frp来…

FastDFS安装与测试

目录 目标 版本 环境 官方文档 相关概念 安装FastDFS 启动FastDFS 关闭FastDFS 重启FastDFS 用命令测试上传文件 用命令测试下载文件 用命令测试删除文件 用HTTP的方式访问FastDFS中的文件 用HTTP的方式访问FastDFS中的文件整体流程 目标 在Linux服务器上搭建单…

Visual Studio C#创建windows服务程序

选择一个windows服务程序创建 命名一个项目名称双击Service1.cs文件,然后鼠标右键添加安装程序接下来,我们对服务做一些简单的配置,配置Account为LocalSystem,否则启动服务时需要输入账户和密码设置启动服务名称我们可以在OnSt…

机器视觉技能培养:桥接学院与工业界的鸿沟

在当前的教育体系中,大学生往往缺乏直接参与机器视觉工作的机会。本文将探讨机器视觉学习的重要性,分析技术指导和实践项目的必要性。并提出一个全面的机器视觉学习路线图。 机器视觉及其在现代工业中的应用 机器视觉是指利用计算机视觉技术对图像进行自…

MySql常用函数之 convert()、str_to_date()、date_format()、to_base64()、from_base64()等使用介绍

一、convert() 1、将日期字符串转换为 date 类型 select convert(2024-01-06, date) from dual; 输出: 2024-01-06 2、将日期字符串转换为 datetime 类型 select convert(2024-01-06, datetime) from dual; 输出: 2024-01-06 00:00:00 3、将日期转换…

解决Docker报错问题:Docker Desktop – Unexpected WSL error

最近因为准备在NAS上通过Docker容器方式安装MYSQL,发现https://hub.docker.com网站被墙了,无法自动安装,同时又找不到靠谱的离线镜像,所以准备在Window上安装Docker,通过电脑的网络代理制作离线镜像再上传到NAS上。 在…

【温故而知新】JavaScript数据结构详解

一、概念 JavaScript是一种弱类型的编程语言,它提供了一些内置的数据结构来存储和组织数据。 在计算机科学中,数据结构是一种特定的方式来组织和存储数据,以便于有效地访问和修改数据。在JavaScript中,数据结构是指相互之间存在…

PTA——分支结构练习02 用if-else语句判断上课周和放假

本题需要用if-else语句判断上课周和放假:输入1-12范围的数字表示月份(month),若输入的月份是9-12和1时,输出“本学年上学期”;若输入的月份为2时,则输出“寒假!”;若输入…

【AIGC-图片生成视频系列-6】SSR-Encoder:用于主题驱动生成的通用编码器

目录 一. 贡献概述 二. 方法详解 a) 训练阶段 b) 推理生成阶段: 三. 综合结果 四. 注意力可视化 五. 选择性主题驱动图像生成 六. 人体图像生成 七. 可推广到视频生成模型 八. 论文 九. 个人思考 稳定扩散(Stable Diffusion)模型可…

python豆瓣实例,抓取多页数据-应用到知识点:随时数,xpath,间隔请求sleep

源代码: <!DOCTYPE html> <html lang="zh-CN" class="ua-windows ua-webkit"> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="renderer" content=&q…

Calibre PEX Hspice Netlist提取步骤(数模芯片提取spice netlist流程)

在数模混合芯片中&#xff0c;通常模拟需要数字模块通过calibre工具来提取Hspice netlist用于功耗仿真。注意这里的spice netlist和做Calibre的spice netlist是不太一样的。 另外在做calibre pex时需要确保当前的design LVS已经pass。否则功耗仿真可能会不准。 Calibre LVS常…

八. 实战:CUDA-BEVFusion部署分析-spconv原理

目录 前言0. 简述1. 举例分析spconv的计算流程2. 导出带有spconv网络的onnx需要考虑的事情总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第八章——实战&a…

【数据库原理】(13)视图的使用

文章目录 一.定义和删除视图1.建立视图2.删除视图 二.查询视图视图查询的基本操作视图查询的内部机制查询转换的注意事项视图查询的限制 三.更新视图1.插入视图数据2.删除视图数据3.修改视图数据可更新性的限制 视图&#xff08;View&#xff09; 是一种虚拟的表&#xff0c;它…

Next.js 第一次接触

因为需要整个漂亮的在线文档&#xff0c;所以接触了next.js&#xff0c;因为对前端js本身不够熟悉&#xff0c;别说对react.js 又不会&#xff0c;时间又不允许深入研究&#xff0c;所以&#xff0c;为了加一个导航菜单&#xff0c;极其痛苦。 有点小bug&#xff0c;不过不影响…