Initial e2e setup with default test
This commit is contained in:
		
							parent
							
								
									0baa4f6b09
								
							
						
					
					
						commit
						e29c152be0
					
				|  | @ -26,6 +26,30 @@ concurrency: | ||||||
|   cancel-in-progress: true |   cancel-in-progress: true | ||||||
| 
 | 
 | ||||||
| jobs: | jobs: | ||||||
|  |   default-setup2: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     timeout-minutes: 20 | ||||||
|  |     if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.id == github.repository_id | ||||||
|  |     env: | ||||||
|  |       TARGET_ORG: ${{ env.TARGET_ORG }} | ||||||
|  |       TARGET_REPO: ${{ env.TARGET_REPO }} | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |         with: | ||||||
|  |           ref: ${{github.head_ref}} | ||||||
|  | 
 | ||||||
|  |       - name: Get configure token | ||||||
|  |         id: config-token | ||||||
|  |         uses: peter-murray/workflow-application-token-action@8e1ba3bf1619726336414f1014e37f17fbadf1db | ||||||
|  |         with: | ||||||
|  |           application_id: ${{ secrets.E2E_TESTS_ACCESS_APP_ID }} | ||||||
|  |           application_private_key: ${{ secrets.E2E_TESTS_ACCESS_PK }} | ||||||
|  |           organization: ${{ env.TARGET_ORG }} | ||||||
|  | 
 | ||||||
|  |       - name: Run default setup test | ||||||
|  |         run: hack/e2e-test.sh default-setup | ||||||
|  |         shell: bash | ||||||
|  | 
 | ||||||
|   default-setup: |   default-setup: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     timeout-minutes: 20 |     timeout-minutes: 20 | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										4
									
								
								Makefile
								
								
								
								
							|  | @ -297,6 +297,10 @@ acceptance/runner/startup: | ||||||
| e2e: | e2e: | ||||||
| 	go test -count=1 -v -timeout 600s -run '^TestE2E$$' ./test/e2e | 	go test -count=1 -v -timeout 600s -run '^TestE2E$$' ./test/e2e | ||||||
| 
 | 
 | ||||||
|  | .PHONY: gha-e2e | ||||||
|  | gha-e2e: | ||||||
|  | 	bash hack/e2e-test.sh | ||||||
|  | 
 | ||||||
| # Upload release file to GitHub.
 | # Upload release file to GitHub.
 | ||||||
| github-release: release | github-release: release | ||||||
| 	ghr ${VERSION} release/ | 	ghr ${VERSION} release/ | ||||||
|  |  | ||||||
|  | @ -0,0 +1,92 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | DIR="$(dirname "${BASH_SOURCE[0]}")" | ||||||
|  | 
 | ||||||
|  | DIR="$(realpath "${DIR}")" | ||||||
|  | 
 | ||||||
|  | TEST_DIR="$(realpath "${DIR}/../test/actions.github.com")" | ||||||
|  | 
 | ||||||
|  | export PLATFORMS="linux/amd64" | ||||||
|  | 
 | ||||||
|  | TARGETS=() | ||||||
|  | 
 | ||||||
