Shell脚本生成Go的程序包的实现步骤

 更新时间:2024年01月09日 10:04:30   作者:寻找09之夏  
通过编写Shell脚本,我们可以大大简化Golang项目的打包和部署流程,本文就来介绍一下Shell脚本生成Go的程序包的实现步骤,感兴趣的可以了解一下

前言

随着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[@]}"; do
    if [ "$env" == "test" ]; then
        port="80"
        success "The packaging environment you entered is: $env"
        break
    elif [ "$env" == "prod" ]; then
        port="8080"
        success "The packaging environment you entered is: $env"
        break
    else
        error "Invalid environment selection, please re-enter"
        exit 1
    fi
done

info "\nbuild start:"

info "\n1) docker build running..."
docker build --build-arg PORT="$port" -t "$image:$env" -f deploy/docker/Dockerfile . &> /dev/null

info "\n2) docker running..."
docker run -itd --name "$image-$env" "$image:$env" &> /dev/null

info "\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/null

info "\n5) remove images..."
docker rmi -f $(docker images "$image:$env"* -q | sort | uniq) &> /dev/null

info "\nbuild done!"

exit 0

Dockerfile

FROM golang:1.17.6-alpine

LABEL 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/null

info "2) docker tag...\n"
docker tag "$MIRROR_PATHNAME:$version" "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME:$version" &> /dev/null

info "3) docker push...\n"
docker push "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME:$version" &> /dev/null

info "4) delete containers...\n"
docker ps -a | grep "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME*" | awk '{print $1}' | xargs docker rm -f &> /dev/null

info "5) remove images...\n"
docker rmi -f $(docker images "$WAREHOUSE_DOMAIN/$MIRROR_PATHNAME*" -q | sort | uniq) &> /dev/null

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

到此这篇关于Shell脚本生成Go的程序包的实现步骤的文章就介绍到这了,更多相关Shell生成Go程序包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Bash脚本实现实时监测登录

    Bash脚本实现实时监测登录

    在服务器的运维管理中,及时监控系统的登录日志对保障系统的安全至关重要,下面我们来看看如何使用Bash脚本实现实时监测登录日志吧
    2024-11-11
  • Shell中case...in分支语句的应用

    Shell中case...in分支语句的应用

    shell作为一种脚本编程语言,同样包含循环、分支等其他程序控制结构,从而轻松完成更加复杂、强大的功能,本文主要介绍了Shell中case...in分支语句的应用,感兴趣的可以了解一下
    2023-08-08
  • Bash 中 nohup 与 & 的区别及用法详解

    Bash 中 nohup 与 & 的区别及用法详解

    在Bash中,`&`、`nohup`和`disown`各有用途:`&`用于后台运行命令,选择合适的工具可以实现后台任务的稳定运行,本文介绍Bash 中 nohup 与 & 的区别及用法,感兴趣的朋友一起看看吧
    2025-01-01
  • Linux shell脚本对常见图片格式批量转换为PDF文件

    Linux shell脚本对常见图片格式批量转换为PDF文件

    Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件,”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件”,本文详细介绍了Linux shell脚本对常见图片格式批量转换为PDF文件的操作
    2024-12-12
  • shell的比较运算介绍

    shell的比较运算介绍

    shell中的比较运算介绍,想学习linux shell编程的朋友可以参考下
    2013-01-01
  • 分享70个经典的 Shell 脚本面试题与答案

    分享70个经典的 Shell 脚本面试题与答案

    我们为你的面试准备选择了 70 个你可能遇到的 shell 脚本面试问题及解答。了解脚本或至少知道基础知识对系统管理员来说至关重要,它也有助于你在工作环境中自动完成很多任务
    2018-02-02
  • crontab设置每分钟、每小时、每天、每周、每月、每年定时执行的脚本

    crontab设置每分钟、每小时、每天、每周、每月、每年定时执行的脚本

    这篇文章主要介绍了crontab设置每分钟、每小时、每天、每周、每月、每年定时执行,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Linux shell中的-d,-f,-e,-n的作用小结

    Linux shell中的-d,-f,-e,-n的作用小结

    本文主要介绍了Linux shell中的-d,-f,-e,-n的作用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • nginx多server日志分割脚本分享

    nginx多server日志分割脚本分享

    这篇文章主要介绍了nginx多server日志分割脚本,需要的朋友可以参考下
    2014-04-04
  • shell sed命令的具体使用

    shell sed命令的具体使用

    本文主要介绍了shell sed命令的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论