diff --git a/Jenkinsfile b/Jenkinsfile index ed4857711..7c656205f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -37,11 +37,7 @@ pipeline { stage('Build the PR commit image') { steps { withVault([configuration: configuration, vaultSecrets: secrets]) { - sh ''' - curl -s ${CICD_URL}/bootstrap.sh > .cicd_bootstrap.sh - source ./.cicd_bootstrap.sh - source ./build_deploy.sh - ''' + sh 'bash -x build_deploy.sh' } } } diff --git a/build_deploy.sh b/build_deploy.sh index 5194c4d7d..44ac8fe76 100755 --- a/build_deploy.sh +++ b/build_deploy.sh @@ -2,23 +2,22 @@ set -exv -source 'scripts/deploy/build-deploy-common.sh' - -IMAGE_NAME="${IMAGE_NAME:-quay.io/cloudservices/compliance-backend}" +CICD_TOOLS_URL="https://raw.githubusercontent.com/RedHatInsights/cicd-tools/main/src/bootstrap.sh" +# shellcheck source=/dev/null +source <(curl -sSL "$CICD_TOOLS_URL") image_builder +export CICD_IMAGE_BUILDER_IMAGE_NAME='quay.io/cloudservices/compliance-backend' +export CICD_IMAGE_BUILDER_BUILD_ARGS=("IMAGE_TAG=$(cicd::image_builder::get_image_tag)") # Check if the current Git branch is 'origin/security-compliance'. if [[ "$GIT_BRANCH" == "origin/security-compliance" ]]; then # Generate a tag for the Docker image based on the current date and Git commit short hash. SECURITY_COMPLIANCE_TAG="sc-$(date +%Y%m%d)-$(git rev-parse --short=7 HEAD)" # Set ADDITIONAL_TAGS to the generated security compliance tag. - ADDITIONAL_TAGS="$SECURITY_COMPLIANCE_TAG" + export CICD_IMAGE_BUILDER_ADDITIONAL_TAGS=("$SECURITY_COMPLIANCE_TAG") else # If the current Git branch is not 'origin/security-compliance': - ADDITIONAL_TAGS="latest" + export CICD_IMAGE_BUILDER_ADDITIONAL_TAGS=("latest") fi -REQUIRED_REGISTRIES_LOCAL='' -BUILD_ARGS=("IMAGE_TAG") - -build_deploy_main || exit 1 +cicd::image_builder::build_and_push diff --git a/scripts/unit_test.sh b/scripts/unit_test.sh index 9498dc91a..85a827554 100755 --- a/scripts/unit_test.sh +++ b/scripts/unit_test.sh @@ -1,15 +1,19 @@ #!/bin/bash -if [[ -z "$ghprbPullId" ]]; then +CICD_BOOTSTRAP_REPO_BRANCH='main' +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 + +if ! cicd::image_builder::is_change_request_context; then echo "Not running from a context of a PR" exit 1 fi APP_ROOT=${APP_ROOT:-.} cd "$APP_ROOT" -export IMAGE="quay.io/cloudservices/compliance-backend" -IMAGE_TAG="pr-${ghprbPullId}-$(git rev-parse --short=7 HEAD)" -export IMAGE_TAG +export CICD_IMAGE_BUILDER_IMAGE_NAME="quay.io/cloudservices/compliance-backend" RANDOM_ID=$(md5sum -z <<< "$RANDOM" | cut -c -6) DB_CONTAINER_NAME="compliance-db-${RANDOM_ID}" @@ -24,28 +28,32 @@ DATABASE_USER="compliance" DATABASE_PASSWORD="changeme" DATABASE_NAME="compliance-test" +teardown() { + + for id in "$DB_CONTAINER_ID" "$TEST_CONTAINER_ID"; do + cicd::container::cmd rm -f "$id" || echo "couldn't delete container ID: $id" + done -function teardown_podman { - podman rm -f "$DB_CONTAINER_ID" || true - podman rm -f "$TEST_CONTAINER_ID" || true - podman pod rm -f "$COMPLIANCE_POD_ID" || true + cicd::container::cmd pod rm -f "$COMPLIANCE_POD_ID" || echo "couldn't delete pod ID: $COMPLIANCE_POD_ID" } -trap "teardown_podman" EXIT SIGINT SIGTERM +trap "teardown" EXIT SIGINT SIGTERM -if ! COMPLIANCE_POD_ID=$(podman pod create --name "$POD_NAME"); then +if ! COMPLIANCE_POD_ID=$(cicd::container::cmd pod create --name "$POD_NAME"); then + echo "Failed creating pod image" exit 1 fi # Make sure the build stage image is available -SERVICE_IMAGE=$(podman images --filter "label=BUILD_STAGE_OF=${IMAGE_TAG}" -q | head -1) +IMAGE_TAG=$(cicd::image_builder::get_image_tag) +SERVICE_IMAGE=$(cicd::container::cmd images --filter "label=BUILD_STAGE_OF=${IMAGE_TAG}" -q | head -1) if [[ -z "${SERVICE_IMAGE}" ]]; then echo "First stage image is not available" exit 1 fi -if ! DB_CONTAINER_ID=$(podman run -d \ +if ! DB_CONTAINER_ID=$(cicd::container::cmd run -d \ --pod "${COMPLIANCE_POD_ID}" \ --rm \ --name "${DB_CONTAINER_NAME}" \ @@ -59,7 +67,7 @@ if ! DB_CONTAINER_ID=$(podman run -d \ fi # Do tests -if ! TEST_CONTAINER_ID=$(podman run -d \ +if ! TEST_CONTAINER_ID=$(cicd::container::cmd run -d \ --pod "${COMPLIANCE_POD_ID}" \ --rm \ -e HOSTNAME="$TEST_CONTAINER_NAME" \ @@ -76,7 +84,7 @@ if ! TEST_CONTAINER_ID=$(podman run -d \ -e ghprbActualCommit="${ghprbActualCommit:?}" \ -e GIT_COMMIT="$GIT_COMMIT" \ -e BUILD_NUMBER="$BUILD_NUMBER" \ - -e ghprbPullId="$ghprbPullId" \ + -e ghprbPullId="${ghprbPullId:?}" \ -e BUILD_URL="$BUILD_URL" \ "${SERVICE_IMAGE}" \ /bin/bash -c 'sleep infinity'); then @@ -94,8 +102,8 @@ echo '====================================' echo '=== Installing Gem Dependencies ====' echo '====================================' set +e -podman cp ./. "$TEST_CONTAINER_ID":/opt/app-root/src -podman exec "$TEST_CONTAINER_ID" /bin/bash -c ' +cicd::container::cmd cp ./. "$TEST_CONTAINER_ID":/opt/app-root/src +cicd::container::cmd exec "$TEST_CONTAINER_ID" /bin/bash -c ' bundle config set --local without development && bundle config set --local with test && bundle config set --local deployment "true" && @@ -115,7 +123,7 @@ echo '====================================' echo '=== Setting Up Database ====' echo '====================================' set +e -podman exec "$TEST_CONTAINER_ID" /bin/bash -c 'ACG_CONFIG=/opt/app-root/src/test.json bundle exec rake db:test:prepare' +cicd::container::cmd exec "$TEST_CONTAINER_ID" /bin/bash -c 'ACG_CONFIG=/opt/app-root/src/test.json bundle exec rake db:test:prepare' TEST_RESULT=$? set -e if [[ $TEST_RESULT -ne 0 ]]; then @@ -130,10 +138,12 @@ echo '====================================' echo '=== Setting Up Cyndi ====' echo '====================================' set +e -podman cp "$TEST_CONTAINER_ID":/opt/app-root/src/db/cyndi_setup_test.sql "$WORKSPACE/" -podman cp "$WORKSPACE/cyndi_setup_test.sql" "$DB_CONTAINER_ID":/var/lib/pgsql/ +cicd::container::cmd cp "$TEST_CONTAINER_ID":/opt/app-root/src/db/cyndi_setup_test.sql "$WORKSPACE/" +cicd::container::cmd cp "$WORKSPACE/cyndi_setup_test.sql" "$DB_CONTAINER_ID":/var/lib/pgsql/ rm "$WORKSPACE/cyndi_setup_test.sql" -podman exec "$DB_CONTAINER_ID" /bin/bash -c 'psql -d $POSTGRESQL_DATABASE < cyndi_setup_test.sql' +# We want to expand $POSTGRESQL_DATABASE within the container's session +# shellcheck disable=SC2016 +cicd::container::cmd exec "$DB_CONTAINER_ID" /bin/bash -c 'psql -d $POSTGRESQL_DATABASE < cyndi_setup_test.sql' TEST_RESULT=$? set -e if [[ $TEST_RESULT -ne 0 ]]; then @@ -148,11 +158,11 @@ echo '====================================' echo '=== Running Unit Tests ====' echo '====================================' set +e -podman exec "$TEST_CONTAINER_ID" /bin/bash -c 'ACG_CONFIG=/opt/app-root/src/test.json bundle exec rake test:validate' +cicd::container::cmd exec "$TEST_CONTAINER_ID" /bin/bash -c 'ACG_CONFIG=/opt/app-root/src/test.json bundle exec rake test:validate' TEST_RESULT=$? set -e # Copy test reports -podman cp "$TEST_CONTAINER_ID":/opt/app-root/src/test/reports/. "$WORKSPACE"/artifacts +cicd::container::cmd cp "$TEST_CONTAINER_ID":/opt/app-root/src/test/reports/. "$WORKSPACE"/artifacts # Prefix name of reports with 'junit-' so jenkins analysis picks them up cd "$WORKSPACE/artifacts" for FILENAME in TEST-*.xml; do mv "$FILENAME" "junit-$FILENAME"; done