Skip to content

Commit

Permalink
feat: add e2e tests
Browse files Browse the repository at this point in the history
  • Loading branch information
yetone committed Jan 4, 2023
1 parent 7f61c61 commit 1d798c5
Show file tree
Hide file tree
Showing 13 changed files with 600 additions and 26 deletions.
216 changes: 216 additions & 0 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
name: e2e
on:
issue_comment:
types: [created]

env:
E2E_CHECK_NAME: e2e tests

jobs:
triage:
runs-on: ubuntu-latest
name: Comment evaluate
outputs:
run-e2e: ${{ startsWith(github.event.comment.body,'/run-e2e') && steps.checkUserMember.outputs.isTeamMember == 'true' }}
pr_num: ${{ steps.parser.outputs.pr_num }}
image_tag: "pr-${{ steps.parser.outputs.pr_num }}-${{ steps.parser.outputs.commit_sha }}"
commit_sha: ${{ steps.parser.outputs.commit_sha }}
version_buildflags: ${{ steps.parser.outputs.version_buildflags }}
image_build_hash: ${{ steps.parser.outputs.image_build_hash }}

steps:
- uses: actions/checkout@v3

- uses: tspascoal/get-user-teams-membership@v2
id: checkUserMember
with:
username: ${{ github.actor }}
team: 'dev'
GITHUB_TOKEN: ${{ secrets.GH_CHECKING_USER_AUTH }}

- name: Update comment with the execution url
if: ${{ startsWith(github.event.comment.body,'/run-e2e') && steps.checkUserMember.outputs.isTeamMember == 'true' }}
uses: peter-evans/create-or-update-comment@v2
with:
comment-id: ${{ github.event.comment.id }}
body: |
**Update:** You can check the progress [here](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}})
reactions: rocket

- name: Parse git info
if: ${{ startsWith(github.event.comment.body,'/run-e2e') && steps.checkUserMember.outputs.isTeamMember == 'true' }}
id: parser
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Get PR number
PR_URL="${{ github.event.issue.pull_request.url }}"
PR_NUM=${PR_URL##*/}
echo "Checking out from PR #$PR_NUM based on URL: $PR_URL"
echo "::set-output name=pr_num::$PR_NUM"
# Get commit SHA
git config --global --add safe.directory "$GITHUB_WORKSPACE"
gh pr checkout $PR_NUM
SHA=$(git log -n 1 --pretty=format:"%H")
echo "::set-output name=commit_sha::$SHA"
GIT_COMMIT=$(git describe --match=NeVeRmAtCh --tags --always --dirty | cut -c 1-7)
BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)
VERSION=$(git describe --tags `git rev-list --tags --max-count=1` | sed 's/v\(\)/\1/')
PKG=github.com/bentoml/yatai-image-builder
VERSION_BUILDFLAGS="-X '${PKG}/version.GitCommit=${GIT_COMMIT}' -X '${PKG}/version.Version=${VERSION}' -X '${PKG}/version.BuildDate=${BUILD_DATE}'"
echo "::set-output name=version_buildflags::$VERSION_BUILDFLAGS"
echo "::set-output name=image_build_hash::${{ hashFiles('Dockerfile', 'main.go', './apis/**', './controllers/**', './utils/**', './version/**', './yatai-client/**', '**/go.sum', '**go.mod') }}"
build-test-images:
needs: triage
if: needs.triage.outputs.run-e2e == 'true'
runs-on: ubuntu-latest
steps:
- name: Set status in-progress
uses: LouisBrunner/[email protected]
with:
token: ${{ secrets.GITHUB_TOKEN }}
sha: ${{ needs.triage.outputs.commit_sha }}
name: ${{ env.E2E_CHECK_NAME }}
status: in_progress
details_url: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}

- uses: actions/checkout@v3

- name: Register workspace path
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

- name: Checkout Pull Request
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
id: checkout
run: |
gh pr checkout ${{ needs.triage.outputs.pr_num }}
- name: Set up Docker Buildx
id: buildx
# Use the action from the master, as we've seen some inconsistencies with @v1
# Issue: https://github.com/docker/build-push-action/issues/286
uses: docker/setup-buildx-action@master
with:
install: true

