[分享] 极狐GitLab CI/CD使用Harbor镜像仓库

极狐GitLab本身自带容器仓库,原则上我们不需要单独搭建私有镜像仓库。 但很多公司在使用极狐GitLab之前,很可能已经搭建完成了自己的私有仓库,市面上支持Docker Registry的产品有很多,Harbor就是其中比较流行的一种。

下面我们讲讲如何在极狐GitLab CI/CD中使用Harbor作为镜像仓库。

1. Harbor介绍

Harbor是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker registry服务。

它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。

2. Harbor提供的特性

  • 基于角色控制
    用户和仓库都是基于项目进行组织的, 而用户基于项目可以拥有不同的权限。

  • 基于镜像的复制策略
    镜像可以在多个Harbor实例之间进行复制。

  • 支持LDAP
    Harbor的用户授权可以使用已经存在LDAP用户。

  • 镜像删除 & 垃圾回收
    Image可以被删除并且回收Image占用的空间。

  • 友好UI
    用户可以轻松的浏览、搜索镜像仓库以及对项目进行管理。

  • 便于扩展
    绝大部分的用户操作API, 方便用户对系统进行扩展。

  • 轻松部署
    Harbor提供了online、offline安装,除此之外还提供了virtualappliance安装。

3. Harbor安装配置

3.1 Docker基础环境准备

yum install docker-ce -y
yum install docker-compose -y
systemctl start docker
systemctl enable docker

3.2 Harbor安装

Harbor支持在线和离线安装方式,这里,建议使用离线方式。

  • 下载Harbor

先下载Harbor安装包:Releases · goharbor/harbor · GitHub

wget https://github.com/goharbor/harbor/releases/download/v2.1.3/harbor-offline-installer-v2.1.3.tgz
tar -zxvf harbor-offline-installer-v2.1.3.tgz -C  /usr/local/
cd /usr/local/harbor/ 
cp   harbor.yml.tmpl    harbor.yml
  • 修改配置文件harbor.yml
hostname: lab.alexju.cn
http:
  port: 8088
https:
  port: 8443
  certificate: /etc/gitlab/ssl/lab.alexju.cn.crt 
  private_key: /etc/gitlab/ssl/lab.alexju.cn.key
harbor_admin_password: Harbor12345
database:
  password: root123
  max_idle_conns: 50
  max_open_conns: 1000
data_volume: /root/harbor-data
...

  • 安装harbor
./prepare
./install.sh
  • 访问harbor和登录

    地址:https://lab.alexju.cn:8443
    账号:admin

  • 新建项目,比如gitlab.

  • 创建用户alexju,角色为维护人员

4. GitLab CI/CD使用Harbor

GitLab CI/CD使用Harbor仓库,分为拉取镜像和推送镜像。

拉取镜像可以是指定GitLab Runner的基础镜像,也可以是指定CI/CD中的image变量,也可以是制作Docker镜像时指定基础镜像。这些都可以使用Harbor仓库。

推送镜像是指将Pipelines制作的镜像推送到Harbor仓库。

GitLab Runner注册:

sudo gitlab-runner register -n \
  --url https://lab.alexju.cn/ \
  --registration-token xxxxxxxxxxxxxxx \
  --executor docker \
  --description "Local Dind runner" \
  --docker-image "lab.alexju.cn:8443/gitlab/docker:19.03.12" \
  --docker-extra-hosts "lab.alexju.cn:192.168.123.100" \
  --docker-privileged

编写.gitlab-ci.yml文件:

include:
  - template: Security/SAST.gitlab-ci.yml

variables:
  CI_REGISTRY_USER: "alexju"  # Harbor用户
  CI_REGISTRY: "lab.alexju.cn:8443"  # Harbor Docker registry
  CI_REGISTRY_IMAGE: $CI_REGISTRY/gitlab/$CI_PROJECT_NAME  # 制作镜像名称
  SECURE_ANALYZERS_PREFIX: $CI_REGISTRY/gitlab # 镜像前缀

stages:
  - build
  - test

build:
  image: $SECURE_ANALYZERS_PREFIX/docker:19.03.12
  stage: build
  services:
    - name: $SECURE_ANALYZERS_PREFIX/docker:19.03.12-dind
      alias: docker
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker info
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"

运行时还需指定环境变量CI_REGISTRY_PASSWORD

编写Dockerfile

FROM ${SECURE_ANALYZERS_PREFIX}/centos
RUN mkdir -p /root/new

Pipelines运行过后,就可以在Harbor仓库指定路径下,看到制作完成的Docker镜像了。

综上所述,GitLab CI/CD使用Harbor仅仅需要配置环境变量即可,非常便捷。