Create MrInclusionChecker class in PackageCheck module
What does this MR do and why?
Describe in detail what your merge request does and why.
This is part of the implementation for the addition of MR inclusion validator on auto-deploy packages. This is refactored from the initial MR I submitted !4564 (closed) since that one is big, to allow easier review.
This MR focuses on adding the class for validating a single MR URL in a given product_version object with the package version. This also applies suggestions I got from that bigger MR.
Related issue: gitlab-com/gl-infra/delivery#21583
Testing
-
When the MRs provided are included in the given package version
- Output
[2] pry(main)> package_version="18.5.202510150007" => "18.5.202510150007" [3] pry(main)> mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208579" => "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208579" [4] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x0000000123c62108 @version="18.5.202510150007"> [5] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x000000012507f618 @mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208579", @product_version=#<ReleaseTools::ProductVersion:0x0000000123c62108 @version="18.5.202510150007">> [6] pry(main)> m.execute 2025-11-07 09:00:39.200859 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab/merge_requests/208579" - 2025-11-07 09:00:39.202824 I ReleaseTools::ProductVersion -- Fetching release metadata -- {version: "18.5.202510150007"} 2025-11-07 09:00:41.175486 D ReleaseTools::GitlabOpsClient -- 200 "GET https://ops.gitlab.net/api/v4/projects/gitlab-org%2Frelease%2Fmetadata/repository/files/releases%2F18%2F18.5.202510150007.json" - => {included: true, method: "direct", merge_commit_sha: "11e9ada76b242a9a50fb0e55d40a1377c83bb145"} 2025-11-07 09:00:42.633449 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/repository/merge_base" - 2025-11-07 09:00:42.633781 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Merge commit inclusion found -- {mr_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208579", merge_commit: "11e9ada76b242a9a50fb0e55d40a1377c83bb145"} -
When the MR provided is not included in the given package version
- Output
[7] pry(main)> package_version="18.5.202510150007" => "18.5.202510150007" [8] pry(main)> mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208827" => "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208827" [9] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x0000000122de4b58 @version="18.5.202510150007"> [10] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x00000001248472c0 @mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208827", @product_version=#<ReleaseTools::ProductVersion:0x0000000122de4b58 @version="18.5.202510150007">> [11] pry(main)> m.execute 2025-11-07 09:01:53.722437 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab/merge_requests/208827" - 2025-11-07 09:01:53.723779 I ReleaseTools::ProductVersion -- Fetching release metadata -- {version: "18.5.202510150007"} 2025-11-07 09:01:55.084778 D ReleaseTools::GitlabOpsClient -- 200 "GET https://ops.gitlab.net/api/v4/projects/gitlab-org%2Frelease%2Fmetadata/repository/files/releases%2F18%2F18.5.202510150007.json" - 2025-11-07 09:01:56.535649 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/repository/merge_base" - 2025-11-07 09:01:58.252900 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/repository/commits/a32f8acc94b6b3a4742174fe87cde51da8dc0cf1/refs" - 2025-11-07 09:01:58.253266 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Searching for cherry-picks -- {branch: "18-6-auto-deploy-2025103001"} => {included: false, method: nil, merge_commit_sha: "a7bc1fecec6dd9a54ff4df485e456d9df48c1d8a"} 2025-11-07 09:02:04.619618 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/search" 2 2025-11-07 09:02:04.619828 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- MR not found in package -- {mr_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208827", merge_commit: "a7bc1fecec6dd9a54ff4df485e456d9df48c1d8a"} -
MR is cherry-picked to the given package version
- Output
[22] pry(main)> package_version="18.6.202511040406" => "18.6.202511040406" [23] pry(main)> mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/211332" => "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/211332" [24] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x00000001250760b8 @version="18.6.202511040406"> [25] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x0000000124657690 @mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/211332", @product_version=#<ReleaseTools::ProductVersion:0x00000001250760b8 @version="18.6.202511040406">> [26] pry(main)> m.execute 2025-11-07 09:53:00.532310 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab/merge_requests/211332" - 2025-11-07 09:53:00.532587 I ReleaseTools::ProductVersion -- Fetching release metadata -- {version: "18.6.202511040406"} 2025-11-07 09:53:02.286428 D ReleaseTools::GitlabOpsClient -- 200 "GET https://ops.gitlab.net/api/v4/projects/gitlab-org%2Frelease%2Fmetadata/repository/files/releases%2F18%2F18.6.202511040406.json" - 2025-11-07 09:53:03.668772 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/repository/merge_base" - 2025-11-07 09:53:05.180035 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/repository/commits/dde9bb2f99e800d86385ef9f773049baa77092de/refs" - 2025-11-07 09:53:05.180458 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Searching for cherry-picks -- {branch: "18-6-auto-deploy-2025110404"} 2025-11-07 09:53:11.736841 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/search" - => {included: true, method: "cherry-picked", merge_commit_sha: "bbf3b2733abeaad128f5a48b66149d0636884cd0"} 2025-11-07 09:53:13.164582 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/repository/merge_base" - 2025-11-07 09:53:13.164943 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Found cherry-picked commits -- {shas: ["dde9bb2f99e800d86385ef9f773049baa77092de"]} 2025-11-07 09:53:13.164976 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Cherry-picked inclusion found -- {mr_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/211332", merge_commit: "bbf3b2733abeaad128f5a48b66149d0636884cd0"} -
MR is unmerged
- Output
[27] pry(main)> package_version="18.6.202510290351" => "18.6.202510290351" [28] pry(main)> mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/211850" => "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/211850" [29] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x0000000123d05420 @version="18.6.202510290351"> [30] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x0000000124dc62c8 @mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/211850", @product_version=#<ReleaseTools::ProductVersion:0x0000000123d05420 @version="18.6.202510290351">> [31] pry(main)> m.execute => {included: false, method: nil, error: "MR has not been merged yet or merge commit does not exist"} 2025-11-07 09:54:32.596372 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab/merge_requests/211850" - -
MR in an unsupported project
- Output
[37] pry(main)> package_version="18.5.202510150007" => "18.5.202510150007" [38] pry(main)> mr_url="https://gitlab.com/gitlab-org/gitlb/-/merge_requests/208579" => "https://gitlab.com/gitlab-org/gitlb/-/merge_requests/208579" [39] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x00000001222ef7e8 @version="18.5.202510150007"> [40] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x0000000124821db8 @mr_url="https://gitlab.com/gitlab-org/gitlb/-/merge_requests/208579", @product_version=#<ReleaseTools::ProductVersion:0x00000001222ef7e8 @version="18.5.202510150007">> [41] pry(main)> m.execute => {included: false, method: nil, error: "Unknown project: gitlab-org/gitlb"} 2025-11-07 10:00:03.176881 W ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Project path is not part of the Managed Versioning projects -- {project_path: "gitlab-org/gitlb"} -
Package version given is invalid
- Output
42] pry(main)> package_version="18.5.202510150009" => "18.5.202510150009" [43] pry(main)> mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/209774" => "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/209774" [44] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x0000000124d69320 @version="18.5.202510150009"> [45] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x0000000123865780 @mr_url="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/209774", @product_version=#<ReleaseTools::ProductVersion:0x0000000124d69320 @version="18.5.202510150009">> [46] pry(main)> m.execute 2025-11-07 10:00:40.221446 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab/merge_requests/209774" - 2025-11-07 10:00:40.222370 I ReleaseTools::ProductVersion -- Fetching release metadata -- {version: "18.5.202510150009"} => {included: false, method: nil, error: "No project gitlab-org/gitlab SHA found in package version 18.5.202510150009"} 2025-11-07 10:00:41.896949 D ReleaseTools::GitlabOpsClient -- 404 "GET https://ops.gitlab.net/api/v4/projects/gitlab-org%2Frelease%2Fmetadata/repository/files/releases%2F18%2F18.5.202510150009.json" 32 -
MR from other managed projects
- Output
[47] pry(main)> package_version="18.5.202510141906" => "18.5.202510141906" [48] pry(main)> mr_url="https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/2663" => "https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/2663" [49] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x0000000124da8408 @version="18.5.202510141906"> [50] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x0000000124863f38 @mr_url="https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/2663", @product_version=#<ReleaseTools::ProductVersion:0x0000000124da8408 @version="18.5.202510141906">> [51] pry(main)> m.execute 2025-11-07 10:02:40.903035 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fbuild%2FCNG/merge_requests/2663" - 2025-11-07 10:02:40.904399 I ReleaseTools::ProductVersion -- Fetching release metadata -- {version: "18.5.202510141906"} 2025-11-07 10:02:42.577677 D ReleaseTools::GitlabOpsClient -- 200 "GET https://ops.gitlab.net/api/v4/projects/gitlab-org%2Frelease%2Fmetadata/repository/files/releases%2F18%2F18.5.202510141906.json" - => {included: true, method: "direct", merge_commit_sha: "1bd5e22ee0f5734a2105ac75dc441a20b82c1269"} 2025-11-07 10:02:43.960995 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fcharts%2Fcomponents%2Fimages/repository/merge_base" - 2025-11-07 10:02:43.961265 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Merge commit inclusion found -- {mr_url: "https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/2663", merge_commit: "1bd5e22ee0f5734a2105ac75dc441a20b82c1269"} -
MR from the security mirror
- Output
[52] pry(main)> package_version="18.6.202510210951" => "18.6.202510210951" [53] pry(main)> mr_url="https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/5278" => "https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/5278" [54] pry(main)> product_version=ReleaseTools::ProductVersion.from_package_version(package_version) => #<ReleaseTools::ProductVersion:0x00000001233ea890 @version="18.6.202510210951"> [55] pry(main)> m=ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker.new(mr_url, product_version) => #<ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker:0x0000000124be2768 @mr_url="https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/5278", @product_version=#<ReleaseTools::ProductVersion:0x00000001233ea890 @version="18.6.202510210951">> [56] pry(main)> m.execute 2025-11-07 10:03:23.984424 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/merge_requests/5278" - 2025-11-07 10:03:23.985503 I ReleaseTools::ProductVersion -- Fetching release metadata -- {version: "18.6.202510210951"} 2025-11-07 10:03:25.615217 D ReleaseTools::GitlabOpsClient -- 200 "GET https://ops.gitlab.net/api/v4/projects/gitlab-org%2Frelease%2Fmetadata/repository/files/releases%2F18%2F18.6.202510210951.json" - => {included: true, method: "direct", merge_commit_sha: "eca7094b198978fa70a760e3d1ca8cd9f61c34de"} 2025-11-07 10:03:27.121536 D ReleaseTools::GitlabClient -- 200 "GET https://gitlab.com/api/v4/projects/gitlab-org%2Fsecurity%2Fgitlab/repository/merge_base" - 2025-11-07 10:03:27.121908 I ReleaseTools::AutoDeploy::PackageCheck::MrInclusionChecker -- Merge commit inclusion found -- {mr_url: "https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/5278", merge_commit: "eca7094b198978fa70a760e3d1ca8cd9f61c34de"}
Content
- Fix spec error
- Create PackageCheck::MrValidator class
Author Check-list
-
Has documentation been updated?