- name: Login to Quay.io
uses: docker/login-action@v1
with:
registry: quay.io
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_ROBOT_TOKEN }}

- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
# Key is named differently to avoid collision
key: ${{ runner.os }}-multi-buildx-${{ needs.triage.outputs.image_build_hash }}
restore-keys: |
${{ runner.os }}-multi-buildx
- name: Build test image
uses: docker/build-push-action@v2
with:
build-args: 'VERSION_BUILDFLAGS=${{ needs.triage.outputs.version_buildflags }}'
context: .
push: true
tags: quay.io/bentoml/test-yatai-image-builder:${{ needs.triage.outputs.image_tag }}
cache-from: type=local,src=/tmp/.buildx-cache
# Note the mode=max here
# More: https://github.com/moby/buildkit#--export-cache-options
# And: https://github.com/docker/buildx#--cache-tonametypetypekeyvalue
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache-new

- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
run-test:
needs: [triage, build-test-images]
if: needs.triage.outputs.run-e2e == 'true'
runs-on: ubuntu-latest
steps:
- name: Set status in-progress
uses: LouisBrunner/[email protected]
with:
token: ${{ secrets.GITHUB_TOKEN }}
sha: ${{ needs.triage.outputs.commit_sha }}
name: ${{ env.E2E_CHECK_NAME }}
status: in_progress
details_url: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}

- name: Checkout
uses: actions/checkout@v3

- name: Register workspace path
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

- name: Checkout Pull Request
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
id: checkout
run: |
gh pr checkout ${{ needs.triage.outputs.pr_num }}
- name: Install KinD
run: ./tests/gh-actions/install_kind.sh

- name: Install Helm
run: ./tests/gh-actions/install_helm.sh

- name: Create KinD Cluster
run: kind create cluster --config tests/gh-actions/kind-cluster-1-24.yaml

- uses: oNaiPs/secrets-to-env-action@v1
with:
secrets: ${{ toJSON(secrets) }}

- name: Run e2e test
continue-on-error: true
id: test
env:
YATAI_DEPLOYMENT_IMG_REPO: test-yatai-image-builder
YATAI_DEPLOYMENT_IMG_TAG: ${{ needs.triage.outputs.image_tag }}
run: |
./tests/e2e/installation_test.sh
make test-e2e
- name: Set status success
uses: LouisBrunner/[email protected]
if: steps.test.outcome == 'success'
with:
token: ${{ secrets.GITHUB_TOKEN }}
sha: ${{ needs.triage.outputs.commit_sha }}
name: ${{ env.E2E_CHECK_NAME }}
conclusion: success
details_url: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}

- name: React to comment with success
uses: dkershner6/reaction-action@v1
if: steps.test.outcome == 'success'
with:
token: ${{ secrets.GITHUB_TOKEN }}
commentId: ${{ github.event.comment.id }}
reaction: "hooray"

- name: React to comment with failure
uses: dkershner6/reaction-action@v1
if: steps.test.outcome != 'success'
with:
token: ${{ secrets.GITHUB_TOKEN }}
commentId: ${{ github.event.comment.id }}
reaction: "confused"

- name: Set status failure
uses: LouisBrunner/[email protected]
if: steps.test.outcome != 'success'
with:
token: ${{ secrets.GITHUB_TOKEN }}
sha: ${{ needs.triage.outputs.commit_sha }}
name: ${{ env.E2E_CHECK_NAME }}
conclusion: failure
details_url: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ vet: ## Run go vet against code.
test: manifests generate fmt vet envtest ## Run tests.
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out

.PHONY: test-e2e # You will need to have a Kind cluster up in running to run this target
test-e2e:
go test ./tests/e2e/ -v -ginkgo.v -timeout 20m

##@ Build

.PHONY: build
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ require (
github.com/huandu/xstrings v1.3.2
github.com/iancoleman/strcase v0.2.0
github.com/onsi/ginkgo v1.16.5
github.com/onsi/ginkgo/v2 v2.1.4
github.com/onsi/gomega v1.19.0
github.com/pkg/errors v0.9.1
github.com/sirupsen/logrus v1.8.1
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY=
github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
Expand Down
86 changes: 60 additions & 26 deletions scripts/quick-install-yatai-image-builder.sh
Original file line number Diff line number Diff line change
Expand Up @@ -194,13 +194,9 @@ DOCKER_REGISTRY_PASSWORD=''
DOCKER_REGISTRY_SECURE=false
DOCKER_REGISTRY_BENTO_REPOSITORY_NAME=yatai-bentos

helm_repo_name=bentoml
helm_repo_url=https://bentoml.github.io/helm-charts

# check if DEVEL_HELM_REPO is true
if [ "${DEVEL_HELM_REPO}" = "true" ]; then
helm_repo_name=bentoml-devel
helm_repo_url=https://bentoml.github.io/helm-charts-devel
YATAI_ENDPOINT=${YATAI_ENDPOINT:-http://yatai.yatai-system.svc.cluster.local}
if [ "${YATAI_ENDPOINT}" = "empty" ]; then
YATAI_ENDPOINT=""
fi

UPGRADE_CRDS=${UPGRADE_CRDS:-false}
Expand All @@ -216,27 +212,65 @@ if [ "${UPGRADE_CRDS}" = "true" ]; then
echo "✅ Bento CRD are established"
fi

helm repo remove ${helm_repo_name} 2> /dev/null || true
helm repo add ${helm_repo_name} ${helm_repo_url}
helm repo update ${helm_repo_name}
USE_LOCAL_HELM_CHART=${USE_LOCAL_HELM_CHART:-false}

# if $VERSION is not set, use the latest version
if [ -z "$VERSION" ]; then
VERSION=$(helm search repo ${helm_repo_name} --devel="$DEVEL" -l | grep "${helm_repo_name}/yatai-image-builder " | awk '{print $2}' | head -n 1)
fi
if [ "${USE_LOCAL_HELM_CHART}" = "true" ]; then
YATAI_IMAGE_BUILDER_IMG_REGISTRY=${YATAI_IMAGE_BUILDER_IMG_REGISTRY:-quay.io/bentoml}
YATAI_IMAGE_BUILDER_IMG_REPO=${YATAI_IMAGE_BUILDER_IMG_REPO:-yatai-image-builder}
YATAI_IMAGE_BUILDER_IMG_TAG=${YATAI_IMAGE_BUILDER_IMG_TAG:-0.0.1}

echo "🤖 installing yatai-image-builder from local helm chart..."
helm upgrade --install yatai-image-builder ./helm/yatai-image-builder -n ${namespace} \
--set registry=${YATAI_IMAGE_BUILDER_IMG_REGISTRY} \
--set image.repository=${YATAI_IMAGE_BUILDER_IMG_REPO} \
--set image.tag=${YATAI_IMAGE_BUILDER_IMG_TAG} \
--set yatai.endpoint=${YATAI_ENDPOINT} \
--set dockerRegistry.server=${DOCKER_REGISTRY_SERVER} \
--set dockerRegistry.inClusterServer=${DOCKER_REGISTRY_IN_CLUSTER_SERVER} \
--set dockerRegistry.username=${DOCKER_REGISTRY_USERNAME} \
--set dockerRegistry.password=${DOCKER_REGISTRY_PASSWORD} \
--set dockerRegistry.secure=${DOCKER_REGISTRY_SECURE} \
--set dockerRegistry.bentoRepositoryName=${DOCKER_REGISTRY_BENTO_REPOSITORY_NAME} \
--set aws.accessKeyID=${AWS_ACCESS_KEY_ID} \
--set aws.secretAccessKeyExistingSecretName=${AWS_SECRET_ACCESS_KEY_EXISTING_SECRET_NAME} \
--set aws.secretAccessKeyExistingSecretKey=${AWS_SECRET_ACCESS_KEY_EXISTING_SECRET_KEY} \
--skip-crds=${UPGRADE_CRDS}
else
helm_repo_name=bentoml
helm_repo_url=https://bentoml.github.io/helm-charts

echo "🤖 installing yatai-image-builder ${VERSION} from helm repo ${helm_repo_name}..."
helm upgrade --install yatai-image-builder ${helm_repo_name}/yatai-image-builder -n ${namespace} \
--set dockerRegistry.server=${DOCKER_REGISTRY_SERVER} \
--set dockerRegistry.inClusterServer=${DOCKER_REGISTRY_IN_CLUSTER_SERVER} \
--set dockerRegistry.username=${DOCKER_REGISTRY_USERNAME} \
--set dockerRegistry.password=${DOCKER_REGISTRY_PASSWORD} \
--set dockerRegistry.secure=${DOCKER_REGISTRY_SECURE} \
--set dockerRegistry.bentoRepositoryName=${DOCKER_REGISTRY_BENTO_REPOSITORY_NAME} \
--set yatai.endpoint=${YATAI_ENDPOINT} \
--skip-crds=${UPGRADE_CRDS} \
--version=${VERSION} \
--devel=${DEVEL}
# check if DEVEL_HELM_REPO is true
if [ "${DEVEL_HELM_REPO}" = "true" ]; then
helm_repo_name=bentoml-devel
helm_repo_url=https://bentoml.github.io/helm-charts-devel
fi

helm repo remove ${helm_repo_name} 2> /dev/null || true
helm repo add ${helm_repo_name} ${helm_repo_url}
helm repo update ${helm_repo_name}

# if $VERSION is not set, use the latest version
if [ -z "$VERSION" ]; then
VERSION=$(helm search repo ${helm_repo_name} --devel="$DEVEL" -l | grep "${helm_repo_name}/yatai-image-builder " | awk '{print $2}' | head -n 1)
fi

echo "🤖 installing yatai-image-builder ${VERSION} from helm repo ${helm_repo_name}..."
helm upgrade --install yatai-image-builder ${helm_repo_name}/yatai-image-builder -n ${namespace} \
--set yatai.endpoint=${YATAI_ENDPOINT} \
--set dockerRegistry.server=${DOCKER_REGISTRY_SERVER} \
--set dockerRegistry.inClusterServer=${DOCKER_REGISTRY_IN_CLUSTER_SERVER} \
--set dockerRegistry.username=${DOCKER_REGISTRY_USERNAME} \
--set dockerRegistry.password=${DOCKER_REGISTRY_PASSWORD} \
--set dockerRegistry.secure=${DOCKER_REGISTRY_SECURE} \
--set dockerRegistry.bentoRepositoryName=${DOCKER_REGISTRY_BENTO_REPOSITORY_NAME} \
--set yatai.endpoint=${YATAI_ENDPOINT} \
--set aws.accessKeyID=${AWS_ACCESS_KEY_ID} \
--set aws.secretAccessKeyExistingSecretName=${AWS_SECRET_ACCESS_KEY_EXISTING_SECRET_NAME} \
--set aws.secretAccessKeyExistingSecretKey=${AWS_SECRET_ACCESS_KEY_EXISTING_SECRET_KEY} \
--skip-crds=${UPGRADE_CRDS} \
--version=${VERSION} \
--devel=${DEVEL}
fi

kubectl -n ${namespace} rollout restart deploy/yatai-image-builder

Expand Down
16 changes: 16 additions & 0 deletions tests/e2e/e2e_suite_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package e2e

import (
"fmt"
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

// Run e2e tests using the Ginkgo runner.
func TestE2E(t *testing.T) {
RegisterFailHandler(Fail)
fmt.Fprintf(GinkgoWriter, "Starting yatai-image-builder e2e suite\n")
RunSpecs(t, "yatai-image-builder e2e suite")
}
Loading

0 comments on commit 1d798c5

Please sign in to comment.