實現自動化 build image

其實說白了就是封裝後的 Docker Images,具有以下特性:

  • 共享: 可用於公司不同團隊,或提供開源使用。
  • 重複使用。

目標: 客製化個人 Drone Plugin,並帶入自定義的 HELLO 參數,取代原本的 default 值。 GitHub 範例

Drone 階段我們將會做下列的事情

  • clone project (drone default action)
  • 編譯程式碼
  • 讀取 Dockerfile 並 build 成映像檔
  • 推至 Harbor 私有庫

檔案結構

根目錄Dockerfile

根目錄Dockerfile,我不曉得是網站少打太多還是我漏掉,補了一堆才可以RUN,直接魔改

code
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 不能編譯

code
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

code
FROM alpine

COPY . /app/
WORKDIR /app

ENTRYPOINT [ "./demo" ]

.drone.yml

非常需要注意私有庫

code
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 裡面的東西

其他測試用 指令

code
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