|  | function set_targets() { | ||||||
|  |     local cases="$(find "${TEST_DIR}" -name '*.test.sh' | sed "s#^${TEST_DIR}/##g" )" | ||||||
|  | 
 | ||||||
|  |     mapfile -t TARGETS < <(echo "${cases}") | ||||||
|  | 
 | ||||||
|  |     echo $TARGETS | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function env_test() { | ||||||
|  |     if [[ -z "${GITHUB_TOKEN}" ]]; then | ||||||
|  |         echo "Error: GITHUB_TOKEN is not set" | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if [[ -z "${TARGET_ORG}" ]]; then | ||||||
|  |         echo "Error: TARGET_ORG is not set" | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if [[ -z "${TARGET_REPO}" ]]; then | ||||||
|  |         echo "Error: TARGET_REPO is not set" | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function usage() { | ||||||
|  |     echo "Usage: $0 [test_name]" | ||||||
|  |     echo "  test_name: the name of the test to run" | ||||||
|  |     echo "    if not specified, all tests will be run" | ||||||
|  |     echo "    test_name should be the name of the test file without the .test.sh suffix" | ||||||
|  |     echo "" | ||||||
|  |     exit 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function main() { | ||||||
|  |     local failed=() | ||||||
|  | 
 | ||||||
|  |     env_test | ||||||
|  | 
 | ||||||
|  |     if [[ -z "${1}" ]]; then | ||||||
|  |         echo "Running all tests" | ||||||
|  |         set_targets | ||||||
|  |     elif [[ -f "${TEST_DIR}/${1}.test.sh" ]]; then | ||||||
|  |         echo "Running test ${1}" | ||||||
|  |         TARGETS=("${1}.test.sh") | ||||||
|  |     else | ||||||
|  |         usage | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     for target in "${TARGETS[@]}"; do | ||||||
|  |         echo "============================================================" | ||||||
|  |         test="${TEST_DIR}/${target}" | ||||||
|  |         if [[ ! -x "${test}" ]]; then | ||||||
|  |             echo "Error: test ${test} is not executable or not found" | ||||||
|  |             failed+=("${test}") | ||||||
|  |             continue | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         echo "Running test ${target}" | ||||||
|  |         if ! "${test}"; then | ||||||
|  |             failed+=("${target}") | ||||||
|  |             echo "---------------------------------" | ||||||
|  |             echo "FAILED: ${target}" | ||||||
|  |         else | ||||||
|  |             echo "---------------------------------" | ||||||
|  |             echo "PASSED: ${target}" | ||||||
|  |         fi | ||||||
|  |         echo "============================================================" | ||||||
|  |     done | ||||||
|  | 
 | ||||||
|  |     if [[ "${#failed[@]}" -gt 0 ]]; then | ||||||
|  |         echo "Failed tests:" | ||||||
|  |         for fail in "${failed[@]}"; do | ||||||
|  |             echo "  ${fail}" | ||||||
|  |         done | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | main $@ | ||||||
|  | @ -0,0 +1,75 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | set -e | ||||||
|  | 
 | ||||||
|  | DIR="$(dirname "${BASH_SOURCE[0]}")" | ||||||
|  | 
 | ||||||
|  | DIR="$(realpath "${DIR}")" | ||||||
|  | 
 | ||||||
|  | ROOT_DIR="$(realpath "${DIR}/../..")" | ||||||
|  | 
 | ||||||
|  | source "${DIR}/helper.sh" | ||||||
|  | 
 | ||||||
|  | SCALE_SET_NAME="default-$(date +'%M%S')$(((${RANDOM} + 100) % 100 +  1))" | ||||||
|  | SCALE_SET_NAMESPACE="arc-runners" | ||||||
|  | WORKFLOW_FILE="arc-test-workflow.yaml" | ||||||
|  | ARC_NAME="arc" | ||||||
|  | ARC_NAMESPACE="arc-systems" | ||||||
|  | 
 | ||||||
|  | function install_arc() { | ||||||
|  |     echo "Creating namespace ${ARC_NAMESPACE}" | ||||||
|  |     kubectl create namespace "${SCALE_SET_NAMESPACE}" | ||||||
|  | 
 | ||||||
|  |     echo "Installing ARC" | ||||||
|  |     helm install "${ARC_NAME}" \ | ||||||
|  |         --namespace "${ARC_NAMESPACE}" \ | ||||||
|  |         --create-namespace \ | ||||||
|  |         --set image.repository="${IMAGE_NAME}" \ | ||||||
|  |         --set image.tag="${IMAGE_TAG}" \ | ||||||
|  |         ${ROOT_DIR}/charts/gha-runner-scale-set-controller \ | ||||||
|  |         --debug | ||||||
|  | 
 | ||||||
|  |     if ! NAME="${ARC_NAME}" NAMESPACE="${ARC_NAMESPACE}" wait_for_arc; then | ||||||
|  |         NAMESPACE="${ARC_NAMESPACE}" log_arc | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function install_scale_set() { | ||||||
|  |     echo "Installing scale set ${SCALE_SET_NAMESPACE}/${SCALE_SET_NAME}" | ||||||
|  |     helm install "${SCALE_SET_NAME}" \ | ||||||
|  |         --namespace "${SCALE_SET_NAMESPACE}" \ | ||||||
|  |         --create-namespace \ | ||||||
|  |         --set githubConfigUrl="https://github.com/${TARGET_ORG}/${TARGET_REPO}" \ | ||||||
|  |         --set githubConfigSecret.github_token="${GITHUB_TOKEN}" \ | ||||||
|  |         ${ROOT_DIR}/charts/gha-runner-scale-set \ | ||||||
|  |         --version="${VERSION}" \ | ||||||
|  |         --debug | ||||||
|  | 
 | ||||||
|  |     if ! NAME="${SCALE_SET_NAME}" NAMESPACE="${ARC_NAMESPACE}" wait_for_scale_set; then | ||||||
|  |         NAMESPACE="${ARC_NAMESPACE}" log_arc | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function main() { | ||||||
|  |     local failed=() | ||||||
|  | 
 | ||||||
|  |     build_image | ||||||
|  |     create_cluster | ||||||
|  | 
 | ||||||
|  |     install_arc | ||||||
|  |     install_scale_set | ||||||
|  | 
 | ||||||
|  |     WORKFLOW_FILE="${WORKFLOW_FILE}" SCALE_SET_NAME="${SCALE_SET_NAME}" run_workflow || failed+=("run_workflow") | ||||||
|  | 
 | ||||||
|  |     INSTALLATION_NAME="${SCALE_SET_NAME}" NAMESPACE="${SCALE_SET_NAMESPACE}" cleanup_scale_set || failed+=("cleanup_scale_set") | ||||||
|  | 
 | ||||||
|  |     NAMESPACE="${ARC_NAMESPACE}" log_arc || failed+=("log_arc") | ||||||
|  | 
 | ||||||
|  |     delete_cluster | ||||||
|  | 
 | ||||||
|  |     print_results "${failed[@]}" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | main | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | export TARGET_ORG="org" | ||||||
|  | export TARGET_REPO="repo" | ||||||
|  | export GITHUB_TOKEN="token" | ||||||
|  | @ -0,0 +1,165 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | DIR="$(dirname "${BASH_SOURCE[0]}")" | ||||||
|  | 
 | ||||||
|  | DIR="$(realpath "${DIR}")" | ||||||
|  | 
 | ||||||
|  | ROOT_DIR="$(realpath "${DIR}/../..")" | ||||||
|  | 
 | ||||||
|  | export TARGET_ORG="${TARGET_ORG:-actions-runner-controller}" | ||||||
|  | export TARGET_REPO="${TARGET_REPO:-arc_e2e_test_dummy}" | ||||||
|  | export IMAGE_NAME="${IMAGE_NAME:-arc-test-image}" | ||||||
|  | export VERSION="${VERSION:-$(yq .version < "${ROOT_DIR}/charts/gha-runner-scale-set-controller/Chart.yaml")}" | ||||||
|  | export IMAGE_VERSION="${IMAGE_VERSION:-${VERSION}}" | ||||||
|  | 
 | ||||||
|  | function build_image() { | ||||||
|  |     echo "Building ARC image ${IMAGE_NAME}:${IMAGE_VERSION}" | ||||||
|  | 
 | ||||||
|  |     cd ${ROOT_DIR} | ||||||
|  | 
 | ||||||
|  | 	export DOCKER_CLI_EXPERIMENTAL=enabled | ||||||
|  | 	export DOCKER_BUILDKIT=1 | ||||||
|  | 	docker buildx build --platform ${PLATFORMS} \ | ||||||
|  | 		--build-arg RUNNER_VERSION=${RUNNER_VERSION} \ | ||||||
|  | 		--build-arg DOCKER_VERSION=${DOCKER_VERSION} \ | ||||||
|  | 		--build-arg VERSION=${VERSION} \ | ||||||
|  | 		--build-arg COMMIT_SHA=${COMMIT_SHA} \ | ||||||
|  | 		-t "${IMAGE_NAME}:${IMAGE_VERSION}" \ | ||||||
|  | 		-f Dockerfile \ | ||||||
|  | 		. --load | ||||||
|  | 
 | ||||||
|  |     echo "Created image ${IMAGE_NAME}:${IMAGE_VERSION}" | ||||||
|  |     cd - | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function create_cluster() { | ||||||
|  |     echo "Deleting minikube cluster if exists" | ||||||
|  |     minikube delete || true | ||||||
|  | 
 | ||||||
|  |     echo "Creating minikube cluster" | ||||||
|  |     minikube start | ||||||
|  | 
 | ||||||
|  |     echo "Loading image into minikube cluster" | ||||||
|  |     minikube image load "${IMAGE_NAME}:${IMAGE_VERSION}" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function delete_cluster() { | ||||||
|  |     echo "Deleting minikube cluster" | ||||||
|  |     minikube delete | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function log_arc() { | ||||||
|  |     echo "ARC logs" | ||||||
|  |     kubectl logs -n "${NAMESPACE}" -l app.kubernetes.io/name=gha-rs-controller | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function wait_for_arc() { | ||||||
|  |     echo "Waiting for ARC to be ready" | ||||||
|  |     local count=0; | ||||||
|  |     while true; do | ||||||
|  |         POD_NAME=$(kubectl get pods -n ${NAMESPACE} -l app.kubernetes.io/name=gha-rs-controller -o name) | ||||||
|  |         if [ -n "$POD_NAME" ]; then | ||||||
|  |             echo "Pod found: $POD_NAME" | ||||||
|  |             break | ||||||
|  |         fi | ||||||
|  |         if [ "$count" -ge 60 ]; then | ||||||
|  |             echo "Timeout waiting for controller pod with label app.kubernetes.io/name=gha-rs-controller" | ||||||
|  |             return 1 | ||||||
|  |         fi | ||||||
|  |         sleep 1 | ||||||
|  |         count=$((count+1)) | ||||||
|  |     done | ||||||
|  | 
 | ||||||
|  |     kubectl wait --timeout=30s --for=condition=ready pod -n "${NAMESPACE}" -l app.kubernetes.io/name=gha-rs-controller | ||||||
|  |     kubectl get pod -n "${NAMESPACE}" | ||||||
|  |     kubectl describe deployment "${NAME}" -n "${NAMESPACE}" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function wait_for_scale_set() { | ||||||
|  |     local count=0 | ||||||
|  |     while true; do | ||||||
|  |         POD_NAME=$(kubectl get pods -n ${NAMESPACE} -l actions.github.com/scale-set-name=${NAME} -o name) | ||||||
|  |         if [ -n "$POD_NAME" ]; then | ||||||
|  |             echo "Pod found: ${POD_NAME}" | ||||||
|  |             break | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         if [ "$count" -ge 60 ]; then | ||||||
|  |             echo "Timeout waiting for listener pod with label actions.github.com/scale-set-name=${NAME}" | ||||||
|  |             return 1 | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         sleep 1 | ||||||
|  |         count=$((count+1)) | ||||||
|  |     done | ||||||
|  |     kubectl wait --timeout=30s --for=condition=ready pod -n ${NAMESPACE} -l actions.github.com/scale-set-name=${NAME} | ||||||
|  |     kubectl get pod -n ${NAMESPACE} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function cleanup_scale_set() { | ||||||
|  |     helm uninstall "${INSTALLATION_NAME}" --namespace "${NAMESPACE}" --debug | ||||||
|  | 
 | ||||||
|  |     kubectl wait --timeout=40s --for=delete autoscalingrunnersets -n "${NAMESPACE}" -l app.kubernetes.io/instance="${INSTALLATION_NAME}" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function install_openebs() { | ||||||
|  |     echo "Install openebs/dynamic-localpv-provisioner" | ||||||
|  |     helm repo add openebs https://openebs.github.io/charts | ||||||
|  |     helm repo update | ||||||
|  |     helm install openebs openebs/openebs --namespace openebs --create-namespace | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function print_results() { | ||||||
|  |     local failed=("$@") | ||||||
|  | 
 | ||||||
|  |     if [[ "${#failed[@]}" -ne 0 ]]; then | ||||||
|  |         echo "----------------------------------" | ||||||
|  |         echo "The following tests failed:" | ||||||
|  |         for test in "${failed[@]}"; do | ||||||
|  |             echo "  - ${test}" | ||||||
|  |         done | ||||||
|  |         return 1 | ||||||
|  |     else | ||||||
|  |         echo "----------------------------------" | ||||||
|  |         echo "All tests passed!" | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function run_workflow() { | ||||||
|  |     echo "Checking if the workflow file exists" | ||||||
|  |     gh workflow view -R "${TARGET_ORG}/${TARGET_REPO}" "${WORKFLOW_FILE}" &> /dev/null || return 1 | ||||||
|  | 
 | ||||||
|  |     local queue_time="$(date -u +%FT%TZ)" | ||||||
|  | 
 | ||||||
|  |     echo "Running workflow ${workflow_file}" | ||||||
|  |     gh workflow run -R "${TARGET_ORG}/${TARGET_REPO}" "${WORKFLOW_FILE}" --ref main -f arc_name="${SCALE_SET_NAME}" || return 1 | ||||||
|  | 
 | ||||||
|  |     echo "Waiting for run to start" | ||||||
|  |     local count=0 | ||||||
|  |     local run_id= | ||||||
|  |     while true; do | ||||||
|  |         if [[ "${count}" -ge 12 ]]; then | ||||||
|  |             echo "Timeout waiting for run to start" | ||||||
|  |             return 1 | ||||||
|  |         fi | ||||||
|  |         run_id=$(gh run list -R "${TARGET_ORG}/${TARGET_REPO}" --workflow "${WORKFLOW_FILE}" --created ">${queue_time}" --json "name,databaseId" --jq ".[] | select(.name | contains(\"${SCALE_SET_NAME}\")) | .databaseId") | ||||||
|  |         echo "Run ID: ${run_id}" | ||||||
|  |         if [ -n "$run_id" ]; then | ||||||
|  |             echo "Run found!" | ||||||
|  |             break | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         echo "Run not found yet, waiting 5 seconds" | ||||||
|  |         sleep 5 | ||||||
|  |         count=$((count+1)) | ||||||
|  |     done | ||||||
|  | 
 | ||||||
|  |     echo "Waiting for run to complete" | ||||||
|  |     local code=$(gh run watch "${run_id}" -R "${TARGET_ORG}/${TARGET_REPO}" --exit-status &> /dev/null) | ||||||
|  |     if [[ "${code}" -ne 0 ]]; then | ||||||
|  |         echo "Run failed with exit code ${code}" | ||||||
|  |         return 1 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     echo "Run completed successfully" | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue