Skip to content

Create table to store merge request compliance violations

What does this MR do and why?

In groupcompliance we are stepping up our ability to track compliance violations in merge requests and provide a record of these to users.

The first step in this direction is to create a new domain model to hold the violations that occur (this MR), followed by saving the violations (the next MR to be created) and providing these via GraphQL to be rendered (future MR).

This MR specifically creates a new merge_requests_compliance_violations table, along with its associated indexes and foreign keys. Then adds this table via the ComplianceViolation modal to the MergeRequest model. Each violation is stored as its own class to encapsulate its logic. These classes are called by the ComplianceViolation class on the processing of a MergeRequest.

The next MR will take the ComplianceViolation model and asynchronously process any violations upon merging of an MR.

How to set up and validate locally

  1. Test the migration using bundle exec rails db:migrate and bundle exec rails db:rollback STEP=3
  2. Add the migration and test that merge requests are created, updated, merged, closed and deleted without errors

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Database review

Output of `db:check-migrations` job
$ git merge-base master HEAD
7063e00793ff4691736e8f20a33daad6e67e1299

$ git diff --name-only --diff-filter=A 7063e00793ff4691736e8f20a33daad6e67e1299 -- db/migrate db/post_migrate
db/migrate/20211111112425_create_merge_requests_compliance_violations.rb
db/migrate/20211111112639_add_fk_compliance_violations_merge_request.rb
db/migrate/20211111112713_add_fk_compliance_violations_violating_user.rb

$ bin/rails db:migrate:down VERSION=20211111112713
== 20211111112713 AddFkComplianceViolationsViolatingUser: reverting ===========
-- transaction_open?()
   -> 0.0001s
-- remove_foreign_key(:merge_requests_compliance_violations, {:column=>:violating_user_id})
   -> 0.0727s
== 20211111112713 AddFkComplianceViolationsViolatingUser: reverted (0.1636s) ==

$ bin/rails db:migrate:down VERSION=20211111112639
== 20211111112639 AddFkComplianceViolationsMergeRequest: reverting ============
-- transaction_open?()
   -> 0.0000s
-- remove_foreign_key(:merge_requests_compliance_violations, {:column=>:merge_request_id})
   -> 0.0086s
== 20211111112639 AddFkComplianceViolationsMergeRequest: reverted (0.0246s) ===

$ bin/rails db:migrate:down VERSION=20211111112425
== 20211111112425 CreateMergeRequestsComplianceViolations: reverting ==========
-- drop_table(:merge_requests_compliance_violations, {})
   -> 0.0087s
== 20211111112425 CreateMergeRequestsComplianceViolations: reverted (0.0127s) =

$ git diff 7063e00793ff4691736e8f20a33daad6e67e1299 -- db/structure.sql

$ bin/rails db:migrate
== 20211111112425 CreateMergeRequestsComplianceViolations: migrating ==========
-- create_table(:merge_requests_compliance_violations, {})
   -> 0.0342s
== 20211111112425 CreateMergeRequestsComplianceViolations: migrated (0.0344s) =

== 20211111112639 AddFkComplianceViolationsMergeRequest: migrating ============
-- transaction_open?()
   -> 0.0000s
-- foreign_keys(:merge_requests_compliance_violations)
   -> 0.0062s
-- transaction_open?()
   -> 0.0000s
-- execute("ALTER TABLE merge_requests_compliance_violations\nADD CONSTRAINT fk_290ec1ab02\nFOREIGN KEY (merge_request_id)\nREFERENCES merge_requests (id)\nON DELETE CASCADE\nNOT VALID;\n")
   -> 0.0101s
-- execute("SET statement_timeout TO 0")
   -> 0.0011s
-- execute("ALTER TABLE merge_requests_compliance_violations VALIDATE CONSTRAINT fk_290ec1ab02;")
   -> 0.0280s
-- execute("RESET statement_timeout")
   -> 0.0014s
== 20211111112639 AddFkComplianceViolationsMergeRequest: migrated (0.0623s) ===

== 20211111112713 AddFkComplianceViolationsViolatingUser: migrating ===========
-- transaction_open?()
   -> 0.0000s
-- foreign_keys(:merge_requests_compliance_violations)
   -> 0.0061s
-- transaction_open?()
   -> 0.0000s
-- execute("ALTER TABLE merge_requests_compliance_violations\nADD CONSTRAINT fk_ec881c1c6f\nFOREIGN KEY (violating_user_id)\nREFERENCES users (id)\nON DELETE CASCADE\nNOT VALID;\n")
   -> 0.0063s
-- execute("ALTER TABLE merge_requests_compliance_violations VALIDATE CONSTRAINT fk_ec881c1c6f;")
   -> 0.0233s
== 20211111112713 AddFkComplianceViolationsViolatingUser: migrated (0.0459s) ==

$ git diff -- db/structure.sql
$ git add -A -n db/schema_migrations

Related to #347323 (closed)

Edited by Robert Hunt

Merge request reports