Merge pull request #10464 from ilya-zuyev/ilyaz/test_deb_install

Add integration tests to verify .deb installation
pull/10532/head
Medya Ghazizadeh 2021-02-19 20:15:11 -08:00 committed by GitHub
commit 6e53584a75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 388 additions and 0 deletions

256
.github/workflows/pr_verified.yaml vendored Normal file
View File

@ -0,0 +1,256 @@
name: PR_Verified
on:
pull_request:
paths:
- "**.go"
- "**.yml"
- "**.yaml"
- "Makefile"
- "!deploy/kicbase/**"
- "!deploy/iso/**"
types:
- labeled
- opened
- synchronize
label:
types:
- created
- edited
- deleted
env:
GOPROXY: https://proxy.golang.org
jobs:
# Runs before all other jobs
# builds the minikube binaries
build_minikube:
if: contains(github.event.pull_request.labels.*.name, 'pr_verified')
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
go-version: '1.15.5'
stable: true
- name: Download Dependencies
run: go mod download
- name: Build Binaries
run: |
sudo apt-get update
sudo apt-get install -y libvirt-dev
make cross e2e-cross debs
cp -r test/integration/testdata ./out
whoami
echo github ref $GITHUB_REF
echo workflow $GITHUB_WORKFLOW
echo home $HOME
echo event name $GITHUB_EVENT_NAME
echo workspace $GITHUB_WORKSPACE
echo "end of debug stuff"
echo $(which jq)
- uses: actions/upload-artifact@v1
with:
name: minikube_binaries
path: out
pkg_install_amd64:
needs: [ build_minikube ]
runs-on: ubuntu-18.04
env:
TIME_ELAPSED: time
JOB_NAME: "pkg_install_amd64"
GOPOGH_RESULT: ""
SHELL: "/bin/bash" # To prevent https://github.com/kubernetes/minikube/issues/6643
steps:
- name: Install gopogh
shell: bash
run: |
curl -LO https://github.com/medyagh/gopogh/releases/download/v0.4.0/gopogh-linux-amd64
sudo install gopogh-linux-amd64 /usr/local/bin/gopogh
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: '1.15.5'
stable: true
- name: Install tools
shell: bash
run: |
sudo apt update
sudo apt install -y jq
- name: Download Binaries
uses: actions/download-artifact@v1
with:
name: minikube_binaries
- name: Run Integration Test
continue-on-error: false
# bash {0} to allow test to continue to next step. in case of
shell: bash {0}
run: |
cd minikube_binaries
mkdir -p report
mkdir -p testhome
chmod a+x e2e-*
chmod a+x minikube-*
START_TIME=$(date -u +%s)
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-linux-amd64 -test.run TestDebPackageInstall -test.timeout=10m -test.v -timeout-multiplier=1.5 2>&1 | tee ./report/testout.txt
END_TIME=$(date -u +%s)
TIME_ELAPSED=$(($END_TIME-$START_TIME))
min=$((${TIME_ELAPSED}/60))
sec=$((${TIME_ELAPSED}%60))
TIME_ELAPSED="${min} min $sec seconds "
echo "TIME_ELAPSED=${TIME_ELAPSED}" >> $GITHUB_ENV
- name: Generate HTML Report
shell: bash
run: |
cd minikube_binaries
export PATH=${PATH}:`go env GOPATH`/bin
go tool test2json -t < ./report/testout.txt > ./report/testout.json || true
STAT=$(gopogh -in ./report/testout.json -out ./report/testout.html -name "${JOB_NAME} ${GITHUB_REF}" -repo "${GITHUB_REPOSITORY}" -details "${GITHUB_SHA}") || true
echo status: ${STAT}
FailNum=$(echo $STAT | jq '.NumberOfFail')
TestsNum=$(echo $STAT | jq '.NumberOfTests')
GOPOGH_RESULT="${JOB_NAME} : completed with ${FailNum} / ${TestsNum} failures in ${TIME_ELAPSED}"
echo "GOPOGH_RESULT=${GOPOGH_RESULT}" >> $GITHUB_ENV
echo 'STAT<<EOF' >> $GITHUB_ENV
echo "${STAT}" >> $GITHUB_ENV
echo 'EOF' >> $GITHUB_ENV
- uses: actions/upload-artifact@v1
with:
name: pkg_install_amd64
path: minikube_binaries/report
- name: The End Result - pkg_install_amd64
shell: bash
run: |
echo ${GOPOGH_RESULT}
numFail=$(echo $STAT | jq '.NumberOfFail')
numPass=$(echo $STAT | jq '.NumberOfPass')
echo "*******************${numPass} Passes :) *******************"
echo $STAT | jq '.PassedTests' || true
echo "*******************************************************"
echo "---------------- ${numFail} Failures :( ----------------------------"
echo $STAT | jq '.FailedTests' || true
echo "-------------------------------------------------------"
if [ "$numFail" -gt 0 ];then echo "*** $numFail Failed ***";exit 2;fi
if [ "$numPass" -eq 0 ];then echo "*** 0 Passed! ***";exit 2;fi
if [ "$numPass" -lt 0 ];then echo "*** Failed to pass at least 20! ***";exit 2;fi
if [ "$numPass" -eq 0 ];then echo "*** Passed! ***";exit 0;fi
pkg_install_arm64:
needs: [ build_minikube ]
runs-on: [ self-hosted, arm64 ]
env:
TIME_ELAPSED: time
JOB_NAME: "pkg_install_arm64"
GOPOGH_RESULT: ""
SHELL: "/bin/bash" # To prevent https://github.com/kubernetes/minikube/issues/6643
steps:
- name: Install gopogh
shell: bash
run: |
curl -LO https://github.com/medyagh/gopogh/releases/download/v0.4.0/gopogh-linux-arm64
sudo install gopogh-linux-arm64 /usr/local/bin/gopogh
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: '1.15.5'
stable: true
- name: Install tools
shell: bash
run: |
sudo apt update
sudo apt install -y jq
- name: Download Binaries
uses: actions/download-artifact@v1
with:
name: minikube_binaries
- name: Run Integration Test
continue-on-error: false
# bash {0} to allow test to continue to next step. in case of
shell: bash {0}
run: |
cd minikube_binaries
mkdir -p report
mkdir -p testhome
chmod a+x e2e-*
chmod a+x minikube-*
START_TIME=$(date -u +%s)
KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-linux-arm64 -test.run TestDebPackageInstall -test.timeout=10m -test.v -timeout-multiplier=1.5 -binary=./minikube-linux-arm64 2>&1 | tee ./report/testout.txt
END_TIME=$(date -u +%s)
TIME_ELAPSED=$(($END_TIME-$START_TIME))
min=$((${TIME_ELAPSED}/60))
sec=$((${TIME_ELAPSED}%60))
TIME_ELAPSED="${min} min $sec seconds "
echo "TIME_ELAPSED=${TIME_ELAPSED}" >> $GITHUB_ENV
- name: Generate HTML Report
shell: bash
run: |
cd minikube_binaries
export PATH=${PATH}:`go env GOPATH`/bin
go tool test2json -t < ./report/testout.txt > ./report/testout.json || true
STAT=$(gopogh -in ./report/testout.json -out ./report/testout.html -name "${JOB_NAME} ${GITHUB_REF}" -repo "${GITHUB_REPOSITORY}" -details "${GITHUB_SHA}") || true
echo status: ${STAT}
FailNum=$(echo $STAT | jq '.NumberOfFail')
TestsNum=$(echo $STAT | jq '.NumberOfTests')
GOPOGH_RESULT="${JOB_NAME} : completed with ${FailNum} / ${TestsNum} failures in ${TIME_ELAPSED}"
echo "GOPOGH_RESULT=${GOPOGH_RESULT}" >> $GITHUB_ENV
echo 'STAT<<EOF' >> $GITHUB_ENV
echo "${STAT}" >> $GITHUB_ENV
echo 'EOF' >> $GITHUB_ENV
- uses: actions/upload-artifact@v1
with:
name: pkg_install_arm64
path: minikube_binaries/report
- name: The End Result - pkg_install_arm64
shell: bash
run: |
echo ${GOPOGH_RESULT}
numFail=$(echo $STAT | jq '.NumberOfFail')
numPass=$(echo $STAT | jq '.NumberOfPass')
echo "*******************${numPass} Passes :) *******************"
echo $STAT | jq '.PassedTests' || true
echo "*******************************************************"
echo "---------------- ${numFail} Failures :( ----------------------------"
echo $STAT | jq '.FailedTests' || true
echo "-------------------------------------------------------"
if [ "$numFail" -gt 0 ];then echo "*** $numFail Failed ***";exit 2;fi
if [ "$numPass" -eq 0 ];then echo "*** 0 Passed! ***";exit 2;fi
if [ "$numPass" -lt 0 ];then echo "*** Failed to pass at least 20! ***";exit 2;fi
if [ "$numPass" -eq 0 ];then echo "*** Passed! ***";exit 0;fi
# After all integration tests finished
# collect all the reports and upload them
upload_all_reports:
needs:
[
pkg_install_amd64,
pkg_install_arm64,
]
runs-on: ubuntu-18.04
steps:
- name: download all reports
uses: actions/download-artifact@v2-preview
- name: upload all reports
shell: bash {0}
continue-on-error: true
run: |
mkdir -p all_reports
cp -r ./pkg_install_amd64 ./all_reports/
cp -r ./pkg_install_arm64 ./all_reports/
- uses: actions/upload-artifact@v1
with:
name: all_reports
path: all_reports

