本章记录一下Harbor源代码的编译流程.

1. 准备Harbor编译环境

Harbor是由多个Docker容器所组成,并且大部分的源代码都是采用Go语言来编写的。这里Harbor的编译环境需要: Python,Docker,Docker compose和Go开发环境。请安装如下必要环境:

Software       Required Version       
docker 1.12.0 +
docker-compose 1.11.0 +
python 2.7 +
git 1.9.1 +
make 3.81 +
golang* 1.7.3 +
注: golang为可选项,只在你想要使用你自己的golang环境时才需要

当前,这些环境我们都已安装好:

# docker --version
Docker version 17.12.1-ce, build 7390fc6

# docker-compose --version
docker-compose version 1.20.1, build 5d8c71b

# python --version
Python 2.7.5

# git --version
git version 1.8.3.1

# make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

# go version
go version go1.8.3 linux/amd64

上面git版本低于所要求版本,应该不存在问题。

2. 获取Harbor源代码

# git clone https://github.com/vmware/harbor

3. 构建并安装Harbor

3.1 配置

修改make/harbor.cfg配置文件,对其中的一些必要配置进行修改。请参看其他相关章节:

# cd harbor
# vi make/harbor.cfg

3.2 编译运行

你可以采用如下两种方式中的一种来对源代码进行编译:

方式1: 使用官方Golang镜像来编译

  • 从Docker Hub下载官方Golang镜像
# docker pull golang:1.9.2
# docker images | grep golang
golang                         1.9.2               138bd936fa29        4 months ago        733MB
  • 构建,安装并运行不带Notary的Harbor
# make install GOBUILDIMAGE=golang:1.9.2 COMPILETAG=compile_golangimage \
 CLARITYIMAGE=vmware/harbor-clarity-ui-builder:1.4.0
  • 构建,安装并运行带Notary的Harbor
# make install GOBUILDIMAGE=golang:1.9.2 COMPILETAG=compile_golangimage \
 CLARITYIMAGE=vmware/harbor-clarity-ui-builder:1.4.0 NOTARYFLAG=true
  • 构建,安装并运行带Clair的Harbor
# make install GOBUILDIMAGE=golang:1.9.2 COMPILETAG=compile_golangimage \
 CLARITYIMAGE=vmware/harbor-clarity-ui-builder:1.4.0 CLAIRFLAG=true

方式2: 使用自己的Golang环境来构建Harbor

  • 将源代码移动到GOPATH路径
# mkdir $GOPATH/src/github.com/vmware/
# cd ..
# mv harbor $GOPATH/src/github.com/vmware/.
  • 构建,安装并运行不带Notary与Clair的Harbor
# cd $GOPATH/src/github.com/vmware/harbor
# make install
  • 构建,安装并运行带Notary与Clair的Harbor
# cd $GOPATH/src/github.com/vmware/harbor
# make install -e NOTARYFLAG=true CLAIRFLAG=true

3.3 验证

假如一切进展顺利的话,你将会得到如下的打印消息:

...
Start complete. You can visit harbor now.

这时Harbor会启动,你可以根据 Installation and Configuration Guide来对Harbor进行验证。

4. Harbor编译示例

下面我们以一个实际的例子来讲述一下Harbor源代码的编译过程

4.1 安装Go编译环境

这里我们安装Go编译环境:

# cd /opt
# wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz
# tar -zxvf go1.9.linux-amd64.tar.gz -C /usr/local/

/etc/profile文件中导出如下变量:

export GOROOT=/usr/local/go/
export GOBIN=/usr/local/go/bin/
export GOPATH=/opt/gowork/
export GOOS=linux
export GOARCH=amd64
export PATH=$PATH:$GOROOT:$GOBIN

使相应变量生效,并创建go工作目录,然后再检查是否安装成功:

# source /etc/profile

# mkdir -p /opt/gowork/src

# which go
/usr/local/go/bin/go
# go version
go version go1.9 linux/amd64

# echo $GOROOT $GOPATH
/usr/local/go/ /opt/gowork/

4.2 清理Harbor环境

这里我们把原来的Harbor环境全部清除掉:

# cd /opt/harbor-inst/harbor
# docker-compose down -v
# rm -rf /data/*
# rm -rf /var/log/harbor*
# rm -rf common/config

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

然后再清除掉原来下载下来的Harbor相关镜像:

# docker images | grep vmware | awk '{print $1":"$2}'
vmware/clair-photon:v2.0.1-v1.4.0
vmware/notary-server-photon:v0.5.1-v1.4.0
vmware/notary-signer-photon:v0.5.1-v1.4.0
vmware/registry-photon:v2.6.2-v1.4.0
vmware/nginx-photon:v1.4.0
vmware/harbor-log:v1.4.0
vmware/harbor-jobservice:v1.4.0
vmware/harbor-ui:v1.4.0
vmware/harbor-adminserver:v1.4.0
vmware/harbor-db:v1.4.0
vmware/mariadb-photon:v1.4.0
vmware/postgresql-photon:v1.4.0
vmware/harbor-db-migrator:1.4
vmware/photon:1.0
# docker images | grep vmware | awk '{print $1":"$2}' | xargs docker rmi

4.3 下载Harbor源代码

这里我们在实际使用过程中,并不会采用最新的Harbor源代码,而是采用相对较新的稳定版本。我们下载v1.4.0版本到$GOPATH/src目录下:

# echo $GOPATH
/opt/gowork/

# cd /opt/gowork/src
# wget https://github.com/vmware/harbor/archive/v1.4.0.tar.gz
# tar -zxvf v1.4.0.tar.gz
# ls
harbor-1.4.0  v1.4.0.tar.gz

4.4 下载相关依赖镜像

这里我们会依赖到两个镜像: harbor-clarity-ui-buildergolang

  • 这里我们首先拉取harbor-clarity-ui-build镜像,当前所用版本为1.4.0
# docker pull vmware/harbor-clarity-ui-builder:1.4.0
# docker images | grep clarity
vmware/harbor-clarity-ui-builder   1.4.0               937eb5e24878        7 days ago          1.54GB
  • 然后再拉取golang镜像,当前使用版本为1.9.2
# docker pull golang:1.9.2
# docker tag golang:1.9.2 vmware/harborgo:1.9.2
# docker images | grep harborgo
vmware/harborgo                    1.9.2               138bd936fa29        4 months ago        733MB

4.5 编译并运行Harbor1.4

  • 将上面下载的Harbor源代码移动到$GOPATH目录下的相应位置
# pwd
/opt/gowork/src

# mv harbor-1.4.0 $GOPATH/src/github.com/vmware/.
# cd $GOPATH/src/github.com/vmware/. && mv harbor-1.4.0 harbor

注意,上面必须把名字harbor-1.4.0改为harbor,否则后面编译时可能导致相应的错误。

  • 修改相关配置文件

进入harbor源代码目录:

# cd cd $GOPATH/src/github.com/vmware/harbor

1) 修改make/harbor.cfg文件

hostname = 192.168.69.128
ui_url_protocol = https
max_job_workers = 1
ssl_cert = /opt/cert/harbor-registry.crt
ssl_cert_key = /opt/cert/harbor-registry.key

2) 修改harbor目录下的Makefile文件

首先将如下行:

CLARITYIMAGE=vmware/harbor-clarity-ui-builder[:tag]

修改为

CLARITYIMAGE=vmware/harbor-clarity-ui-builder:1.4.0

再将如下行:

GOBUILDIMAGE=reg.mydomain.com/library/harborgo[:tag]

修改为:

GOBUILDIMAGE=vmware/harborgo:1.9.2
  • 编译Harbor源代码,并运行
# make install

上面Harbor源代码编译会耗费一段时间,编译完成之后就会自动运行Harbor:

# docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS                 PORTS                                                              NAMES
98bf7bff91db        vmware/harbor-jobservice:dev        "/harbor/start.sh"       3 hours ago         Up 3 hours (healthy)                                                                      harbor-jobservice
feb4c66b8e75        vmware/nginx-photon:dev             "nginx -g 'daemon of…"   3 hours ago         Up 3 hours             0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
6c1d9e8f3e80        vmware/harbor-ui:dev                "/harbor/start.sh"       3 hours ago         Up 3 hours (healthy)                                                                      harbor-ui
fff4eab5c159        vmware/harbor-db:dev                "/usr/local/bin/dock…"   3 hours ago         Up 3 hours (healthy)   3306/tcp                                                           harbor-db
8d598f0a2d6e        vmware/harbor-adminserver:dev       "/harbor/start.sh"       3 hours ago         Up 3 hours (healthy)                                                                      harbor-adminserver
557b2b17f928        vmware/registry-photon:v2.6.2-dev   "/entrypoint.sh serv…"   3 hours ago         Up 3 hours (healthy)   5000/tcp                                                           registry
c02ab8aa35cd        vmware/harbor-log:dev               "/bin/sh -c /usr/loc…"   3 hours ago         Up 3 hours (healthy)   127.0.0.1:1514->10514/tcp                                          harbor-log
e4cdabfee168        golang:1.9.2                        "bash"                   4 hours ago         Up 4 hours                                                                                harborgo

4.6 测试

