Shell腳本生成Go的程序包的實現(xiàn)步驟
前言
隨著Go語言的普及,越來越多的開發(fā)人員選擇使用Go編寫代碼。雖然越來越多的公司項目已使用持續(xù)集成/持續(xù)部署(CI/CD)工具,用于自動化構建、測試和部署Go程序包,但存在一些部署在ECS服務器的Go程序包或需要手動編譯打包上傳鏡像倉庫的鏡像。然而,手動創(chuàng)建和管理這些程序包可能會變得相當繁瑣。因此,為了提高開發(fā)效率,使用Shell腳本來自動化這個過程是一個不錯的選擇。
Shell腳本
針對上述說到的兩種情況:一個是部署在ECS上Go服務程序包、另一個是手動部署K8s上的Go服務鏡像包,下面分別給出代碼。
一鍵生成Go程序包
本人使用Window系統(tǒng)開發(fā),使用Go的gracehttp實現(xiàn)服務平滑重啟,但Window對信號量處理存在問題,導致在Window環(huán)境下生成的Go程序包無法平滑重啟,所以這里使用alpine將項目編譯生成程序包到本地項目目錄中,完美解決該問題。
deploy.sh
#!/bin/bash # 定義環(huán)境變量 environments=("test" "prod") image="go-demo" # 函數(shù):顯示綠色成功信息 function success { echo -e "\033[1;32m$1\033[0m" } # 函數(shù):顯示綠色成功信息 function info { echo -e "\033[33m$1\033[0m" } # 函數(shù):顯示紅色錯誤信息并退出 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"]
執(zhí)行結果
一鍵生成Go鏡像包
現(xiàn)在我們很多項目部署在K8s上,所以將程序編譯打包成進行鏡像,其中需要將代碼打包成程序包,而且需要將程序包上傳到倉庫,供k8s下載使用,通過編寫Xshell程序,可以大大提高效率。
deploy.sh
#!/bin/bash # 倉庫域名 WAREHOUSE_DOMAIN="harbor.xxx.com" # 鏡像路徑 MIRROR_PATHNAME="xxx/login" # 函數(shù):顯示綠色成功信息 function success { echo -e "\033[1;32m$1\033[0m" } # 函數(shù):顯示綠色成功信息 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 # 設置目標操作系統(tǒng)和架構 ENV GOOS linux ENV GOARCH amd64 ENV GOPROXY https://goproxy.cn,direct # 切換到工作目錄 WORKDIR $WORKDIR # 拷貝當前目錄下的所有文件到工作目錄 COPY . . # 下載項目依賴包 RUN go mod download # 查看工作目錄中的文件列表,可以用來檢查文件是否正確拷貝 RUN ls -al # 編譯項目,-ldflags參數(shù)用于優(yōu)化生成的二進制文件大小和性能 RUN go build -ldflags="-s -w" -o $WORKDIR/main ./main.go # =========================================== 第二階段:構建Docker鏡像 =========================================== FROM loads/alpine:3.8 # 設置維護者信息 LABEL maintainer="xxx@xxx.com" # 設置工作目錄和時區(qū) ENV WORKDIR /app ENV TZ Asia/Shanghai # 將第一階段構建的應用程序復制到當前鏡像的工作目錄 COPY --from=builder /app/main $WORKDIR/main RUN chmod +x $WORKDIR/main # 切換到工作目錄 WORKDIR $WORKDIR # 設置容器啟動時的命令為應用程序的可執(zhí)行文件路徑 CMD ["./main"]
執(zhí)行結果
結語
通過編寫Shell腳本,我們可以大大簡化Golang項目的打包和部署流程,提升工作效率。當然,實際生產環(huán)境中可能還需要考慮更多因素,如版本管理、依賴處理、日志收集等,但以上步驟已經構成了一個基礎的自動化部署框架。隨著需求的增加,你可以在這個基礎上不斷擴展和完善你的部署腳本,使其更加符合你的業(yè)務需求。
到此這篇關于Shell腳本生成Go的程序包的實現(xiàn)步驟的文章就介紹到這了,更多相關Shell生成Go程序包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Linux shell腳本對常見圖片格式批量轉換為PDF文件
Linux Debian12基于ImageMagick圖像處理工具編寫shell腳本用于常見圖片png、jpg、jpeg、webp、tiff格式批量轉PDF文件,”多個圖片分開生成多個PDF文件“或者“多個圖片合并生成一個PDF文件”,本文詳細介紹了Linux shell腳本對常見圖片格式批量轉換為PDF文件的操作2024-12-12crontab設置每分鐘、每小時、每天、每周、每月、每年定時執(zhí)行的腳本
這篇文章主要介紹了crontab設置每分鐘、每小時、每天、每周、每月、每年定時執(zhí)行,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04