前言
随着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程序包内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论