oomichi / try-kubernetes

12 stars 5 forks source link

Reduce preparing time for e2e test #30

Closed oomichi closed 6 years ago

oomichi commented 6 years ago

e2e テストの準備として

$ sudo make quick-release

を実施するが、kube-proxy, kube-apiserver などのビルドも行われるため時間がかかる。 そもそも既存 kubernetes クラスタのテストのためなら、kubernetes コンポーネントのビルドは不要。 準備時間削減方法を調べる。

oomichi commented 6 years ago

e2e のために必要なバイナリは kubetest のみ? kubetest のみにビルド方法を調べ、テストを実行してみる。

oomichi commented 6 years ago

make quick-release 実行時の cmd で表示されるものを見ると、kubetest を含めテストに必要そうなバイナリ作成処理はなさそう・・本当に quick-release は必要?

    ./vendor/k8s.io/code-generator/cmd/deepcopy-gen
    ./vendor/k8s.io/code-generator/cmd/defaulter-gen
    ./vendor/k8s.io/code-generator/cmd/conversion-gen
    ./vendor/k8s.io/kube-openapi/cmd/openapi-gen
    cmd/kube-proxy
    cmd/kube-apiserver
    cmd/kube-controller-manager
    cmd/cloud-controller-manager
    cmd/kubelet
    cmd/kubeadm
    cmd/hyperkube
    cmd/kube-scheduler
    cmd/kube-proxy
    cmd/kubeadm
    cmd/kubelet
    cmd/kubectl
    cmd/gendocs
    cmd/genkubedocs
    cmd/genman
    cmd/genyaml
    cmd/genswaggertypedocs
    cmd/linkcheck
    cmd/kubemark

cmd 配下以外に関連しそうなバイナリビルドがあった。

    test/e2e/e2e.test
    vendor/github.com/onsi/ginkgo/ginkgo
    test/e2e_node/e2e_node.test
oomichi commented 6 years ago

make quick-release 実行直後にテスト実行を試みた結果 → 全てビルド実行しても同じ結果。ほかにエラー原因がありそう

$ go run hack/e2e.go -- --provider=skeleton --test --test_args="--ginkgo.focus=1\spod\sto\s2\spods --ginkgo.dryRun=true"
2018/08/01 00:10:26 e2e.go:79: Calling kubetest --verbose-commands=true --provider=skeleton --test --test_args=--ginkgo.focus=1\spod\sto\s2\spods --ginkgo.dryRun=true...
2018/08/01 00:10:26 process.go:153: Running: ./hack/e2e-internal/e2e-status.sh
Skeleton Provider: prepare-e2e not implemented
error: server version (&version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}) differs from client version (version.Info{Major:"1", Minor:"12+", GitVersion:"v1.12.0-alpha.0.2593+99133f510d8734", GitCommit:"99133f510d87347b45e87fc7a899cb5ac6daa7f1", GitTreeState:"clean", BuildDate:"2018-07-31T23:50:42Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"})!
2018/08/01 00:10:26 process.go:155: Step './hack/e2e-internal/e2e-status.sh' finished in 150.752848ms
2018/08/01 00:10:26 main.go:309: Something went wrong: encountered 1 errors: [error during ./hack/e2e-internal/e2e-status.sh: exit status 1]
2018/08/01 00:10:26 e2e.go:81: err: exit status 1
exit status 1

これか

error:
 server version (&version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}) differs from
 client version (version.Info{Major:"1", Minor:"12+", GitVersion:"v1.12.0-alpha.0.2593+99133f510d8734", GitCommit:"99133f510d87347b45e87fc7a899cb5ac6daa7f1", GitTreeState:"clean", BuildDate:"2018-07-31T23:50:42Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"})!

ふーん、テスト対象 kubernetes クラスタと e2e テストのバイナリのバージョンが異なっていると テスト失敗になるよう変更があったみたい。 e2e テストリポジトリで v1.11.1 をチェックアウトしてビルドする必要がありそう。

上記のコードを見ると、e2e テストでクライアントコードを使っていることがわかる。 つまり、kubetest 以外にもビルドする必要があるものがあり、quick-release を避けるのは あまりリーズナブルではなさそう。

oomichi commented 6 years ago

上記コメントにより、本 Issue は Drop する。 ただし、テスト対象 k8s クラスタに合わせて e2e テストのビルドを行う手順は追加する必要が あるため、README 更新に合わせて本 Issue をクローズする。

oomichi commented 6 years ago

z バージョンまで合わせる必要がある模様。 ちょっと厳しすぎないか!?

error:
  server version (&version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}) differs from
  client version (version.Info{Major:"1", Minor:"11+", GitVersion:"v1.11.2-beta.0.34+8b3d76091fd500-dirty", GitCommit:"8b3d76091fd500b7c59c83e113c9048ee612b205", GitTreeState:"dirty", BuildDate:"2018-08-01T00:55:03Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"})!
oomichi commented 6 years ago

kubectl version で得られる server 側の情報から GitCommit を特定、それを e2e 用 k8s.io/kubernetes でチェックアウトする。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:53:20Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
$

この方法でも駄目。dirty とかいうバージョンになってしまう!

$ go run hack/e2e.go -- --provider=skeleton --test --test_args="--ginkgo.focus=1\spod\sto\s2\spods --ginkgo.dryRun=true"
2018/08/01 01:29:24 e2e.go:79: Calling kubetest --verbose-commands=true --provider=skeleton --test --test_args=--ginkgo.focus=1\spod\sto\s2\spods --ginkgo.dryRun=true...
2018/08/01 01:29:25 process.go:153: Running: ./hack/e2e-internal/e2e-status.sh
Skeleton Provider: prepare-e2e not implemented
error: server version (&version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}) differs from client version (version.Info{Major:"1", Minor:"11+", GitVersion:"v1.11.1-dirty", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"dirty", BuildDate:"2018-08-01T01:20:19Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"})!
2018/08/01 01:29:25 process.go:155: Step './hack/e2e-internal/e2e-status.sh' finished in 236.898277ms
2018/08/01 01:29:25 main.go:309: Something went wrong: encountered 1 errors: [error during ./hack/e2e-internal/e2e-status.sh: exit status 1]
2018/08/01 01:29:25 e2e.go:81: err: exit status 1
exit status 1

Slackで聞いてみよう → 不要なファイルが k/k リポ上にあったから。削除したら dirty が消えてテスト実行できた。