diff --git a/Jenkinsfile b/Jenkinsfile index e048ccd93..24cd62a0b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,4 +1,5 @@ def secrets = [ + [path: params.VAULT_PATH_SVC_ACCOUNT_EPHEMERAL, engineVersion: 1, secretValues: [ [envVar: 'OC_LOGIN_TOKEN', vaultKey: 'oc-login-token'], [envVar: 'OC_LOGIN_SERVER', vaultKey: 'oc-login-server']]], @@ -11,21 +12,169 @@ def secrets = [ [path: params.VAULT_PATH_RHR_PULL, engineVersion: 1, secretValues: [ [envVar: 'RH_REGISTRY_USER', vaultKey: 'user'], [envVar: 'RH_REGISTRY_TOKEN', vaultKey: 'token']]], + [path: params.VAULT_PATH_CHROME_CYPRESS, engineVersion: 1, secretValues: [ + [envVar: 'CHROME_ACCOUNT', vaultKey: 'account'], + [envVar: 'CHROME_PASSWORD', vaultKey: 'password']]], ] +def configuration = [vaultUrl: params.VAULT_ADDRESS, vaultCredentialId: params.VAULT_CREDS_ID, engineVersion: 1] + + pipeline { - agent { label 'insights' } + agent none options { timestamps() } environment { PROJECT_NAME="insights-chrome" + + MASTER_BRANCH="master" + MASTER_STABLE_BRANCH="master-stable" + + NODE_BASE_IMAGE="registry.access.redhat.com/ubi9/nodejs-18:1-53" + CYPRESS_TEST_IMAGE="quay.io/cloudservices/cypress-e2e-image:06b70f3" + + CICD_URL="https://raw.githubusercontent.com/RedHatInsights/cicd-tools/main" } stages { - stage('Placeholder') { - steps { - sh 'echo Placeholder Jenkinsfile' + stage('Tests/Build for Frontends') { + parallel { + stage('Unit Testing') { + agent { label 'insights' } + environment { + IMG_TAG=sh(script: "git rev-parse --short=8 HEAD", returnStdout: true).trim() + TEST_CONT="${PROJECT_NAME}-unit-tests-${IMG_TAG}" + } + steps { + script { + withVault([configuration: configuration, vaultSecrets: secrets]) { + sh ''' + ./ci/unit_tests.sh + ''' + } + } + } + } + + stage('Lint') { + agent { label 'insights' } + environment { + IMG_TAG=sh(script: "git rev-parse --short=8 HEAD", returnStdout: true).trim() + TEST_CONT="${PROJECT_NAME}-lint-${IMG_TAG}" + } + steps { + script { + withVault([configuration: configuration, vaultSecrets: secrets]) { + sh ''' + ./ci/lint.sh + ''' + } + } + } + } + + stage('Cypress Component Testing') { + agent { label 'insights' } + environment { + IMG_TAG=sh(script: "git rev-parse --short=8 HEAD", returnStdout: true).trim() + TEST_CONT="${PROJECT_NAME}-cypress-component-tests-${IMG_TAG}" + } + steps { + script { + withVault([configuration: configuration, vaultSecrets: secrets]) { + sh ''' + ./ci/cypress_component_tests.sh + ''' + } + } + } + } + + stage('Cypress E2E Tests') { + agent { label 'insights' } + environment { + IMG_TAG=sh(script: "git rev-parse --short=8 HEAD", returnStdout: true).trim() + TEST_CONT="${PROJECT_NAME}-cypress-e2e-tests-${IMG_TAG}" + + COMPONENT="insights-chrome-frontend" + IMAGE="quay.io/cloudservices/${COMPONENT}" + INCLUDE_CHROME_CONFIG="true" + } + steps { + script { + withVault([configuration: configuration, vaultSecrets: secrets]) { + sh ''' + ./ci/cypress_e2e_tests.sh + ''' + } + } + } + } + + stage('IQE Tests') { + agent { label 'insights' } + environment { + IMG_TAG=sh(script: "git rev-parse --short=8 HEAD", returnStdout: true).trim() + TEST_CONT="${PROJECT_NAME}-cypress-e2e-tests-${IMG_TAG}" + + // Deploy to an ephemeral namespace for testing + IMAGE="quay.io/cloudservices/rbac" + GIT_COMMIT="master" + IMAGE_TAG="latest" + DEPLOY_FRONTENDS=true + + // Run tests with ClowdJobInvocation + IQE_IMAGE_TAG="platform-ui" + IQE_PLUGINS="platform_ui" + IQE_MARKER_EXPRESSION="smoke" + // xclude progressive profile tests + // Exclude APIdocs tests + IQE_FILTER_EXPRESSION="not (test_progressive or test_apidocs)" + IQE_ENV="ephemeral" + IQE_SELENIUM="true" + IQE_CJI_TIMEOUT="30m" + DEPLOY_TIMEOUT="900" // 15min + + // Ensure that we deploy the right component for testing + APP_NAME="rbac" + COMPONENT="rbac" + COMPONENT_NAME="rbac" + } + + steps { + script { + withVault([configuration: configuration, vaultSecrets: secrets]) { + sh ''' + ./ci/iqe_tests.sh + ''' + } + } + } + post { + always { + archiveArtifacts artifacts: 'artifacts/**/*', fingerprint: true + junit skipPublishingChecks: true, testResults: 'artifacts/junit-*.xml' + } + } + } + + stage('Frontend Build') { + agent { label 'insights' } + environment { + COMMON_BUILDER="https://raw.githubusercontent.com/RedHatInsights/insights-frontend-builder-common/master" + + COMPONENT="insights-chrome-frontend" + IMAGE="quay.io/cloudservices/${COMPONENT}" + } + steps { + withVault([configuration: configuration, vaultSecrets: secrets]) { + sh ''' + ./ci/frontend-build.sh + ''' + } + } + } } } } diff --git a/ci/cypress_component_tests.sh b/ci/cypress_component_tests.sh new file mode 100755 index 000000000..deac1e7b7 --- /dev/null +++ b/ci/cypress_component_tests.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -x + +docker login -u="$QUAY_USER" -p="$QUAY_TOKEN" quay.io + +docker run --name $TEST_CONT -d -i --rm "${CYPRESS_TEST_IMAGE}" /bin/bash + +docker cp -a . "${TEST_CONT}:/e2e/" + +docker exec -i $TEST_CONT sh -c "npm ci" +docker exec -i $TEST_CONT sh -c "npm run test:ct" + +RESULT=$? + +if [[ $RESULT -ne 0 ]]; then + exit $RESULT +fi + +docker stop $TEST_CONT + +exit $RESULT diff --git a/ci/cypress_e2e_tests.sh b/ci/cypress_e2e_tests.sh new file mode 100755 index 000000000..7e8aeb0ba --- /dev/null +++ b/ci/cypress_e2e_tests.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +set -x + +docker login -u="$QUAY_USER" -p="$QUAY_TOKEN" quay.io + +docker run \ + --name $TEST_CONT \ + -e CHROME_ACCOUNT=$CHROME_ACCOUNT \ + -e CHROME_PASSWORD=$CHROME_PASSWORD \ + --add-host stage.foo.redhat.com:127.0.0.1 \ + --add-host prod.foo.redhat.com:127.0.0.1 \ + -d -i --rm \ + --entrypoint bash \ + "${CYPRESS_TEST_IMAGE}" + +docker cp -a . "${TEST_CONT}:/e2e/" + +docker exec -i $TEST_CONT sh -c "npm ci" +docker exec -i $TEST_CONT sh -c "npm run test:e2e" + +RESULT=$? + +if [[ $RESULT -ne 0 ]]; then + exit $RESULT +fi + +docker stop $TEST_CONT diff --git a/ci/frontend-build.sh b/ci/frontend-build.sh new file mode 100755 index 000000000..b598b15bb --- /dev/null +++ b/ci/frontend-build.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +curl -sSL "${COMMON_BUILDER}/src/frontend-build.sh" > .frontend-build.sh +source ./.frontend-build.sh + +BUILD_RESULTS=$? + +if [[ $BUILD_RESULTS -ne 0 ]]; then + exit $BUILD_RESULTS +fi diff --git a/ci/iqe_tests.sh b/ci/iqe_tests.sh new file mode 100755 index 000000000..ed3b2a09d --- /dev/null +++ b/ci/iqe_tests.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -x + +curl -s $CICD_URL/bootstrap.sh > .cicd_bootstrap.sh +source ./.cicd_bootstrap.sh + +GIT_COMMIT="master" +IMAGE_TAG="latest" + +source $CICD_ROOT/deploy_ephemeral_env.sh +source $CICD_ROOT/cji_smoke_test.sh + +mkdir -p $WORKSPACE/artifacts +cat << EOF > $WORKSPACE/artifacts/junit-dummy.xml + + + +EOF + +RESULT=$? + +if [[ $RESULT -ne 0 ]]; then + exit $RESULT +fi + +exit $RESULT diff --git a/ci/lint.sh b/ci/lint.sh new file mode 100755 index 000000000..e9615db92 --- /dev/null +++ b/ci/lint.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -x + +docker run --name $TEST_CONT -d -i --rm $NODE_BASE_IMAGE /bin/sh + +docker cp . "${TEST_CONT}:/opt/app-root/src/" + +docker exec -i -w "/opt/app-root/src/" $TEST_CONT sh -c "npm ci" +docker exec -i -w "/opt/app-root/src/" $TEST_CONT sh -c "npm run lint" + +docker stop $TEST_CONT diff --git a/ci/unit_tests.sh b/ci/unit_tests.sh new file mode 100755 index 000000000..93632dce1 --- /dev/null +++ b/ci/unit_tests.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -x + +docker run --name $TEST_CONT -d -i --rm "${NODE_BASE_IMAGE}" /bin/sh + +docker cp . "${TEST_CONT}:/opt/app-root/src/" + +docker exec -i -w "/opt/app-root/src/" $TEST_CONT sh -c "npm ci" +docker exec -i -w "/opt/app-root/src/" $TEST_CONT sh -c "npm run test -- --coverage" + +RESULT=$? + +if [[ $RESULT -ne 0 ]]; then + exit $RESULT +fi + +docker stop $TEST_CONT + +exit $RESULT