db:check-migrations 작업
이 작업은 Merge Request 파이프라인의 테스트 단계에서 실행됩니다. 다음을 확인합니다:
- 당신의 새로운 마이그레이션을 롤백한 후, 저자의 작업 브랜치와 대상 브랜치 간의 스키마 덤프 비교합니다. 이 체크는 이 새로운 마이그레이션을 실행하기 전의 스키마로 올바르게 재설정되는지 확인합니다.
- 저자가 커밋한 ‘db/structure.sql’ 파일과 저자의 작업 브랜치 간의 스키마 덤프 비교합니다. 이 체크는 마이그레이션에 예상대로 모든 변경 사항이 포함되어 있는지 확인합니다.
- 저자가 커밋한 ‘db/schema_migrations’와 마이그레이션을 실행한 후 스크립트에서 생성된 ‘db/schema_migrations’ 간의 Git 차이를 확인합니다. 이 체크는 모든 것이 올바르게 커밋되었는지 확인합니다.
문제 해결
잘못된 양성 결과
이 작업은 가끔 잘못된 양성 결과를 내뱉을 수 있기 때문에 실패해도 괜찮습니다.
예를 들어, 열을 삭제하고 롤백하면 이 열은 항상 열 디렉터리의 끝에 다시 추가됩니다. 열이 이전에 디렉터리의 중간에 있었다면 롤백은 스키마를 정확히 이전 상태로 되돌릴 수 없습니다. 작업은 실패하지만 수용 가능한 상황입니다.
실제 예제로 여기에서 저자가 position
열을 삭제한 경우를 참고하세요.
롤백 후 스키마 덤프 비교 실패
이 실패는 자신의 작업 브랜치가 대상 브랜치보다 뒤처지는 경우에 자주 발생합니다. 실제 시나리오:
graph LR
Main((main<br>commit A)) ===> |제약 조건 삭제<br>fk_rails_dbebdaa8fe| MainB((main<br>commit B))
Main((main<br>commit A)) --> |checkout<br>dev| DevA((dev<br>commit A)):::dev
DevA((dev<br>commit A)) --> |컬럼 추가<br>dependency_proxy_size| DevC((dev<br>commit C)):::dev
DevC -.-> |CI 파이프라인<br>실행| JOB-FAILED((작업 실패!)):::error
classDef main fill:#f4f0ff,stroke:#7b58cf
classDef dev fill:#e9f3fc,stroke:#1f75cb
classDef error fill:#f15146,stroke:#d4121a
-
main
대상 브랜치에서dev
작업 브랜치를 체크아웃합니다. 이 시점에서 각 브랜치는 커밋 A에서 각자의HEAD
를 가지고 있습니다. - 누군가
main
브랜치에서fk_rails_dbebdaa8fe
제약 조건을 삭제하여main
에 커밋 B가 생성됩니다. -
dev
브랜치에dependency_proxy_size
컬럼을 추가합니다. -
db:check-migrations
작업은dev
브랜치의 CI/CD 파이프라인에서 실패하는데, 이는structure.sql
파일이 예상대로 롤백되지 않았기 때문입니다.
이것은 브랜치 dev
가 커밋 A와 C를 포함하고 있어서, B가 없기 때문에 발생했습니다. 그의 데이터베이스 스키마는 fk_rails_dbebdaa8fe
제약 조건의 삭제를 알지 못했습니다. 두 스키마를 비교할 때, dev
브랜치에는 이 제약 조건이 포함되어 있지만 main
브랜치에는 없었습니다.
이 예제는 실제로 발생한 일입니다. 작업 실패 로그를 확인하세요.
이러한 문제를 해결하려면 최신 변경 사항을 가져오기 위해 작업 브랜치를 대상 브랜치로 리베이스하세요.