赞
踩
前言
随着Go语言的普及,越来越多的开发人员选择使用Go编写代码。虽然越来越多的公司项目已使用持续集成/持续部署(CI/CD)工具,用于自动化构建、测试和部署Go程序包,但存在一些部署在ECS服务器的Go程序包或需要手动编译打包上传镜像仓库的镜像。然而,手动创建和管理这些程序包可能会变得相当繁琐。因此,为了提高开发效率,使用Shell脚本来自动化这个过程是一个不错的选择。
针对上述说到的两种情况:一个是部署在ECS上Go服务程序包、另一个是手动部署K8s上的Go服务镜像包,下面分别给出代码。
本人使用Window系统开发,使用Go的gracehttp实现服务平滑重启,但Window对信号量处理存在问题,导致在Window环境下生成的Go程序包无法平滑重启,所以这里使用alpine将项目编译生成程序包到本地项目目录中,完美解决该问题。
- #!/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
- 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"]
现在我们很多项目部署在K8s上,所以将程序编译打包成进行镜像,其中需要将代码打包成程序包,而且需要将程序包上传到仓库,供k8s下载使用,通过编写Xshell程序,可以大大提高效率。
- #!/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
- # =========================================== 第一阶段:构建应用程序 ===========================================
- 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项目的打包和部署流程,提升工作效率。当然,实际生产环境中可能还需要考虑更多因素,如版本管理、依赖处理、日志收集等,但以上步骤已经构成了一个基础的自动化部署框架。随着需求的增加,你可以在这个基础上不断扩展和完善你的部署脚本,使其更加符合你的业务需求。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。