Skip to content

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

  1. 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"}
  2. 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"}
  3. 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"}
  4. 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" - 
  5. 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"}
  6. 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  
  7. 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"}
  8. 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?
Edited by Mawreen Dela Cruz

Merge request reports

Loading