From 84ed457a629e115aaceaeee4f54559083756a32d Mon Sep 17 00:00:00 2001 From: dfrazao-gitlab Date: Wed, 12 Jul 2023 18:52:24 +0200 Subject: [PATCH] update gemfile --- db-testing.yml | 51 ++++++++++++++++++++++++++++++ docker/gitlab/Dockerfile | 1 + docker/gitlab/schema_validation.rb | 40 +++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 docker/gitlab/schema_validation.rb diff --git a/db-testing.yml b/db-testing.yml index 3d2a5157..3b13718d 100644 --- a/db-testing.yml +++ b/db-testing.yml @@ -49,6 +49,8 @@ db:migrations: image: ${DOCKER_REGISTRY}/$IMAGE_NAME tags: - worker + rules: + - if: '$CI_PIPELINE_SOURCE != "schedule"' variables: DBLAB_HOST_KEYS: $DBLAB_HOST_KEYS DBLAB_SSH_KEY: $DBLAB_SSH_KEY @@ -98,6 +100,8 @@ db:migrations: notify-upstream: stage: final + rules: + - if: '$CI_PIPELINE_SOURCE != "schedule"' tags: - builder # Also store artifacts here so we can easily generate direct links to them @@ -115,8 +119,55 @@ handle-failure: stage: cleanup-failure tags: - builder + rules: + - if: '$CI_PIPELINE_SOURCE != "schedule"' when: on_failure script: - cd notifier - bundle install - bundle exec ruby notifier.rb handle_failure + +schema-validation: + stage: test + image: ${DOCKER_REGISTRY}/$IMAGE_NAME + tags: + - worker + rules: + - if: '$CI_PIPELINE_SOURCE == "schedule"' + variables: + DBLAB_HOST_KEYS: $DBLAB_HOST_KEYS + DBLAB_SSH_KEY: $DBLAB_SSH_KEY + DBLAB_TOKEN: $DBLAB_TOKEN + DBLAB_USER: $DBLAB_USER + DBLAB_PASSWORD: $DBLAB_PASSWORD + DBLAB_API_PORT: $DBLAB_API_PORT + DBLAB_API_PORT_CI: $DBLAB_API_PORT_CI + DBLAB_ENVIRONMENT: $DBLAB_ENVIRONMENT + DBLAB_ENVIRONMENT_CI: $DBLAB_ENVIRONMENT_CI + ALL_DB_HOSTS: "postgres-main,postgres-ci" + DBLAB_CLONE_ID: "database-testing-${CI_PIPELINE_ID}-${CI_JOB_ID}" + services: + - name: ${DOCKER_REGISTRY}/gitlab-com-database-testing-dblab-ssh:latest + alias: postgres-main + variables: + DBLAB_CLONE_ID: "database-testing-${CI_PIPELINE_ID}-${CI_JOB_ID}-main" + - name: ${DOCKER_REGISTRY}/gitlab-com-database-testing-dblab-ssh:latest + alias: postgres-ci + variables: + DBLAB_CLONE_ID: "database-testing-${CI_PIPELINE_ID}-${CI_JOB_ID}-ci" + DBLAB_ENVIRONMENT: $DBLAB_ENVIRONMENT_CI + DBLAB_API_PORT: $DBLAB_API_PORT_CI + - name: ${DOCKER_REGISTRY}/redis:4.0-alpine + alias: redis + artifacts: + paths: + - schema-validation-artifacts/ + expire_in: 4 weeks + when: always + allow_failure: false + script: + - cd ${GITLAB_PATH} + - mkdir -p tmp/schema-validation-artifacts/ + - ./prepare.sh + - bundle exec ruby schema_validation.rb + - mv tmp/schema-validation-artifacts/ ${CI_PROJECT_DIR} diff --git a/docker/gitlab/Dockerfile b/docker/gitlab/Dockerfile index 90977eae..20a995b6 100644 --- a/docker/gitlab/Dockerfile +++ b/docker/gitlab/Dockerfile @@ -40,6 +40,7 @@ COPY clone_details.rb clone_details.rb COPY clone_details.yml clone_details.yml COPY prepare.sh prepare.sh COPY prepare_postgres.sql prepare_postgres.sql +COPY schema_validation.rb schema_validation.rb USER root COPY entrypoint.sh /entrypoint.sh diff --git a/docker/gitlab/schema_validation.rb b/docker/gitlab/schema_validation.rb new file mode 100644 index 00000000..062cfdb5 --- /dev/null +++ b/docker/gitlab/schema_validation.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'gitlab/schema/validation' +require 'active_record' +require 'yaml' + +class SchemaValidation + def initialize(connection, file_path) + @connection = connection + @file_path = file_path + end + + def run + Gitlab::Schema::Validation::Runner.new(structure_sql, database, validators: validators).execute + end + + private + + attr_reader :connection, :file_path + + def validators + Gitlab::Schema::Validation::Validators::Base.all_validators + end + + def structure_sql + Gitlab::Schema::Validation::Sources::StructureSql.new(file_path) + end + + def database + Gitlab::Schema::Validation::Sources::Database.new(connection) + end +end + +db_config = YAML::load_file('config/database.yml')['test']['main'] +connection = ActiveRecord::Base.establish_connection(db_config).connection + +inconsistencies = SchemaValidation.new(connection, 'db/structure.sql').run + +File.write('tmp/schema-validation-artifacts/output.txt', inconsistencies.map(&:display)) + -- GitLab