用 Drone 自動化上傳 Docker Image 到 GitHub Docker Registry

github

很高興收到 GitHub 的 Beta 邀請函來開始試用 GitHub Package Registry 相關功能,從說明文件可以知道目前 Registry 支援了好幾種 Package 像是 npm, gem, docker, mvnnuget,這篇主要跟大家介紹如何用 Drone 快速串接 CI/CD 流程的『自動上傳 Docker Image 到 GitHub Registry』,底下來看看如何使用 GitHub 提供的 Docker Registry。

教學影片

更多實戰影片可以參考我的 Udemy 教學系列

GitHub 認證

$ docker login docker.pkg.github.com \
  -u USERNAME \
  -p PASSWORD/TOKEN

要登入 GitHub 的 Docker Registry,最快的方式就是用個人的帳號及密碼就可以直接登入,而 Registry 設定則是 docker.pkg.github.com,這邊請注意,雖然官方有寫可以用個人的 Password 登入,如果你有使用 OTP 方式登入,這個方式就不適用,也不安全,我個人強烈建議去後台建立一把專屬的 Token。

Personal Token

其中 read:packages and write:packages 兩個 scope 請務必勾選,如果是 private 的 repo,再把 repo 選項打勾,這樣就可以拿到一把 token 當作是密碼,你可以透過 docker login 來登入試試看

串接 Drone CI/CD

從 commit 到自動化上傳 Docker Image 可以透過 Drone 快速完成,底下我們先建立 Dockerfile

FROM plugins/base:multiarch

LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>" \
  org.label-schema.name="Drone Workshop" \
  org.label-schema.vendor="Bo-Yi Wu" \
  org.label-schema.schema-version="1.0"

ADD release/linux/amd64/helloworld /bin/

HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "/bin/helloworld", "-ping" ]

ENTRYPOINT ["/bin/helloworld"]

接著透過 Drone 官方 docker 套件來完成自動化上傳

kind: pipeline
name: default

steps:
- name: build
  image: golang:1.13
  commands:
  - make build_linux_amd64

- name: docker
  image: plugins/docker
  settings:
    registry: docker.pkg.github.com
    repo: docker.pkg.github.com/appleboy/test/demo
    auto_tag: true
    auto_tag_suffix: linux-amd64
    username: appleboy
    password:
      from_secret: docker_password

比較需要注意的是 GitHub 跟 DockerHub 不同的是,GitHub 格式是 OWNER/REPOSITORY/IMAGE_NAME,注意中間有多一個 REPOSITORY 而 DockerHub 是 OWNER/IMAGE_NAME。接著到後台將 docker_password 設定完成,就可以正確部署了。