From deb322d3d34002210b356ee4da5dee481bb6fcfa Mon Sep 17 00:00:00 2001 From: Sergey Skorik Date: Fri, 31 Jan 2020 18:59:15 +0200 Subject: [PATCH] create cico_pt_test script (#15896) Moving from Codenvy CI to the CentOS CI: add script for devtools-che-che-pullrequest-test project --- tests/.infra/centos-ci/cico_pr_test.sh | 56 +++ .../centos-ci/functional_tests_utils.sh | 391 ++++++++++++++++++ 2 files changed, 447 insertions(+) create mode 100755 tests/.infra/centos-ci/cico_pr_test.sh create mode 100755 tests/.infra/centos-ci/functional_tests_utils.sh diff --git a/tests/.infra/centos-ci/cico_pr_test.sh b/tests/.infra/centos-ci/cico_pr_test.sh new file mode 100755 index 0000000000..00a0d43813 --- /dev/null +++ b/tests/.infra/centos-ci/cico_pr_test.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# Copyright (c) 2020 Red Hat, Inc. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html + +set -e +set +x + +source tests/.infra/centos-ci/functional_tests_utils.sh + +eval "$(./env-toolkit load -f jenkins-env.json -r ^ghprbPullId)" + +export PULL_REQUEST_ID="${ghprbPullId}" +export TAG=PR-${PULL_REQUEST_ID} + +function prepareCustomResourceFile() { + cd /tmp + wget https://raw.githubusercontent.com/eclipse/che-operator/master/deploy/crds/org_v1_che_cr.yaml -O custom-resource.yaml + sed -i "s@server:@server:\n customCheProperties:\n CHE_LIMITS_USER_WORKSPACES_RUN_COUNT: '-1'@g" /tmp/custom-resource.yaml + sed -i "s/customCheProperties:/customCheProperties:\n CHE_WORKSPACE_AGENT_DEV_INACTIVE__STOP__TIMEOUT__MS: '300000'/" /tmp/custom-resource.yaml + sed -i "s@cheImage: ''@cheImage: 'quay.io/eclipse/che-server'@g" /tmp/custom-resource.yaml + sed -i "s@cheImageTag: 'nightly'@cheImageTag: '${TAG}'@g" /tmp/custom-resource.yaml + cat /tmp/custom-resource.yaml +} + +function buidCheServer() { + mvn clean install -Pintegration + bash dockerfiles/che/build.sh --organization:quay.io/eclipse --tag:${TAG} --dockerfile:Dockerfile +} + +function pushImageToRegistry() { + docker login -u "${QUAY_ECLIPSE_CHE_USERNAME}" -p "${QUAY_ECLIPSE_CHE_PASSWORD}" "quay.io" + docker push "quay.io/eclipse/che-server:${TAG}" +} + +setupEnvs +installDependencies +installDockerCompose +buidCheServer +pushImageToRegistry +installKVM +installAndStartMinishift +loginToOpenshiftAndSetDevRole +prepareCustomResourceFile +installCheCtl + +deployCheIntoCluster --chenamespace=eclipse-che --che-operator-cr-yaml=/tmp/custom-resource.yaml +seleniumTestsSetup + +bash /root/payload/tests/legacy-e2e/che-selenium-test/selenium-tests.sh --threads=4 --host=${CHE_ROUTE} --port=80 --multiuser + +saveSeleniumTestResult +getOpenshiftLogs +archiveArtifacts "che-pullrequests-test-temporary" diff --git a/tests/.infra/centos-ci/functional_tests_utils.sh b/tests/.infra/centos-ci/functional_tests_utils.sh new file mode 100755 index 0000000000..a9d9f2e53c --- /dev/null +++ b/tests/.infra/centos-ci/functional_tests_utils.sh @@ -0,0 +1,391 @@ +#!/usr/bin/env bash + +# Copyright (c) 2020 Red Hat, Inc. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html + +buildAndDeployArtifacts() { + set -x + scl enable rh-maven33 'mvn clean install -U -Pintegration' + if [[ $? -eq 0 ]]; then + echo 'Build Success!' + echo 'Going to deploy artifacts' + else + die_with 'Build Failed!' + fi +} + +testImages() { + echo "Going to build and push docker images" + set -e + set -o pipefail + + TAG=$1 + if [[ ${TAG} != "nightly" ]]; then #if given tag 'nightly' means that don't need to checkout and going to build master + git checkout ${TAG} + fi + REGISTRY="quay.io" + ORGANIZATION="eclipse" + if [[ -n "${QUAY_ECLIPSE_CHE_USERNAME}" ]] && [[ -n "${QUAY_ECLIPSE_CHE_PASSWORD}" ]]; then + docker login -u "${QUAY_ECLIPSE_CHE_USERNAME}" -p "${QUAY_ECLIPSE_CHE_PASSWORD}" "${REGISTRY}" + else + echo "Could not login, missing credentials for pushing to the '${ORGANIZATION}' organization" + return + fi + + # stop / rm all containers + if [[ $(docker ps -aq) != "" ]]; then + docker rm -f $(docker ps -aq) + fi + + # KEEP RIGHT ORDER!!! + DOCKER_FILES_LOCATIONS=( + dockerfiles/endpoint-watcher + dockerfiles/keycloak + dockerfiles/postgres + dockerfiles/dev + dockerfiles/che + dockerfiles/dashboard-dev + dockerfiles/e2e + ) + + IMAGES_LIST=( + eclipse/che-endpoint-watcher + eclipse/che-keycloak + eclipse/che-postgres + eclipse/che-dev + eclipse/che-server + eclipse/che-dashboard-dev + eclipse/che-e2e + ) + + # BUILD IMAGES + for image_dir in ${DOCKER_FILES_LOCATIONS[@]}; do + bash $(pwd)/${image_dir}/build.sh --tag:${TAG} + if [[ ${image_dir} == "dockerfiles/che" ]]; then + #CENTOS SINGLE USER + BUILD_ASSEMBLY_DIR=$(echo assembly/assembly-main/target/eclipse-che-*/eclipse-che-*/) + LOCAL_ASSEMBLY_DIR="${image_dir}/eclipse-che" + if [[ -d "${LOCAL_ASSEMBLY_DIR}" ]]; then + rm -r "${LOCAL_ASSEMBLY_DIR}" + fi + cp -r "${BUILD_ASSEMBLY_DIR}" "${LOCAL_ASSEMBLY_DIR}" + docker build -t ${ORGANIZATION}/che-server:${TAG}-centos -f $(pwd)/${image_dir}/Dockerfile.centos $(pwd)/${image_dir}/ + fi + if [[ $? -ne 0 ]]; then + echo "ERROR:" + echo "build of '${image_dir}' image is failed!" + exit 1 + fi + done + + echo '=========================== LIST OF IMAGES ===========================' + docker images -a + echo '=========================== LIST OF IMAGES ===========================' +} + +function installOC() { + OC_DIR_NAME=openshift-origin-client-tools-v3.11.0-0cbc58b-linux-64bit + curl -vL "https://github.com/openshift/origin/releases/download/v3.11.0/${OC_DIR_NAME}.tar.gz" --output ${OC_DIR_NAME}.tar.gz + tar -xvf ${OC_DIR_NAME}.tar.gz + cp ${OC_DIR_NAME}/oc /usr/local/bin + cp ${OC_DIR_NAME}/oc /tmp +} + +function installJQ() { + installEpelRelease + yum install --assumeyes -d1 jq +} + +function installEpelRelease() { + if yum repolist | grep epel; then + echo "Epel already installed, skipping instalation." + else + #excluding mirror1.ci.centos.org + echo "exclude=mirror1.ci.centos.org" >>/etc/yum/pluginconf.d/fastestmirror.conf + echo "Installing epel..." + yum install -d1 --assumeyes epel-release + yum update --assumeyes -d1 + fi +} + +function installYQ() { + installEpelRelease + yum install --assumeyes -d1 python3-pip + pip3 install --upgrade setuptools + pip3 install yq +} + +function installStartDocker() { + yum install --assumeyes -d1 yum-utils device-mapper-persistent-data lvm2 + yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + yum install --assumeyes -d1 docker-ce + mkdir -p /etc/docker + echo "{ \"insecure-registries\": [\"172.30.0.0/16\"] }" >/etc/docker/daemon.json + systemctl start docker + docker version +} + +function installMvn() { + yum install --assumeyes -d1 centos-release-scl + yum install --assumeyes -d1 rh-maven33 +} + +function installNodejs() { + curl -sL https://rpm.nodesource.com/setup_10.x | bash - + yum install -y nodejs +} + +function insalllYarn() { + yum-config-manager --add-repo https://dl.yarnpkg.com/rpm/yarn.repo + yum install -y yarn +} + +function installGit() { + yum install --assumeyes -d1 git +} + +function installWget() { + yum -y install wget +} + +function installGssCompiler() { + yum install -y gcc-c++ make +} + +function installDependencies() { + echo "======== Installing dependencies: ========" + start=$(date +%s) + + installEpelRelease + installYQ + installStartDocker + installJQ + installOC + installGit + installWget + # Getting dependencies ready + yum install --assumeyes -d1 \ + patch \ + pcp \ + bzip2 \ + golang \ + make \ + java-1.8.0-openjdk \ + java-1.8.0-openjdk-devel + installMvn + installNodejs + insalllYarn + + stop=$(date +%s) + instal_dep_duration=$(($stop - $start)) + echo "======== Installing all dependencies lasted $instal_dep_duration seconds. ========" + +} + +function checkAllCreds() { + echo "======== Checking credentials: ========" + CREDS_NOT_SET="false" + + echo ${#QUAY_ECLIPSE_CHE_USERNAME} + echo ${#QUAY_ECLIPSE_CHE_PASSWORD} + + if [[ -z "${QUAY_ECLIPSE_CHE_USERNAME}" || -z "${QUAY_ECLIPSE_CHE_PASSWORD}" ]]; then + echo "Docker registry credentials not set" + CREDS_NOT_SET="true" + fi + + if [[ "${CREDS_NOT_SET}" = "true" ]]; then + echo "Failed to parse jenkins secure store credentials" + exit 2 + else + echo "Credentials set successfully." + fi +} + +function installKVM() { + echo "======== Start to install KVM virtual machine ========" + + yum install -y qemu-kvm libvirt libvirt-python libguestfs-tools virt-install + + curl -L https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.10.0/docker-machine-driver-kvm-centos7 -o /usr/local/bin/docker-machine-driver-kvm + chmod +x /usr/local/bin/docker-machine-driver-kvm + + systemctl enable libvirtd + systemctl start libvirtd + + virsh net-list --all + echo "======== KVM has been installed successfully ========" +} + +function installAndStartMinishift() { + echo "======== Start to install minishift ========" + curl -Lo minishift.tgz https://github.com/minishift/minishift/releases/download/v1.34.2/minishift-1.34.2-linux-amd64.tgz + tar -xvf minishift.tgz --strip-components=1 + chmod +x ./minishift + mv ./minishift /usr/local/bin/minishift + + minishift version + minishift config set memory 14GB + minishift config set cpus 4 + + echo "======== Lunch minishift ========" + minishift start +} + +function installCheCtl() { + echo "======== Start to install chectl ========" + bash <(curl -sL https://www.eclipse.org/che/chectl/) --channel=next + echo "======== chectl has been installed successfully ========" +} + +function getOpenshiftLogs() { + oc logs $(oc get pods --selector=component=che -o jsonpath="{.items[].metadata.name}") || true + oc logs $(oc get pods --selector=component=keycloak -o jsonpath="{.items[].metadata.name}") || true +} + +function deployCheIntoCluster() { + echo "======== Start to install CHE ========" + if chectl server:start -a operator -p openshift --k8spodreadytimeout=360000 $1 $2; then + echo "Started succesfully" + oc get checluster -o yaml + else + echo "======== oc get events ========" + oc get events + echo "======== oc get all ========" + oc get all + # echo "==== docker ps ====" + # docker ps + # echo "==== docker ps -q | xargs -L 1 docker logs ====" + # docker ps -q | xargs -L 1 docker logs | true + getOpenshiftLogs + curl -vL http://keycloak-che.${LOCAL_IP_ADDRESS}.nip.io/auth/realms/che/.well-known/openid-configuration || true + oc get checluster -o yaml || true + exit 1337 + fi +} + +function loginToOpenshiftAndSetDevRole() { + oc login -u system:admin + oc adm policy add-cluster-role-to-user cluster-admin developer + oc login -u developer -p pass +} + +function archiveArtifacts() { + JOB_NAME=$1 + DATE=$(date +"%m-%d-%Y-%H-%M") + echo "Archiving artifacts from ${DATE} for ${JOB_NAME}/${BUILD_NUMBER}" + ls -la ./artifacts.key + chmod 600 ./artifacts.key + chown $(whoami) ./artifacts.key + mkdir -p ./che/${JOB_NAME}/${BUILD_NUMBER} + cp -R ./report ./che/${JOB_NAME}/${BUILD_NUMBER}/ | true + rsync --password-file=./artifacts.key -Hva --partial --relative ./che/${JOB_NAME}/${BUILD_NUMBER} devtools@artifacts.ci.centos.org::devtools/ +} + +function defindCheRoute(){ +CHE_ROUTE=$(oc get route che --template='{{ .spec.host }}') + echo "====== Check CHE ROUTE ======" + curl -vL $CHE_ROUTE +} + +createTestWorkspaceAndRunTest() { + defindCheRoute + ### Create workspace + chectl workspace:start --access-token "$USER_ACCESS_TOKEN" -f https://raw.githubusercontent.com/eclipse/che/master/tests/e2e/files/happy-path/happy-path-workspace.yaml + + ### Create directory for report + mkdir report + REPORT_FOLDER=$(pwd)/report + ### Run tests + docker run --shm-size=256m --network host -v $REPORT_FOLDER:/tmp/e2e/report:Z -e TS_SELENIUM_BASE_URL="http://$CHE_ROUTE" -e TS_SELENIUM_MULTIUSER="true" -e TS_SELENIUM_USERNAME="${TEST_USERNAME}" -e TS_SELENIUM_PASSWORD="${TEST_USERNAME}" -e TS_SELENIUM_LOAD_PAGE_TIMEOUT=420000 quay.io/eclipse/che-e2e:nightly +} + +function createTestUserAndObtainUserToken() { + + ### Create user and obtain token + KEYCLOAK_URL=$(oc get route/keycloak -o jsonpath='{.spec.host}') + KEYCLOAK_BASE_URL="http://${KEYCLOAK_URL}/auth" + + ADMIN_USERNAME=admin + ADMIN_PASS=admin + TEST_USERNAME=testUser1 + + echo "======== Getting admin token ========" + ADMIN_ACCESS_TOKEN=$(curl -X POST $KEYCLOAK_BASE_URL/realms/master/protocol/openid-connect/token -H "Content-Type: application/x-www-form-urlencoded" -d "username=admin" -d "password=admin" -d "grant_type=password" -d "client_id=admin-cli" | jq -r .access_token) + echo $ADMIN_ACCESS_TOKEN + + echo "========Creating user========" + USER_JSON="{\"username\": \"${TEST_USERNAME}\",\"enabled\": true,\"emailVerified\": true,\"email\":\"test1@user.aa\"}" + echo $USER_JSON + + curl -X POST $KEYCLOAK_BASE_URL/admin/realms/che/users -H "Authorization: Bearer ${ADMIN_ACCESS_TOKEN}" -H "Content-Type: application/json" -d "${USER_JSON}" -v + USER_ID=$(curl -X GET $KEYCLOAK_BASE_URL/admin/realms/che/users?username=${TEST_USERNAME} -H "Authorization: Bearer ${ADMIN_ACCESS_TOKEN}" | jq -r .[0].id) + echo "========User id: $USER_ID========" + + echo "========Updating password========" + CREDENTIALS_JSON={\"type\":\"password\",\"value\":\"${TEST_USERNAME}\",\"temporary\":false} + echo $CREDENTIALS_JSON + + curl -X PUT $KEYCLOAK_BASE_URL/admin/realms/che/users/${USER_ID}/reset-password -H "Authorization: Bearer ${ADMIN_ACCESS_TOKEN}" -H "Content-Type: application/json" -d "${CREDENTIALS_JSON}" -v + export USER_ACCESS_TOKEN=$(curl -X POST $KEYCLOAK_BASE_URL/realms/che/protocol/openid-connect/token -H "Content-Type: application/x-www-form-urlencoded" -d "username=${TEST_USERNAME}" -d "password=${TEST_USERNAME}" -d "grant_type=password" -d "client_id=che-public" | jq -r .access_token) + echo "========User Access Token: $USER_ACCESS_TOKEN " +} + +function setupEnvs() { + eval "$(./env-toolkit load -f jenkins-env.json -r \ + CHE_BOT_GITHUB_TOKEN \ + CHE_MAVEN_SETTINGS \ + CHE_GITHUB_SSH_KEY \ + ^BUILD_NUMBER$ \ + CHE_OSS_SONATYPE_GPG_KEY \ + CHE_OSS_SONATYPE_PASSPHRASE \ + QUAY_ECLIPSE_CHE_USERNAME \ + QUAY_ECLIPSE_CHE_PASSWORD)" + + export PATH=$PATH:/opt/rh/rh-maven33/root/bin +} + +function configureGithubTestUser() { + echo "Configure GitHub test users" + cd /root/payload + mkdir -p che_local_conf_dir + export CHE_LOCAL_CONF_DIR=/root/payload/che_local_conf_dir/ + rm -f che_local_conf_dir/selenium.properties + echo "github.username=che6ocpmulti" >> che_local_conf_dir/selenium.properties + echo "github.password=CheMain2017" >> che_local_conf_dir/selenium.properties + echo "github.auxiliary.username=iedexmain1" >> che_local_conf_dir/selenium.properties + echo "github.auxiliary.password=CodenvyMain15" >> che_local_conf_dir/selenium.properties +} + +function installDockerCompose() { + echo "Install docker compose" + sudo curl -L "https://github.com/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose +} + +function seleniumTestsSetup() { + echo "Start selenium tests" + cd /root/payload + export CHE_INFRASTRUCTURE=openshift + defindCheRoute + + mvn clean install -pl :che-selenium-test -am -DskipTests=true -U + configureGithubTestUser +} + +function saveSeleniumTestResult() { + mkdir -p /root/payload/report + mkdir -p /root/payload/report/site + cp -r /root/payload/tests/legacy-e2e/che-selenium-test/target/site report +} + +function createIndentityProvider() { + CHE_MULTI_USER_GITHUB_CLIENTID_OCP=04cbc0f8172109d5e2e5 + CHE_MULTI_USER_GITHUB_SECRET_OCP=a0a9b8602bb0916d8b4a62e71b7ed92036563b7a + CHE_OPENSHIFT_PROJECT=eclipse-che + keycloakPodName=$(oc get pod --namespace=$CHE_OPENSHIFT_PROJECT | grep keycloak | awk '{print $1}') + /tmp/oc exec $keycloakPodName --namespace=$CHE_OPENSHIFT_PROJECT -- /opt/jboss/keycloak/bin/kcadm.sh create identity-provider/instances -r che -s alias=github -s providerId=github -s enabled=true -s storeToken=true -s addReadTokenRoleOnCreate=true -s 'config.useJwksUrl="true"' -s config.clientId=$CHE_MULTI_USER_GITHUB_CLIENTID_OCP -s config.clientSecret=$CHE_MULTI_USER_GITHUB_SECRET_OCP -s 'config.defaultScope="repo,user,write:public_key"' --no-config --server http://localhost:8080/auth --user admin --password admin --realm master +} \ No newline at end of file