E2E: Refactor merge request resource to api-only fabrication

What does this MR do and why?

Describe in detail what your merge request does and why.

  • Refactor MergeRequest resource to use api only.
    • Significantly improves the initial mr fabrication speed.
    • Doesn't unnecessarily push to source branch even if the branch already exists
    • Uses proper user from api_client to perform actions as
  • Refactor Commit resource so actions method doesn't create new object and iterate through different actions everytime a method is called
  • Move some method definitions for better consistency and easier reading (like keeping fabricate definition and api paths at the top of the class)
  • Adjust existing specs for slightly modified behaviour of MR fabrication

Screenshots or screen recordings

These are strongly recommended to assist reviewers and reduce the time to merge your change.

API only: project + mr creation, ~7 seconds

D, [2021-12-22T11:39:44.395877 #5583] DEBUG -- : ==> Built a QA::Resource::Sandbox with full_path 'source-group-for-import-2f79a479' via api in 2.620381 seconds
D, [2021-12-22T11:39:46.176432 #5583] DEBUG -- : ==> Built a QA::Resource::Project with full_path 'source-group-for-import-2f79a479/the_awesome_project-5f589bc9edd1a192' via api in 1.780458 seconds
D, [2021-12-22T11:39:47.390757 #5583] DEBUG -- : ==> Built a QA::Resource::User with username 'qa-user-f96a7063d62c9b6c' via api in 1.211259 seconds
D, [2021-12-22T11:39:47.912609 #5583] DEBUG -- : Adding user qa-user-f96a7063d62c9b6c to source-group-for-import-2f79a479/the_awesome_project-5f589bc9edd1a192 QA::Resource::Project
D, [2021-12-22T11:39:49.659081 #5583] DEBUG -- : ==> Built a QA::Resource::PersonalAccessToken via api in 0.504586 seconds
D, [2021-12-22T11:39:50.602464 #5583] DEBUG -- : ==> Built a QA::Resource::Repository::Commit via api in 1.451655 seconds
D, [2021-12-22T11:39:51.589405 #5583] DEBUG -- : ==> Built a QA::Resource::MergeRequest via api in 3.039275 seconds

With git operations: project + mr creation ~14s

D, [2021-12-22T11:43:52.218341 #5758] DEBUG -- : ==> Built a QA::Resource::Sandbox with full_path 'source-group-for-import-18afa7c4' via api in 2.525962 seconds
D, [2021-12-22T11:43:53.717804 #5758] DEBUG -- : ==> Built a QA::Resource::Project with full_path 'source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119' via api in 1.499329 seconds
D, [2021-12-22T11:43:55.173818 #5758] DEBUG -- : ==> Built a QA::Resource::User with username 'qa-user-82cc3aa88a1721e9' via api in 1.451652 seconds
D, [2021-12-22T11:43:55.694353 #5758] DEBUG -- : Adding user qa-user-82cc3aa88a1721e9 to source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119 QA::Resource::Project
D, [2021-12-22T11:43:57.319523 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-z9tjv7], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git clone  https://root@gitlab-review-acunskis-m-cs6cdu.gitlab-review.app/source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119.git ./ 2>&1]
D, [2021-12-22T11:43:58.279351 #5758] DEBUG -- : Git: output=[Cloning into '.'...
warning: You appear to have cloned an empty repository.], exitstatus=[0]
D, [2021-12-22T11:43:58.280047 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-z9tjv7], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git config user.name "GitLab QA" 2>&1]
D, [2021-12-22T11:43:58.299898 #5758] DEBUG -- : Git: output=[], exitstatus=[0]
D, [2021-12-22T11:43:58.300464 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-z9tjv7], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git config user.email root@gitlab.com 2>&1]
D, [2021-12-22T11:43:58.319683 #5758] DEBUG -- : Git: output=[], exitstatus=[0]
D, [2021-12-22T11:43:58.320399 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-z9tjv7], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git checkout -b "main" 2>&1]
D, [2021-12-22T11:43:58.338875 #5758] DEBUG -- : Git: output=[Switched to a new branch 'main'], exitstatus=[0]
D, [2021-12-22T11:43:58.340190 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-z9tjv7], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git add file-d1aa48917edcc69a.txt 2>&1]
D, [2021-12-22T11:43:58.359831 #5758] DEBUG -- : Git: output=[], exitstatus=[0]
D, [2021-12-22T11:43:58.360537 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-z9tjv7], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git commit -m "This is a test commit" 2>&1]
D, [2021-12-22T11:43:58.393713 #5758] DEBUG -- : Git: output=[[main (root-commit) 3a0dc11] This is a test commit
 1 file changed, 1 insertion(+)
 create mode 100644 file-d1aa48917edcc69a.txt], exitstatus=[0]
D, [2021-12-22T11:43:58.394270 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-z9tjv7], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git push https://root@gitlab-review-acunskis-m-cs6cdu.gitlab-review.app/source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119.git main:main 2>&1]
D, [2021-12-22T11:44:00.530283 #5758] DEBUG -- : Git: output=[To https://gitlab-review-acunskis-m-cs6cdu.gitlab-review.app/source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119.git
 * [new branch]      main -> main], exitstatus=[0]
D, [2021-12-22T11:44:00.540158 #5758] DEBUG -- : QA::Resource::Project - wait_for_push with commit message "This is a test commit"
D, [2021-12-22T11:44:01.066916 #5758] DEBUG -- : ==> Built a QA::Resource::Repository::ProjectPush via browser_ui in 3.767041 seconds
D, [2021-12-22T11:44:01.072031 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-16xbeeh], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git clone  https://root@gitlab-review-acunskis-m-cs6cdu.gitlab-review.app/source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119.git ./ 2>&1]
D, [2021-12-22T11:44:02.259856 #5758] DEBUG -- : Git: output=[Cloning into '.'...], exitstatus=[0]
D, [2021-12-22T11:44:02.260307 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-16xbeeh], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git config user.name "GitLab QA" 2>&1]
D, [2021-12-22T11:44:02.277725 #5758] DEBUG -- : Git: output=[], exitstatus=[0]
D, [2021-12-22T11:44:02.278128 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-16xbeeh], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git config user.email root@gitlab.com 2>&1]
D, [2021-12-22T11:44:02.293874 #5758] DEBUG -- : Git: output=[], exitstatus=[0]
D, [2021-12-22T11:44:02.294280 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-16xbeeh], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git checkout  "main" 2>&1]
D, [2021-12-22T11:44:02.317892 #5758] DEBUG -- : Git: output=[Already on 'main'
Your branch is up to date with 'origin/main'.], exitstatus=[0]
D, [2021-12-22T11:44:02.318871 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-16xbeeh], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git add added_file-b1282564617532f8.txt 2>&1]
D, [2021-12-22T11:44:02.337275 #5758] DEBUG -- : Git: output=[], exitstatus=[0]
D, [2021-12-22T11:44:02.337666 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-16xbeeh], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git commit -m "This is a test commit" 2>&1]
D, [2021-12-22T11:44:02.368560 #5758] DEBUG -- : Git: output=[[main c807008] This is a test commit
 1 file changed, 1 insertion(+)
 create mode 100644 added_file-b1282564617532f8.txt], exitstatus=[0]
D, [2021-12-22T11:44:02.369297 #5758] DEBUG -- : Git: pwd=[/private/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/d20211222-5758-16xbeeh], command=[HOME="/var/folders/tq/qzk_k02j5ln0l2dxvchsz4840000gn/T/qa-netrc-credentials/5758" git push https://root@gitlab-review-acunskis-m-cs6cdu.gitlab-review.app/source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119.git main:qa-test-feature-8d3e56d757e904eb 2>&1]
D, [2021-12-22T11:44:04.269288 #5758] DEBUG -- : Git: output=[remote:
remote: To create a merge request for qa-test-feature-8d3e56d757e904eb, visit:
remote:   https://gitlab-review-acunskis-m-cs6cdu.gitlab-review.app/source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119/-/merge_requests/new?merge_request%5Bsource_branch%5D=qa-test-feature-8d3e56d757e904eb
remote:
To https://gitlab-review-acunskis-m-cs6cdu.gitlab-review.app/source-group-for-import-18afa7c4/the_awesome_project-e7916da7d5cbb119.git
 * [new branch]      main -> qa-test-feature-8d3e56d757e904eb], exitstatus=[0]
D, [2021-12-22T11:44:04.288149 #5758] DEBUG -- : QA::Resource::Project - wait_for_push with commit message "This is a test commit"
D, [2021-12-22T11:44:04.838603 #5758] DEBUG -- : ==> Built a QA::Resource::Repository::ProjectPush via browser_ui in 3.767467 seconds
D, [2021-12-22T11:44:05.344564 #5758] DEBUG -- : ==> Built a QA::Resource::PersonalAccessToken via api in 0.499496 seconds
D, [2021-12-22T11:44:06.309165 #5758] DEBUG -- : ==> Built a QA::Resource::MergeRequest via api in 9.606317 seconds

As a bonus, much cleaner log file 😸

How to set up and validate locally

Numbered steps to set up and validate the change are strongly suggested.

Run locally or against review-app spec qa/specs/features/api/1_manage/bulk_import_project_spec.rb:196

MR acceptance checklist

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

Edited by andrey

Merge request reports

Loading