View File

@ -487,6 +487,13 @@ verify-iso: # Make sure the current ISO exists in the expected bucket
out/docs/minikube.md: $(shell find "cmd") $(shell find "pkg/minikube/constants") $(SOURCE_GENERATED)
go run -ldflags="$(MINIKUBE_LDFLAGS)" -tags gendocs hack/help_text/gen_help_text.go
.PHONY: debs ## Build all deb packages
debs: out/minikube_$(DEB_VERSION)-$(DEB_REVISION)_amd64.deb \
out/minikube_$(DEB_VERSION)-$(DEB_REVISION)_arm64.deb \
out/docker-machine-driver-kvm2_$(DEB_VERSION).deb
.PHONY: deb_version
deb_version:
@echo $(DEB_VERSION)-$(DEB_REVISION)

View File

@ -0,0 +1,125 @@
/*
Copyright 2021 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// build integration
/*
Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package integration
import (
"context"
"fmt"
"os/exec"
"path/filepath"
"runtime"
"testing"
)
var distros = []string{
"debian:sid",
"debian:latest",
"debian:10",
"debian:9",
//
"ubuntu:latest",
"ubuntu:20.10",
"ubuntu:20.04",
"ubuntu:18.04",
}
var timeout = Minutes(10)
// TestPackageInstall tests installation of .deb packages with minikube itself and with kvm2 driver
// on debian/ubuntu docker images enumerated in "distros"
func TestDebPackageInstall(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
rr, err := Run(t, exec.CommandContext(ctx, "docker", "version"))
if err != nil || rr.ExitCode != 0 {
t.Skip("docker is not installed")
}
pkgDir, err := filepath.Abs(filepath.Dir(Target()))
if err != nil {
t.Errorf("failed to get minikube path: %v", err)
}
mkDebs, err := filepath.Glob(fmt.Sprintf("%s/minikube_*_%s.deb", pkgDir, runtime.GOARCH))
if err != nil {
t.Errorf("failed to find minikube deb in %q: %v", pkgDir, err)
}
kvmDebs, err := filepath.Glob(fmt.Sprintf("%s/docker-machine-driver-kvm2_*_%s.deb", pkgDir, runtime.GOARCH))
if err != nil {
t.Errorf("failed to find minikube deb in %q: %v", pkgDir, err)
}
for _, distro := range distros {
distroImg := distro
testName := fmt.Sprintf("install_%s_%s", runtime.GOARCH, distroImg)
t.Run(testName, func(t *testing.T) {
// apt-get update; dpkg -i minikube_${ver}_${arch}.deb
t.Run("minikube", func(t *testing.T) {
for _, mkDeb := range mkDebs {
rr, err := dpkgInstall(ctx, t, distro, mkDeb)
if err != nil || rr.ExitCode != 0 {
t.Errorf("failed to install %q on %q: err=%v, exit=%d",
mkDeb, distroImg, err, rr.ExitCode)
}
}
})
// apt-get update; apt-get install -y libvirt0; dpkg -i docker-machine-driver-kvm2_${ver}_${arch}.deb
t.Run("kvm2-driver", func(t *testing.T) {
for _, kvmDeb := range kvmDebs {
rr, err := dpkgInstallDriver(ctx, t, distro, kvmDeb)
if err != nil || rr.ExitCode != 0 {
t.Errorf("failed to install %q on %q: err=%v, exit=%d",
kvmDeb, distroImg, err, rr.ExitCode)
}
}
})
})
}
}
func dpkgInstall(ctx context.Context, t *testing.T, image, deb string) (*RunResult, error) {
return Run(t, exec.CommandContext(ctx,
"docker", "run", "--rm", fmt.Sprintf("-v%s:/var/tmp", filepath.Dir(deb)),
image,
"sh", "-c", fmt.Sprintf("apt-get update; dpkg -i /var/tmp/%s", filepath.Base(deb))))
}
func dpkgInstallDriver(ctx context.Context, t *testing.T, image, deb string) (*RunResult, error) {
return Run(t, exec.CommandContext(ctx,
"docker", "run", "--rm", fmt.Sprintf("-v%s:/var/tmp", filepath.Dir(deb)),
image,
"sh", "-c", fmt.Sprintf("apt-get update; apt-get install -y libvirt0; dpkg -i /var/tmp/%s", filepath.Base(deb))))
}