本地构建和测试
OpenYurt主仓库(openyurtio/openyurt)中目前(v0.5.0, commit: ef26d5c6)
包含以下组件:
- yurthub
- yurt-controller-manager
- yurt-tunnel-server
- yurt-tunnel-agent
- yurtctl
- yurt-node-servant
本文主要介绍了在完成对上述组件的开发后,如何进行编译源码、打包镜像、运行组件和测试验证等工作。
如何构建
OpenYurt在Makefile中提供了多种构建方式。其中make release
是最便捷的构建命令,包括编译和打包镜像等步骤,可以覆盖绝大多数场景。其使用方式如下:
make release WHAT="${components[@]}" ARCH="${archs[@]}" REGION="${your_region}"
其中WHAT
表示需要构建的组件(名称见文章开头),ARCH
表示组件运行的目标架构,目前支持amd64, arm和arm64三种架构。这两个参数能以数组的形式传入,来进行不同组合。
REGION
参数影响编译时选用的GOPROXY,目前支持"cn","us"两种。cn表示使用GOPROXY=https://goproxy.cn
,us表示使用GOPROXY=https://proxy.golang.org
。默认值是us,因此在国内的用户建议设置REGION=cn
来保证构建过程正确进行。
用例:
make release WHAT="yurtctl yurthub" ARCH="arm64 amd64" REGION=cn
命令执行完成后可以在_output
目录下找到镜像和对应的可执行二进制文件,在dockerbuild
目录下可以找到构建镜像的dockerfile,同时可以看到,通过make release
构建出的可执行二进制文件和镜像都是基于linux平台的。在make relase
命令中,操作系统平台是目前是不能改变的,如果有相关需求可以用下述的其他方法。
OpenYurt的Makefile中还提供了make build
命令,通过该命令可以完成对各个组件的编译,同时该命令可以指定编译的目标平台(包括操作系统和架构)。下面以编译yurtctl为例,解释make build
的使用方法,其他组件类似。
本地平台编译
make build WHAT=yurtctl
该命令会根据本地平台的操作系统和架构编译yurtctl,并把编译出来的可执行二进制文件放在_output目录下。
交叉编译
Mac
GOOS=${target_os} GOARCH=${target_arch} CGO_ENABLED=0 make build WHAT=yurtctl
通过该命令可以实现编译能在特定平台运行的yurtctl,这里最好加上CGO_ENABLED=0
来避免一些兼容上的问题。通过这个命令可以在Mac上编译不同平台的yurtctl.
Windows
由于在Windows上通常没有make命令(如果你没有用Cygwin的话),需要自己执行go build
,powershell中执行方法如下(以管理员权限运行):
- 设置环境变量
在运行前需要设置环境变量target_os
和target_arch
,设为需要的操作系统和架构。
$Env:GOOS = $Env:target_os
$Env:GOARCH = $Env:target_arch
$Env:CGO_ENABLED = 0
$Env:GOLDFLAGS = "-s -w
-X github.com/openyurtio/openyurt/pkg/projectinfo.projectPrefix=yurt
-X github.com/openyurtio/openyurt/pkg/projectinfo.labelPrefix=openyurt.io
-X github.com/openyurtio/openyurt/pkg/projectinfo.gitVersion=$(git describe --abbrev=0)
-X github.com/openyurtio/openyurt/pkg/projectinfo.gitCommit=$(git rev-parse HEAD)
-X github.com/openyurtio/openyurt/pkg/projectinfo.buildDate=$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
- 使用go build进行编译
运行go build命令进行编译,这里需要加上-ldflags=$Env:GOLDFLAGS
选项,还可以通过-o来调整编译好的yurtctl的保存位置。
go build -ldflags=$Env:GOLDFLAGS cmd/yurtctl/yurtctl.go
手动打包镜像
本节描述各个组件的dockerfile,便于通过docker build
命令来手动打包组件镜像,下面是yurtctl和yurt-node-servant的架构与基础镜像之间的关系表。
架构 | 基础镜像 |
---|---|
amd64 | amd64/alpine:3.9 |
arm64 | arm64v8/alpine:3.9 |
arm | arm32v7/alpine:3.9 |
以变量baseimage
代指基础镜像
yurtctl(yurt-servant) dockerfile
FROM ${baseimage}
ADD yurtctl /usr/local/bin/yurtctl
yurt-node-servant dockerfile
FROM ${baseimage}
ADD entry.sh /usr/local/bin/entry.sh
RUN chmod +x /usr/local/bin/entry.sh
ADD yurt-node-servant /usr/local/bin/node-servant
其他组件的dockerfile
其他组件的基础镜像和上述两个不同。其中arch为架构名称,包括amd64,arm和arm64;component表示组件名称,包括yurthub,yurt-controller-manager,yurt-tunnel-server和yurt-tunnel-agent。
FROM k8s.gcr.io/debian-iptables-${arch}:v11.0.2
COPY ${component} /usr/local/bin/${component}
ENTRYPOINT ["/usr/local/bin/${component}"]
如何测试
OpenYurt中提供的测试包括单元测试和e2e测试两种。
单元测试
单元测试会执行cmd和pkg目录下的*_test.go
文件,通过以下命令即可完成
make test