最近在尋找適合放 docker image 的私有 registry,因為平常有在用 AWS,所以就來試一下 AWS 的 registry 服務 ECR

gitlab 版本: gitlab 15.3 gitlab runner 運作模式: Docker

準備動作

先確定 aws 帳號有 ECR 的使用權限,如果有需要微調權限設定可以參考官方文件: Pushing an image - Amazon ECR

在 ECR 建立 private repository,會拿到 repository 的 uri。我建立了一個 hello-ci 的 repostiroy uri 長得像這樣 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/hello-ci

gitlab runner 要有使用 ECR 的權限,有兩種方法可以做到

  • runner 的 ec2 掛上有 ECR 權限的 IAM 角色
  • 將有 ECR 權限的 access key 設定在 CI 內

Gitlab runner

因為我們 runner 是使用 Docker 運作模式,這次測試我使用 Use Docker socket binding 的方式。

要掛載 /var/run/docker.sock 給 runner 使用

設定 runner 的 config,在 [runners.docker] 的 volumes 增加掛載設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[[runners]]
  ...
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]

Gitlab CI

ci job 的 image 要使用 dind 的 docker image,還需要安裝 aws cli 以便登入 ECR。

編輯 .gitlab-ci.yml,加入 build docker image 的 stage。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
variables:
  DOCKER_REGISTRY: 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com
  AWS_DEFAULT_REGION: ap-northeast-1

stages:
  - release

upload-docker-image:
  stage: release
  image:
    name: docker:20.10.21-dind
  before_script:
    - docker info
    - apk add --no-cache python3 py3-pip
    - pip3 install --no-cache-dir awscli
  script:
    - docker build -t hello-ci .
    - docker tag hello-ci:latest $DOCKER_REGISTRY/hello-ci:latest
    - aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
    - docker push $DOCKER_REGISTRY/hello-ci:latest

最後就是 push commit 到 gitlab 觸發 CI 便大功告成了。

Reference