Quantcast
Channel: 小惡魔 – 電腦技術 – 工作筆記 – AppleBOY
Viewing all articles
Browse latest Browse all 325

Docker 推出官方 GitHub Actions 套件

$
0
0

cover

去年 GitHub 推出 Actions,就有不少開發者相繼把 CI/CD 流程內會使用到的 Plugin 都丟到 Marktetplace,而在這 Docker 容器時代,肯定是需要用自動化上傳容器到 Docker Registry,而官方也在上週正式釋出第一版 GitHub Actions,雖然在 Marktet 尚有不少開發者已經有實現了此功能,但是官方既然推出了,就採用官方的套件會比較適合。底下我們來看看如何使用 Docker 推出的 GitHub Aciton 來自動化上傳 Docker Image。除了介紹如何使用 GitHub Action 上傳 Image 外,我也會拿 DroneDocker Plugin 來進行比較。

如何使用 GitHub Action 上傳 Image

首先準備用 Go 語言服務來當作範例,底下是 Dockerfile 設定,本篇的程式碼的都可以在這邊找到

FROM golang:1.14-alpine

LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>"

RUN apk add bash ca-certificates git gcc g++ libc-dev
WORKDIR /app
# Force the go compiler to use modules
ENV GO111MODULE=on
# We want to populate the module cache based on the go.{mod,sum} files.
COPY go.mod .
COPY go.sum .
COPY main.go .

ENV GOOS=linux
ENV GOARCH=amd64
RUN go build -o /app -tags netgo -ldflags '-w -extldflags "-static"' .

CMD ["/app"]

Docker 詳細的設定方式可以參考此文件

- name: build and push image
  uses: docker/build-push-action@v1
  with:
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_PASSWORD }}
    repository: appleboy/gin-docker-demo
    dockerfile: Dockerfile
    always_pull: true
    tags: latest

由於我們是拿 docker hub 當作範例,故不需要指定 registry,假設您只要有下 git tag 才做上傳的話,可以使用

- name: build and push image
  uses: docker/build-push-action@v1
  with:
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_PASSWORD }}
    repository: appleboy/gin-docker-demo
    dockerfile: Dockerfile
    tag_with_ref: true
    push: ${{ startsWith(github.ref, 'refs/tags/') }}

其實設定不難,整個過程的 Log 可以看這邊。底下來介紹 Drone 的使用方式

用 Drone 上傳 Docker Image

GitHub Actions 的版本跟 Drone 的 Plugin 共通點都是用 CLI 完成全部指令,也全都用 Go 語言打造,所以設定方式其實蠻雷同的。

- name: publish
  pull: always
  image: plugins/docker:linux-amd64
  settings:
    auto_tag: true
    cache_from: appleboy/gin-docker-demo
    daemon_off: false
    dockerfile: Dockerfile
    password:
      from_secret: docker_password
    repo: appleboy/gin-docker-demo
    username:
      from_secret: docker_username
  when:
    event:
      exclude:
      - pull_request

兩邊設定完成後,可以透過兩邊的 Log 方式,為什麼 Drone 只需要不到半分鐘的時間就可以執行完畢,而在 GitHub Actions 則是需要一分鐘以上,原因在於 Drone 支援了 --cache-from,不了解的可以直接參考『在 docker-in-docker 環境中使用 cache-from 提升編譯速度』,大概的意思就是在 docker build 之前,先把最新版本的 Image 下載下來,這時候在編譯的時候就會找到相同的 docker layer 而進行 Cache 動作。不過別擔心,為了能讓 GitHub Action 享有這個機制,我也發了 PR 來支援此參數,等到官方審核通過就可以使用了。


Viewing all articles
Browse latest Browse all 325