# 實現自動化 build image
其實說白了就是封裝後的 Docker Images,具有以下特性:
* 共享: 可用於公司不同團隊,或提供開源使用。
* 重複使用。
目標: 客製化個人 Drone Plugin,並帶入自定義的 HELLO 參數,取代原本的 default 值。 GitHub 範例
Drone 階段我們將會做下列的事情
* clone project (drone default action)
* 編譯程式碼
* 讀取 Dockerfile 並 build 成映像檔
* 推至 Harbor 私有庫
檔案結構

# 根目錄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
```
# 測試!


Pass1

Pass2

成功推上 Harbor 囉!

整體下來 就是 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
```