go Jenkins流水线极速打包镜像上传
在使用Jenkins流水線進行打包時,發現直接使用Dockerfile去構建一個java或者go程序會非常慢,go好一點也要一分鐘,java則需要3分鐘以上。Java&Gradle極速打包設置見:這里
dockerfile如下:
FROM golang:1.18.1 AS builder ENV GO111MODULE=on \CGO_ENABLED=0 \GOOS=linux \GOARCH=amd64 \GOPROXY="https://goproxy.cn,direct" WORKDIR /opt/test/ COPY . . RUN go build -o test .FROM alpine:latest MAINTAINER Hao.Wu WORKDIR /opt/ COPY --from=builder /opt/test/ . RUN chmod +x test EXPOSE 50001 CMD ["./test"]在上述步驟中,第一步是打一個go的可執行文件,然后再構建一個linux環境。在linux環境中復制執行go環境中打好的包。在打包時發現還是有些慢。有時甚至超過了3分鐘。
怎么樣提升速度呢?
在上述構建中,最慢的步驟是go的打包,如果選擇選用服務器安裝go進行打包,再將打好的可執行文件直接構建成docker鏡像,一定會快很多。
那就開始做吧,原先在Jenkinsfile中,只需要build鏡像一步就夠了。現在需要先clone代碼,然后go打包,最后將打好的包打入鏡像。
費了九牛二虎之力,終于,我做到了。
node {def appimagedef registry = ''def registryCredential = 'aliyun-docker-image-repository'def pathdef root = tool type: 'go', name: 'go-1.18.6'stage("Checkout"){checkout([$class: 'GitSCM', branches: [[name: '*/'+env.BRANCH_NAME]], extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', trackingSubmodules: false]], userRemoteConfigs: [[credentialsId: '', url: '']]])}// 拉代碼 stage('Source') {git branch: env.BRANCH_NAME, credentialsId: '', url: ''}// 打包withEnv(["GOROOT=${root}", "PATH+GO=${root}/bin"]) {// Output will be something like "go version go1.19 darwin/arm64"sh 'go env -w GOPROXY=https://goproxy.io,direct'sh 'go build -o "test"'}// 構建鏡像stage('Build') {appimage = docker.build registry + ":" + env.BRANCH_NAME + "-$BUILD_NUMBER"}stage('Publish') {}stage('Deploy') {} }修改之后,就不再需要使用Dockerfile中的go環境了
FROM ubuntu:18.04 # 直接從本地復制 COPY simba-ranking /opt WORKDIR /opt RUN chmod +x simba-ranking ENTRYPOINT ["/opt/simba-ranking"]在這次嘗試中,我遇到了幾個問題:
這些問題是使用Jenkinsfile常見的問題,其中:
- go環境需要在jenkins中安裝好(見Jenkins系統配置),然后在Jenkinsfile中進行聲明:
需要注意的是,以上的“go-1.18.6”是在Jenkins中進行安裝時,起的名字,指向的是具體的插件,而不是這里填什么Jenkins下載什么。
- 下載太慢,當你配置了Jenkins所在物理機的go環境,并在Jenkins的系統中指向該go,卻發現打包速度極慢,還經常有IO異常時,應該就是這個問題了。這個go環境并不會從你物理機中讀取環境變量。需要單獨設置,如上的
就是設置了go的環境變量。
- 另外權限不夠的問題,我在上面的Jenkinsfile中也有解決,dockerfile中給可執行文件賦予權限即可:RUN chmod +x simba-ranking
經過這些改造,一般可以將go的構建縮短至20s以內。由于go本身打包機制良好,當依賴文件不多時,構建速度的優化可能并不明顯,這時候我建議使用一體的Dockerfile直接構建,可以減少一些維護成本。
總結
以上是生活随笔為你收集整理的go Jenkins流水线极速打包镜像上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue项目中elementUI的日期时间
- 下一篇: 聊聊benchmark测试