在上述编译完成后,我们可以进行简单的测试,看Harbor是否工作正常:

# docker login 192.168.69.128
# docker push 192.168.69.128/library/nginx

4.7 查看编译结果

进入harbor目录下的make/dev目录,查看:

# cd make/dev
# tree
.
├── adminserver
│   ├── Dockerfile
│   └── harbor_adminserver
├── docker-compose.yml
├── jobservice
│   ├── Dockerfile
│   └── harbor_jobservice
├── nodeclarity
│   ├── angular-cli.json
│   ├── Dockerfile
│   ├── entrypoint.sh
│   └── index.html
└── ui
    ├── Dockerfile
    └── harbor_ui

4 directories, 11 files

我们看到这里编译出了adminserverjobservicenodeclarityui四个目录。其中nodeclarity我们暂时不会用到。后续我们需要进行扩展开发也主要是针对:

  • harbor_adminserver

  • harbor_jobservice

  • harbor_ui

5. 附录

5.1 Harbor Makefile的使用

根目录下的Makefile文件包括如下的一些配置参数:

Variable       Description      
BASEIMAGE 容器的基础镜像,默认为:photon
CLARITYIMAGE Clarity UI(抗脆弱性)构建镜像,默认为:harbor-clarity-ui-builder
DEVFLAG 构建模型标签,默认为:dev(实际发布时,我们可以修改为对应的版本号)
COMPILETAG 编译模型标签,默认为: compile_normal(使用本地golang来构建)
NOTARYFLAG Notary模型标签,默认为: false
CLAIRFLAG Clair模型标签,默认为: false
HTTPPROXY 针对Clarity UI builder的NPM http代理
REGISTRYSERVER 远程Registry服务的地址
REGISTRYUSER 远程Registry服务的用户名
REGISTRYPASSWORD 远程Registry服务的密码
REGISTRYPROJECTNAME 远程Registry服务上的一个工程的名称(Project Name)
VERSIONTAG Harbor镜像的版本标志,默认为:dev(实际发布时,我们可以修改为对应的版本号)
PKGVERSIONTAG Harbor online与offline版本标志

5.2 Makefile中预先定义的target

根目录下的Makefile文件中预先定义了大量的target:

Target       Description      
all 用于准备env, 编译Harbor各组件相应二进制文件,构建镜像,然后运行镜像
prepare 用于准备env
compile 编译ui及jobservice源代码
compile_ui 编译ui二进制文件
compile_jobservice 编译jobservice二进制文件
compile_clarity 编译clarity二进制文件
build 构建Harbor docker镜像(默认:使用build_photon)
build_photon 以Photon OS base image作为基础镜像来构建Harbor镜像
install 编译二进制文件,构建镜像,准备特定版本的compose文件并且启动Harbor示例
start 启动Harbor实例(当要启动Notary时,请设置NOTARYFLAG=true
down 停止Harbor实例(当Harbor实例是以Notary方式启动时,停止时也应加上NOTARYFLAG=true
package_online 构建Harbor在线安装包
package_offline 构建Harbor离线安装包
pushimage 推送harbor镜像到一个指定的镜像仓库
clean all 移除二进制文件,Harbor镜像,特定版本的docker-compose文件,特定版本tag以及online/offline安装包
cleanbinary 移除ui及jobservice二进制文件
cleanimage 移除Harbor镜像文 件
cleandockercomposefile 移除指定版本的doc ker-compose文件
cleanversiontag 移除指定版本的tag
cleanpackage 移除online/offline安装包

5.3 示例

1) 推送harbor镜像到指定的registry服务器

make pushimage -e DEVFLAG=false REGISTRYSERVER=[$SERVERADDRESS] REGISTRYUSER=[$USERNAME] \
 REGISTRYPASSWORD=[$PASSWORD] REGISTRYPROJECTNAME=[$PROJECTNAME]

注意:需要添加一个/REGISTRYSERVER后。假如REGISTRYSERVER并未设置的话,镜像将会被直接push到Docker Hub上

# make pushimage -e DEVFLAG=false REGISTRYUSER=[$USERNAME] \
 REGISTRYPASSWORD=[$PASSWORD] REGISTRYPROJECTNAME=[$PROJECTNAME]

2) 清除指定版本的二进制文件及镜像

# make clean -e VERSIONTAG=[TAG]

注意: 假如有新的代码传递到Github上,则TAG可能会发生改变。使用此命令一般是清除以前版本的TAG镜像及文件

默认情况下,Make进程会创建一个development build。假如要构建一个发布版本的Harbor,可以设置DEVFLAG为false:

# make XXXX -e DEVFLAG=false



[参考]

  1. harbor官网

  2. harbor compile