当前位置:   article > 正文

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

golang shell

前言

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

Shell脚本

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

一键生成Go程序包

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

deploy.sh
  1. #!/bin/bash
  2. # 定义环境变量
  3. environments=("test" "prod")
  4. image="go-demo"
  5. # 函数:显示绿色成功信息
  6. function success {
  7. echo -e "\033[1;32m$1\033[0m"
  8. }
  9. # 函数:显示绿色成功信息
  10. function info {
  11. echo -e "\033[33m$1\033[0m"
  12. }
  13. # 函数:显示红色错误信息并退出
  14. function error {
  15. echo -e "\033[1;31m$1\033[0m"
  16. exit 1
  17. }
  18. info "Please select the packaging environment:(Select number) "
  19. select env in "${environments[@]}"; do
  20. if [ "$env" == "test" ]; then
  21. port="80"
  22. success "The packaging environment you entered is: $env"
  23. break
  24. elif [ "$env" == "prod" ]; then
  25. port="8080"
  26. success "The packaging environment you entered is: $env"
  27. break
  28. else
  29. error "Invalid environment selection, please re-enter"
  30. exit 1
  31. fi
  32. done
  33. info "\nbuild start:"
  34. info "\n1) docker build running..."
  35. docker build --build-arg PORT="$port" -t "$image:$env" -f deploy/docker/Dockerfile . &> /dev/null
  36. info "\n2) docker running..."
  37. docker run -itd --name "$image-$env" "$image:$env" &> /dev/null
  38. info "\n3) docker cp package..."
  39. docker cp "$image-$env:/app/main_$port" ./
  40. info "\n4) delete containers..."
  41. docker ps -a | grep "$image-$env"* | awk '{print $1}' | xargs docker rm -f &> /dev/null
  42. info "\n5) remove images..."
  43. docker rmi -f $(docker images "$image:$env"* -q | sort | uniq) &> /dev/null
  44. info "\nbuild done!"
  45. exit 0
Dockerfile
  1. FROM golang:1.17.6-alpine
  2. LABEL maintainer="xxx@xxx.com"
  3. # 文件名称
  4. ARG PORT
  5. # 设置工作目录
  6. ENV WORKDIR /app
  7. # 关闭CGO
  8. ENV CGO_ENABLED 0
  9. # 设置GOOS和GOARCH
  10. ENV GOOS linux
  11. ENV GOARCH amd64
  12. ENV GOPROXY https://goproxy.cn,direct
  13. # 声明工作目录
  14. WORKDIR $WORKDIR
  15. # 拷贝整个项目到工作目录
  16. COPY . .
  17. # 项目依赖包
  18. RUN go mod download
  19. # 项目编译
  20. RUN go build -ldflags="-s -w" -o $WORKDIR/main_$PORT ./main.go
  21. # 运行300s
  22. # CMD ["sleep", "300"]
执行结果

一键生成Go镜像包

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

deploy.sh

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

Dockfile

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

执行结果

结语

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/781738
推荐阅读
相关标签
  

闽ICP备14008679号