# 實現自動化 build image 其實說白了就是封裝後的 Docker Images,具有以下特性: * 共享: 可用於公司不同團隊,或提供開源使用。 * 重複使用。 目標: 客製化個人 Drone Plugin,並帶入自定義的 HELLO 參數,取代原本的 default 值。 GitHub 範例 Drone 階段我們將會做下列的事情 * clone project (drone default action) * 編譯程式碼 * 讀取 Dockerfile 並 build 成映像檔 * 推至 Harbor 私有庫 檔案結構 ![](https://i.imgur.com/Vcg0axZ.png) # 根目錄Dockerfile 根目錄Dockerfile,我不曉得是網站少打太多還是我漏掉,補了一堆才可以RUN,直接魔改 ``` FROM golang:1.14.4-alpine AS build # 複製原始碼 COPY . /go/src/demo WORKDIR /go/src/demo RUN ls -al # 安裝 git + rsync RUN apk add git rsync # 安裝 govendor RUN go get -u github.com/gin-gonic/gin RUN go get -u github.com/kardianos/govendor # 進行編譯(名稱為:demo) RUN go build -o demo ./main.go # 最終運行golang 的基底 FROM golang:1.14.4-alpine RUN apk add git rsync RUN go get -u github.com/kardianos/govendor COPY --from=build /go/src/demo/ /app/demo WORKDIR /demo ENTRYPOINT [ "/bin/sh" ] ``` # add main.go 版本我升級到 golang:1.14.4,不然 github.com/gin-gonic/gin 不能編譯 ``` package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "hello world") }) r.Run() } ``` # build-image Dockerfile ``` FROM alpine COPY . /app/ WORKDIR /app ENTRYPOINT [ "./demo" ] ``` # .drone.yml 非常需要注意私有庫 ```yml kind: pipeline type: docker # 在 Docker 內部執行管道命令 name: clone # 可自行定義的名稱 steps: - name: build-golang # 事件一:可自行定義的名稱 image: activate.adobe.com/library/plugin-govendor # 使用 neil605164/plugin-govendor 容器 commands: # 需執行的指令 - mkdir -p /usr/local/go/src/${DRONE_REPO_NAME} # 於 goroot 建立專案名稱的空資料夾 - ls -al /drone/src - rsync -r /app/demo/build-image/Dockerfile /drone/src/Dockerfile # 將 build-image/Dockerfile goroot 底下 - ls -al /drone/src - rsync -r /app/demo/* /usr/local/go/src/${DRONE_REPO_NAME} # 將 clone 的專案複製到 goroot 底下 - cd /usr/local/go/src/${DRONE_REPO_NAME} # 移動至 goroot 專案底下(vendor 我沒用到(?) - govendor sync # 編譯 golang 程式碼 (vendor 我沒用到(?) - rsync -r /usr/local/go/src/${DRONE_REPO_NAME}/* /app/demo/ # 將編譯後的程式在複製回 drone 預設 path (vendor 我沒用到(?) - rsync -r /app/demo/demo /drone/src/demo # 複製編譯完成的 build demo - ping -c 3 activate.adobe.com (測試連通 - name: build-image-push-harbor # 事件二:可自行定義的名稱 image: plugins/docker # 使用 plugins/docker 容器 settings: # harbor 因為走的是 http 協議 所以這個要關閉 不然也蓮步道 insecure : true # 請注意 username 和 password 空格 或者 from_secret: 改成我這樣子 不然會 deubg 到天亮 (這個真的找半天 username: admin password: Harbor12345 repo: 172.24.229.236/library/haha # harbor 私有庫存放位置 # auto_tag: true # tags: ${DRONE_TAG} registry: 172.24.229.236 # harbor 私有庫網址 debug: true ``` # 測試! ![](https://i.imgur.com/eSdf1Da.png) ![](https://i.imgur.com/KOf3crW.png) Pass1 ![](https://i.imgur.com/CZZVVod.png) Pass2 ![](https://i.imgur.com/aX1sirO.png) 成功推上 Harbor 囉! ![](https://i.imgur.com/LvJD0Hc.png) 整體下來 就是 go lange 那個 vendor 可能 類似pkg 之類的? 目前這樣用下來,只是build image 並沒有重寫 image 裡面的東西 # 其他測試用 指令 ``` docker tag alpine 172.24.229.236/library/alpine2 docker push 172.24.229.236/library/alpine2 docker build -t activate.adobe.com/library/plugin-govendor . docker push activate.adobe.com/library/plugin-govendor sudo docker run -t -i activate.adobe.com/library/plugin-govendor ```