页面简单的网站,电商网站设计欣赏,网站标题特效,长春网站建设平台概要
本文将介绍如何使用 Shell 脚本打包来优雅地生成Go的程序包。我们将创建一个简单的脚本#xff0c;用于构建、测试和部署 Golang 项目。 前言
随着Go语言的普及#xff0c;越来越多的开发人员选择使用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)
imagego-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[0mexit 1
}info Please select the packaging environment:(Select number)
select env in ${environments[]}; doif [ $env test ]; thenport80success The packaging environment you entered is: $envbreakelif [ $env prod ]; thenport8080success The packaging environment you entered is: $envbreakelseerror Invalid environment selection, please re-enterexit 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 maintainerxxxxxx.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_DOMAINharbor.xxx.com
# 镜像路径
MIRROR_PATHNAMExxx/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\ninfo build start:\ninfo 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 maintainerxxxxxx.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 maintainerxxxxxx.com # 设置工作目录和时区
ENV WORKDIR /app
ENV TZ Asia/Shanghai # 将第一阶段构建的应用程序复制到当前镜像的工作目录
COPY --frombuilder /app/main $WORKDIR/main
RUN chmod x $WORKDIR/main# 切换到工作目录
WORKDIR $WORKDIR # 设置容器启动时的命令为应用程序的可执行文件路径
CMD [./main]
执行结果 结语
通过编写Shell脚本我们可以大大简化Golang项目的打包和部署流程提升工作效率。当然实际生产环境中可能还需要考虑更多因素如版本管理、依赖处理、日志收集等但以上步骤已经构成了一个基础的自动化部署框架。随着需求的增加你可以在这个基础上不断扩展和完善你的部署脚本使其更加符合你的业务需求。