Shell腳本生成Go的程序包的實(shí)現(xiàn)步驟
前言
隨著Go語(yǔ)言的普及,越來(lái)越多的開(kāi)發(fā)人員選擇使用Go編寫(xiě)代碼。雖然越來(lái)越多的公司項(xiàng)目已使用持續(xù)集成/持續(xù)部署(CI/CD)工具,用于自動(dòng)化構(gòu)建、測(cè)試和部署Go程序包,但存在一些部署在ECS服務(wù)器的Go程序包或需要手動(dòng)編譯打包上傳鏡像倉(cāng)庫(kù)的鏡像。然而,手動(dòng)創(chuàng)建和管理這些程序包可能會(huì)變得相當(dāng)繁瑣。因此,為了提高開(kāi)發(fā)效率,使用Shell腳本來(lái)自動(dòng)化這個(gè)過(guò)程是一個(gè)不錯(cuò)的選擇。
Shell腳本
針對(duì)上述說(shuō)到的兩種情況:一個(gè)是部署在ECS上Go服務(wù)程序包、另一個(gè)是手動(dòng)部署K8s上的Go服務(wù)鏡像包,下面分別給出代碼。
一鍵生成Go程序包
本人使用Window系統(tǒng)開(kāi)發(fā),使用Go的gracehttp實(shí)現(xiàn)服務(wù)平滑重啟,但Window對(duì)信號(hào)量處理存在問(wèn)題,導(dǎo)致在Window環(huán)境下生成的Go程序包無(wú)法平滑重啟,所以這里使用alpine將項(xiàng)目編譯生成程序包到本地項(xiàng)目目錄中,完美解決該問(wèn)題。
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ù):顯示紅色錯(cuò)誤信息并退出 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" # 文件名稱(chēng) ARG PORT # 設(shè)置工作目錄 ENV WORKDIR /app # 關(guān)閉CGO ENV CGO_ENABLED 0 # 設(shè)置GOOS和GOARCH ENV GOOS linux ENV GOARCH amd64 ENV GOPROXY https://goproxy.cn,direct # 聲明工作目錄 WORKDIR $WORKDIR # 拷貝整個(gè)項(xiàng)目到工作目錄 COPY . . # 項(xiàng)目依賴(lài)包 RUN go mod download # 項(xiàng)目編譯 RUN go build -ldflags="-s -w" -o $WORKDIR/main_$PORT ./main.go # 運(yùn)行300s # CMD ["sleep", "300"]
執(zhí)行結(jié)果
一鍵生成Go鏡像包
現(xiàn)在我們很多項(xiàng)目部署在K8s上,所以將程序編譯打包成進(jìn)行鏡像,其中需要將代碼打包成程序包,而且需要將程序包上傳到倉(cāng)庫(kù),供k8s下載使用,通過(guò)編寫(xiě)Xshell程序,可以大大提高效率。
deploy.sh
#!/bin/bash # 倉(cāng)庫(kù)域名 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
# =========================================== 第一階段:構(gòu)建應(yīng)用程序 =========================================== FROM golang:1.17.6-alpine AS builder # 設(shè)置維護(hù)者信息 LABEL maintainer="xxx@xxx.com" # 設(shè)置工作目錄 ENV WORKDIR /app # 關(guān)閉CGO,以減少構(gòu)建過(guò)程中的依賴(lài)和體積 ENV CGO_ENABLED 0 # 設(shè)置目標(biāo)操作系統(tǒng)和架構(gòu) ENV GOOS linux ENV GOARCH amd64 ENV GOPROXY https://goproxy.cn,direct # 切換到工作目錄 WORKDIR $WORKDIR # 拷貝當(dāng)前目錄下的所有文件到工作目錄 COPY . . # 下載項(xiàng)目依賴(lài)包 RUN go mod download # 查看工作目錄中的文件列表,可以用來(lái)檢查文件是否正確拷貝 RUN ls -al # 編譯項(xiàng)目,-ldflags參數(shù)用于優(yōu)化生成的二進(jìn)制文件大小和性能 RUN go build -ldflags="-s -w" -o $WORKDIR/main ./main.go # =========================================== 第二階段:構(gòu)建Docker鏡像 =========================================== FROM loads/alpine:3.8 # 設(shè)置維護(hù)者信息 LABEL maintainer="xxx@xxx.com" # 設(shè)置工作目錄和時(shí)區(qū) ENV WORKDIR /app ENV TZ Asia/Shanghai # 將第一階段構(gòu)建的應(yīng)用程序復(fù)制到當(dāng)前鏡像的工作目錄 COPY --from=builder /app/main $WORKDIR/main RUN chmod +x $WORKDIR/main # 切換到工作目錄 WORKDIR $WORKDIR # 設(shè)置容器啟動(dòng)時(shí)的命令為應(yīng)用程序的可執(zhí)行文件路徑 CMD ["./main"]
執(zhí)行結(jié)果
結(jié)語(yǔ)
通過(guò)編寫(xiě)Shell腳本,我們可以大大簡(jiǎn)化Golang項(xiàng)目的打包和部署流程,提升工作效率。當(dāng)然,實(shí)際生產(chǎn)環(huán)境中可能還需要考慮更多因素,如版本管理、依賴(lài)處理、日志收集等,但以上步驟已經(jīng)構(gòu)成了一個(gè)基礎(chǔ)的自動(dòng)化部署框架。隨著需求的增加,你可以在這個(gè)基礎(chǔ)上不斷擴(kuò)展和完善你的部署腳本,使其更加符合你的業(yè)務(wù)需求。
到此這篇關(guān)于Shell腳本生成Go的程序包的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Shell生成Go程序包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Bash腳本實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)登錄
在服務(wù)器的運(yùn)維管理中,及時(shí)監(jiān)控系統(tǒng)的登錄日志對(duì)保障系統(tǒng)的安全至關(guān)重要,下面我們來(lái)看看如何使用Bash腳本實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)登錄日志吧2024-11-11Shell中case...in分支語(yǔ)句的應(yīng)用
shell作為一種腳本編程語(yǔ)言,同樣包含循環(huán)、分支等其他程序控制結(jié)構(gòu),從而輕松完成更加復(fù)雜、強(qiáng)大的功能,本文主要介紹了Shell中case...in分支語(yǔ)句的應(yīng)用,感興趣的可以了解一下2023-08-08Linux shell腳本對(duì)常見(jiàn)圖片格式批量轉(zhuǎn)換為PDF文件
Linux Debian12基于ImageMagick圖像處理工具編寫(xiě)shell腳本用于常見(jiàn)圖片png、jpg、jpeg、webp、tiff格式批量轉(zhuǎn)PDF文件,”多個(gè)圖片分開(kāi)生成多個(gè)PDF文件“或者“多個(gè)圖片合并生成一個(gè)PDF文件”,本文詳細(xì)介紹了Linux shell腳本對(duì)常見(jiàn)圖片格式批量轉(zhuǎn)換為PDF文件的操作2024-12-12分享70個(gè)經(jīng)典的 Shell 腳本面試題與答案
我們?yōu)槟愕拿嬖嚋?zhǔn)備選擇了 70 個(gè)你可能遇到的 shell 腳本面試問(wèn)題及解答。了解腳本或至少知道基礎(chǔ)知識(shí)對(duì)系統(tǒng)管理員來(lái)說(shuō)至關(guān)重要,它也有助于你在工作環(huán)境中自動(dòng)完成很多任務(wù)2018-02-02crontab設(shè)置每分鐘、每小時(shí)、每天、每周、每月、每年定時(shí)執(zhí)行的腳本
這篇文章主要介紹了crontab設(shè)置每分鐘、每小時(shí)、每天、每周、每月、每年定時(shí)執(zhí)行,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Linux?shell中的-d,-f,-e,-n的作用小結(jié)
本文主要介紹了Linux?shell中的-d,-f,-e,-n的作用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06