diff --git a/build_deploy.sh b/build_deploy.sh index 2d4790c..833d72f 100755 --- a/build_deploy.sh +++ b/build_deploy.sh @@ -2,11 +2,13 @@ set -exv -source 'deployment/build-deploy-common.sh' +export CICD_BOOTSTRAP_REPO_BRANCH='main' +export CICD_BOOTSTRAP_REPO_ORG='RedHatInsights' +CICD_TOOLS_URL="https://raw.githubusercontent.com/${CICD_BOOTSTRAP_REPO_ORG}/cicd-tools/${CICD_BOOTSTRAP_REPO_BRANCH}/src/bootstrap.sh" +# shellcheck source=/dev/null +source <(curl -sSL "$CICD_TOOLS_URL") image_builder -IMAGE_NAME="${IMAGE_NAME:-quay.io/cloudservices/floorist}" -BUILD_DEPLOY_BUILD_TARGET="${BUILD_DEPLOY_BUILD_TARGET:-base}" -BACKWARDS_COMPATIBILITY=false -BUILD_PARAMS="--no-cache" +export CICD_IMAGE_BUILDER_IMAGE_NAME='quay.io/cloudservices/floorist' +BUILD_TARGET=${BUILD_TARGET:-base} -build_deploy_main || exit 1 +cicd::image_builder::build_and_push --no-cache --target "${BUILD_TARGET}" diff --git a/deployment/build-deploy-common.sh b/deployment/build-deploy-common.sh deleted file mode 100644 index c73daf9..0000000 --- a/deployment/build-deploy-common.sh +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/env bash - -BUILD_DEPLOY_WORKDIR=$(pwd) -BACKWARDS_COMPATIBILITY="${BACKWARDS_COMPATIBILITY:-true}" -BACKWARDS_COMPATIBILITY_TAGS="qa" -REQUIRED_REGISTRIES="quay redhat" -REQUIRED_REGISTRIES_LOCAL="redhat" -LOCAL_BUILD="${LOCAL_BUILD:-false}" -DOCKER_CONF="$BUILD_DEPLOY_WORKDIR/.docker" -DOCKERFILE=${DOCKERFILE:="${BUILD_DEPLOY_WORKDIR}/Dockerfile"} -REDHAT_REGISTRY="${REDHAT_REGISTRY:-registry.redhat.io}" -QUAY_REGISTRY="${QUAY_REGISTRY:-quay.io}" -BUILD_DEPLOY_TEMP_IMAGE="${BUILD_DEPLOY_TEMP_IMAGE:-false}" -CONTAINER_ENGINE_CMD='' -BUILD_ARGS='' -BUILD_PARAMS='' - -local_build() { - [ "$LOCAL_BUILD" = true ] -} - -temporary_image() { - [ "$BUILD_DEPLOY_TEMP_IMAGE" = true ] -} - -build_target() { - [ -n "$BUILD_DEPLOY_BUILD_TARGET" ] -} - -backwards_compatibility_enabled() { - [ "$BACKWARDS_COMPATIBILITY" = true ] -} - -is_ci_runner() { - [[ "$(hostname)" == "ci-"* ]] -} - -get_7_chars_commit_hash() { - echo "$(git rev-parse --short=7 HEAD)" -} - -_check_command_is_present() { - command -v "$1" >/dev/null -} - -login_container_registry() { - - local USER="$1" - local PASSWORD="$2" - local REGISTRY="$3" - - container_engine_cmd login "-u=${USER}" "--password-stdin" "$REGISTRY" <<< "$PASSWORD" -} - -login_quay_registry() { - login_container_registry "$QUAY_USER" "$QUAY_TOKEN" "$QUAY_REGISTRY" -} - -login_redhat_registry() { - login_container_registry "$RH_REGISTRY_USER" "$RH_REGISTRY_TOKEN" "$REDHAT_REGISTRY" -} - -login_container_registry_type() { - - local REGISTRY="$1" - - if [ "$REGISTRY" = 'quay' ]; then - login_quay_registry || return 1 - elif [ "$REGISTRY" = 'redhat' ]; then - login_redhat_registry || return 1 - else - echo "unsupported registry '$REGISTRY'" - return 1 - fi -} - -login_to_required_registries() { - - for REGISTRY in $REQUIRED_REGISTRIES_LOCAL; do - if ! login_container_registry_type "$REGISTRY"; then - echo "Error while attempting to log into '${REGISTRY}' registry" - return 1 - fi - done - - if ! local_build; then - for REGISTRY in $REQUIRED_REGISTRIES; do - if ! login_container_registry_type "$REGISTRY"; then - echo "Error while attempting to log into '${REGISTRY}' registry" - return 1 - fi - done - fi -} - -check_quay_registry_credentials() { - [ -n "$QUAY_USER" ] && [ -n "$QUAY_TOKEN" ] -} - -check_rh_registry_credentials() { - [ -n "$RH_REGISTRY_USER" ] && [ -n "$RH_REGISTRY_TOKEN" ] -} - -check_registry_credentials() { - - local REGISTRY="$1" - - if [ "$REGISTRY" = 'quay' ]; then - check_quay_registry_credentials || return 1 - elif [ "$REGISTRY" = 'redhat' ]; then - check_rh_registry_credentials || return 1 - else - echo "unsupported registry '$REGISTRY'" - return 1 - fi -} - -check_required_registry_credentials() { - - for REGISTRY in $REQUIRED_REGISTRIES_LOCAL; do - if ! check_registry_credentials "$REGISTRY"; then - echo "Error checking environment for ${REGISTRY} registry credentials" - return 1 - fi - done - - if ! local_build; then - for REGISTRY in $REQUIRED_REGISTRIES; do - if ! check_registry_credentials "$REGISTRY"; then - echo "Error checking environment for ${REGISTRY} registry credentials" - return 1 - fi - done - fi -} - -container_engine_cmd() { - - if [ "$CONTAINER_ENGINE_CMD" = "podman" ]; then - podman "$@" - else - docker "--config=${DOCKER_CONF}" "$@" - fi -} - -initialize_container_engine_cmd() { - - if _check_command_is_present podman && ! is_ci_runner; then - CONTAINER_ENGINE_CMD='podman' - else - mkdir -p "$DOCKER_CONF" - CONTAINER_ENGINE_CMD='docker' - fi -} - -_get_build_args() { - - local tmp='' - - for BUILD_ARG in $BUILD_ARGS; do - tmp="${tmp} --build-arg $BUILD_ARG" - done - - echo "$tmp" -} - -build_image() { - - local BUILD_ARGS_CMD='' - local IMAGE_LABELS='' - local BUILD_TARGET='' - - if temporary_image; then - IMAGE_LABELS='--label quay.expires-after=3d' - fi - - if build_target; then - BUILD_TARGET="--target $BUILD_DEPLOY_BUILD_TARGET" - fi - - if [ -n "$BUILD_ARGS" ]; then - BUILD_ARGS_CMD=$(_get_build_args) - container_engine_cmd build --pull $BUILD_PARAMS -f "$DOCKERFILE" $BUILD_ARGS_CMD -t "${IMAGE_NAME}:${IMAGE_TAG}" $BUILD_TARGET $IMAGE_LABELS . - else - container_engine_cmd build --pull $BUILD_PARAMS -f "$DOCKERFILE" -t "${IMAGE_NAME}:${IMAGE_TAG}" $BUILD_TARGET $IMAGE_LABELS . - fi - -} - -push_image() { - - local IMAGE_TAG="$1" - - container_engine_cmd push "${IMAGE_NAME}:${IMAGE_TAG}" -} - -tag_image() { - - local NEW_IMAGE_TAG="$1" - - container_engine_cmd tag "${IMAGE_NAME}:${IMAGE_TAG}" "${IMAGE_NAME}:${NEW_IMAGE_TAG}" -} - -tag_and_push_for_backwards_compatibility() { - - for TAG in $BACKWARDS_COMPATIBILITY_TAGS; do - tag_image "$TAG" - if ! local_build; then - push_image "$TAG" - fi - done -} - -build_deploy_init() { - check_required_registry_credentials || return 1 - initialize_container_engine_cmd || return 1 - login_to_required_registries || return 1 - - # TODO - validate some image related variables ? wrap this into function - if [ -z "$IMAGE_NAME" ]; then - echo "you must define IMAGE_NAME" - return 1 - fi - - if [ ! -r "$DOCKERFILE" ]; then - echo "ERROR: No ${DOCKERFILE} found or not readable" - return 1 - fi -} - -build_deploy_main() { - - if ! build_deploy_init; then - echo "build_deploy init phase failed!" - return 1 - fi - - if ! build_image; then - echo "failed building image!" - return 1 - fi - - if ! local_build; then - push_image "$IMAGE_TAG" - tag_image "latest" - push_image "latest" - fi - - # To enable backwards compatibility with ci, qa, and smoke, always push latest and qa tags - if backwards_compatibility_enabled; then - tag_and_push_for_backwards_compatibility - fi -} - -IMAGE_TAG=$(get_7_chars_commit_hash) -IMAGE_NAME='' -ADITIONAL_TAGS='' diff --git a/pr_check.sh b/pr_check.sh index 84d4c3c..3c1f9a1 100755 --- a/pr_check.sh +++ b/pr_check.sh @@ -1,12 +1,6 @@ #!/usr/bin/env bash -if [ "$LOCAL_BUILD" != true ]; then - # Install bonfire repo/initialize - there are patches applied on bootstrap, required even if not using bonfire - CICD_URL=https://raw.githubusercontent.com/RedHatInsights/bonfire/master/cicd - curl -s $CICD_URL/bootstrap.sh > .cicd_bootstrap.sh && source .cicd_bootstrap.sh -fi - -APP_ROOT=${APP_ROOT:-`pwd`} +APP_ROOT=${APP_ROOT:-$(pwd)} # -------------------------------------------- # Options that must be configured by app owner # -------------------------------------------- @@ -16,8 +10,7 @@ COMPONENT_NAME="floorist" # name of app-sre "resourceTemplate" in deploy.yaml f cat /etc/redhat-release -BUILD_DEPLOY_BUILD_TARGET="test" -BUILD_DEPLOY_TEMP_IMAGE=true +export BUILD_TARGET="test" source "$APP_ROOT/build_deploy.sh" || exit 1 diff --git a/run-tests.sh b/run-tests.sh index 94fc007..1f99e6b 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -1,12 +1,22 @@ #!/bin/bash +export CICD_BOOTSTRAP_REPO_BRANCH='main' +export CICD_BOOTSTRAP_REPO_ORG='RedHatInsights' +APP_ROOT=${APP_ROOT:-$(pwd)} +CICD_TOOLS_URL="https://raw.githubusercontent.com/${CICD_BOOTSTRAP_REPO_ORG}/cicd-tools/${CICD_BOOTSTRAP_REPO_BRANCH}/src/bootstrap.sh" +# shellcheck source=/dev/null +source <(curl -sSL "$CICD_TOOLS_URL") image_builder + +export CICD_IMAGE_BUILDER_IMAGE_NAME='quay.io/cloudservices/floorist' +TAG=$(cicd::image_builder::get_image_tag) + cd "$APP_ROOT" -DB_CONTAINER_NAME="floorist-db-${IMAGE_TAG}" -MINIO_CONTAINER_NAME="floorist-minio-${IMAGE_TAG}" -MINIO_CLIENT_CONTAINER_NAME="floorist-minio-client-${IMAGE_TAG}" -TEST_CONTAINER_NAME="floorist-test-${IMAGE_TAG}" -NETWORK="floorist-test-${IMAGE_TAG}" +DB_CONTAINER_NAME="floorist-db-${TAG}" +MINIO_CONTAINER_NAME="floorist-minio-${TAG}" +MINIO_CLIENT_CONTAINER_NAME="floorist-minio-client-${TAG}" +TEST_CONTAINER_NAME="floorist-test-${TAG}" +NETWORK="floorist-test-${TAG}" POSTGRES_IMAGE="quay.io/cloudservices/centos-postgresql-12" MINIO_IMAGE="quay.io/cloudservices/minio" @@ -21,7 +31,7 @@ DATABASE_NAME="floorist" MINIO_ACCESS_KEY="floorist" MINIO_SECRET_KEY="floorist" -TESTS_ENV_FILE="$APP_ROOT/tests/env.yaml" +TESTS_ENV_FILE="${APP_ROOT}/tests/env.yaml" FLOORPLAN_FILE="tests/floorplan_valid.yaml" @@ -43,23 +53,23 @@ EOF } function teardown_docker { - docker rm -f "$DB_CONTAINER_NAME" || true - docker rm -f "$MINIO_CONTAINER_NAME" || true - docker rm -f "$MINIO_CLIENT_CONTAINER_NAME" || true - docker rm -f "$TEST_CONTAINER_NAME" || true + cicd::container::cmd rm -f "$DB_CONTAINER_NAME" || true + cicd::container::cmd rm -f "$MINIO_CONTAINER_NAME" || true + cicd::container::cmd rm -f "$MINIO_CLIENT_CONTAINER_NAME" || true + cicd::container::cmd rm -f "$TEST_CONTAINER_NAME" || true try_to_delete_network || true } try_to_delete_network() { - if ! docker network rm "$NETWORK"; then + if ! cicd::container::cmd network rm "$NETWORK"; then for CONTAINER_ID in "$DB_CONTAINER_NAME" "$MINIO_CONTAINER_NAME" "$MINIO_CONTAINER_NAME" "$TEST_CONTAINER_NAME"; do - docker rm -f "$CONTAINER_ID" - docker network disconnect -f "$NETWORK" "$CONTAINER_ID" + cicd::container::cmd rm -f "$CONTAINER_ID" + cicd::container::cmd network disconnect -f "$NETWORK" "$CONTAINER_ID" done - if ! docker network rm "$NETWORK"; then + if ! cicd::container::cmd network rm "$NETWORK"; then echo "failed deleting network '$NETWORK'"; return 1 fi @@ -68,14 +78,14 @@ try_to_delete_network() { try_to_create_container_network() { - if docker network inspect "$NETWORK" >/dev/null; then + if cicd::container::cmd network inspect "$NETWORK" >/dev/null; then if ! try_to_delete_network "$NETWORK"; then return 1 fi fi - if ! docker network create --driver bridge "$NETWORK"; then + if ! cicd::container::cmd network create --driver bridge "$NETWORK"; then echo "failed to create network $NETWORK" return 1 fi @@ -85,7 +95,7 @@ trap "teardown_docker" EXIT SIGINT SIGTERM try_to_create_container_network || exit 1 -DB_CONTAINER_ID=$(docker run -d \ +DB_CONTAINER_ID=$(cicd::container::cmd run -d \ --name "${DB_CONTAINER_NAME}" \ --network "$NETWORK" \ --rm \ @@ -100,7 +110,7 @@ if [[ "$DB_CONTAINER_ID" == "0" ]]; then exit 1 fi -MINIO_CONTAINER_ID=$(docker run -d \ +MINIO_CONTAINER_ID=$(cicd::container::cmd run -d \ --name "${MINIO_CONTAINER_NAME}" \ --network "$NETWORK" \ --rm \ @@ -120,7 +130,7 @@ MINIO_CLIENT_COMMAND=""" exit 0; """ -MINIO_CLIENT_CONTAINER_ID=$(docker run -d \ +MINIO_CLIENT_CONTAINER_ID=$(cicd::container::cmd run -d \ --name "${MINIO_CLIENT_CONTAINER_NAME}" \ --network "$NETWORK" \ --rm \ @@ -133,7 +143,7 @@ if [[ "$MINIO_CLIENT_CONTAINER_ID" == "0" ]]; then fi # Do tests -TEST_CONTAINER_ID=$(docker run -d \ +TEST_CONTAINER_ID=$(cicd::container::cmd run -d \ --name "${TEST_CONTAINER_NAME}" \ --network "$NETWORK" \ --rm \ @@ -146,7 +156,7 @@ TEST_CONTAINER_ID=$(docker run -d \ -e POSTGRESQL_PASSWORD="$DATABASE_PASSWORD" \ -e POSTGRESQL_DATABASE="$DATABASE_NAME" \ -e FLOORPLAN_FILE="$FLOORPLAN_FILE" \ - "$IMAGE_NAME:$IMAGE_TAG" \ + "$(cicd::image_builder::get_full_image_name)" \ /bin/bash -c 'sleep infinity' || echo "0") if [[ "$TEST_CONTAINER_ID" == "0" ]]; then @@ -159,18 +169,18 @@ ARTIFACTS_DIR="$WORKSPACE/artifacts" mkdir -p "$ARTIFACTS_DIR" create_env_file || exit 1 -docker cp "$TESTS_ENV_FILE" "$TEST_CONTAINER_ID:/opt/app-root/tests/env.yaml" +cicd::container::cmd cp "$TESTS_ENV_FILE" "$TEST_CONTAINER_ID:/opt/app-root/tests/env.yaml" # tests echo '====================================' echo '=== Running Tests ====' echo '====================================' set +e -docker exec "$TEST_CONTAINER_ID" /bin/bash -c "pytest --junitxml=test-report.xml tests" +cicd::container::cmd exec "$TEST_CONTAINER_ID" /bin/bash -c "pytest --junitxml=test-report.xml tests" TEST_RESULT=$? set -e # Copy test reports -docker cp "$TEST_CONTAINER_ID:/opt/app-root/test-report.xml" "$WORKSPACE/artifacts/junit-test-report.xml" +cicd::container::cmd cp "$TEST_CONTAINER_ID:/opt/app-root/test-report.xml" "$WORKSPACE/artifacts/junit-test-report.xml" if [[ $TEST_RESULT -ne 0 ]]; then echo '====================================='