Use precompiled Gitaly binaries in gitlab/tmp/tests

What does this merge request do and why?

This MR speeds up RSpec setup time in GitLab monolith by using precompiled Gitaly binaries in gitlab/tests/tmp/gitaly/_build/bin.

Before this change, Gitaly would compile during RSpec setup, which added a lot of extra time. With precompiled binaries, that step is no longer needed, and the RSpec setup is much faster.

Related to #2444 (closed)

Performance improvement

Setup time Before After Improvement
RSpec setup 123.52s 4.86s 96% faster
Running spec/lib/gitlab/git/repository_spec.rb 4m 34.1s 2m 25.1s 47% faster

The "before" times were measured after removing gitlab/tests/tmp/gitaly for a fresh start.

Before: Test environment set up in 123.521742 seconds

Click to expand
$ time bundle exec rspec spec/lib/gitlab/git/repository_spec.rb
warning: parser/current is loading parser/ruby33, which recognizes 3.3.8-compliant syntax, but you are running 3.3.7.
Please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}
==> Starting Gitaly (503d70e59609c805742ef9ac6537240e0db33c40) set up...
GIT_VERSION=2.49.0.gl2
    * new build flags
    * new prefix flags
    GEN command-list.h
    * new link flags
    GEN config-list.h
    CC walker.o
    GEN hook-list.h
    CC versioncmp.o
    CC worktree.o
    CC ws.o
    CC wrapper.o
    CC write-or-die.o
    CC wildmatch.o
    CC wt-status.o
    CC xdiff-interface.o
    CC unix-socket.o
    CC unix-stream-server.o
    CC compat/simple-ipc/ipc-shared.o
    CC sha1dc_git.o
    CC compat/simple-ipc/ipc-unix-socket.o
    CC sha1dc/ubc_check.o
    CC compat/precompose_utf8.o
    CC sha256/block/sha256.o
    CC sha1dc/sha1.o
    CC compat/fopen.o
    CC compat/open.o
    CC compat/memmem.o
    CC compat/qsort_s.o
    CC compat/regcomp_enhanced.o
    CC compat/stub/procinfo.o
    CC compat/fsmonitor/fsm-listen-darwin.o
    CC compat/fsmonitor/fsm-health-darwin.o
    CC compat/fsmonitor/fsm-ipc-darwin.o
    CC compat/fsmonitor/fsm-settings-darwin.o
    CC compat/fsmonitor/fsm-path-utils-darwin.o
    CC xdiff/xdiffi.o
    CC xdiff/xemit.o
    CC xdiff/xhistogram.o
    CC xdiff/xmerge.o
    CC xdiff/xpatience.o
    CC xdiff/xprepare.o
    CC xdiff/xutils.o
    CC reftable/basics.o
    CC reftable/error.o
    CC reftable/block.o
    CC reftable/blocksource.o
    CC reftable/iter.o
    CC reftable/merged.o
    CC reftable/pq.o
    CC reftable/reader.o
    CC reftable/record.o
    CC reftable/stack.o
    CC reftable/system.o
    CC reftable/tree.o
    CC reftable/writer.o
    CC remote-curl.o
    CC http.o
    CC http-walker.o
    CC http-backend.o
    CC git.o
    CC builtin/add.o
    CC builtin/am.o
    CC builtin/annotate.o
    CC builtin/apply.o
    CC builtin/archive.o
    CC builtin/backfill.o
    CC builtin/bisect.o
    CC builtin/blame.o
    CC builtin/branch.o
    CC builtin/bugreport.o
    CC builtin/bundle.o
    CC builtin/cat-file.o
    CC builtin/check-attr.o
    CC builtin/check-ignore.o
    CC builtin/check-mailmap.o
    CC builtin/check-ref-format.o
    CC builtin/checkout--worker.o
    CC builtin/checkout-index.o
    CC builtin/checkout.o
    CC builtin/clean.o
    CC builtin/clone.o
    CC builtin/column.o
    CC builtin/commit-graph.o
    CC builtin/commit-tree.o
    CC builtin/commit.o
    CC builtin/config.o
    CC builtin/count-objects.o
    CC builtin/credential-cache--daemon.o
    CC builtin/credential-cache.o
    CC builtin/credential-store.o
    CC builtin/credential.o
    CC builtin/describe.o
    CC builtin/diagnose.o
    CC builtin/diff-files.o
    CC builtin/diff-index.o
    CC builtin/diff-pairs.o
    CC builtin/diff-tree.o
    CC builtin/diff.o
    CC builtin/fast-export.o
    CC builtin/difftool.o
    CC builtin/fast-import.o
    CC builtin/fetch-pack.o
    CC builtin/fetch.o
    CC builtin/fmt-merge-msg.o
    CC builtin/for-each-ref.o
    CC builtin/for-each-repo.o
    CC builtin/fsck.o
    CC builtin/fsmonitor--daemon.o
    CC builtin/gc.o
    CC builtin/get-tar-commit-id.o
    CC builtin/grep.o
    CC builtin/hash-object.o
    CC builtin/help.o
    CC builtin/hook.o
    CC builtin/index-pack.o
    CC builtin/init-db.o
    CC builtin/interpret-trailers.o
    CC builtin/log.o
    CC builtin/ls-files.o
    CC builtin/ls-remote.o
    CC builtin/ls-tree.o
    CC builtin/mailinfo.o
    CC builtin/mailsplit.o
    CC builtin/merge-base.o
    CC builtin/merge-file.o
    CC builtin/merge-index.o
    CC builtin/merge-ours.o
    CC builtin/merge-recursive.o
    CC builtin/merge-tree.o
    CC builtin/merge.o
    CC builtin/mktag.o
    CC builtin/mktree.o
    CC builtin/multi-pack-index.o
    CC builtin/mv.o
    CC builtin/name-rev.o
    CC builtin/notes.o
    CC builtin/pack-objects.o
    CC builtin/pack-redundant.o
    CC builtin/pack-refs.o
    CC builtin/patch-id.o
    CC builtin/prune-packed.o
    CC builtin/prune.o
    CC builtin/push.o
    CC builtin/pull.o
    CC builtin/range-diff.o
    CC builtin/read-tree.o
    CC builtin/rebase.o
    CC builtin/receive-pack.o
    CC builtin/refs.o
    CC builtin/reflog.o
    CC builtin/remote-ext.o
    CC builtin/remote-fd.o
    CC builtin/remote.o
    CC builtin/repack.o
    CC builtin/replace.o
    CC builtin/replay.o
    CC builtin/rerere.o
    CC builtin/reset.o
    CC builtin/rev-list.o
    CC builtin/rev-parse.o
    CC builtin/revert.o
    CC builtin/rm.o
    CC builtin/send-pack.o
    CC builtin/shortlog.o
    CC builtin/show-branch.o
    CC builtin/show-index.o
    CC builtin/show-ref.o
    CC builtin/sparse-checkout.o
    CC builtin/stash.o
    CC builtin/stripspace.o
    CC builtin/submodule--helper.o
    CC builtin/symbolic-ref.o
    CC builtin/tag.o
    CC builtin/unpack-file.o
    CC builtin/unpack-objects.o
    CC builtin/update-index.o
    CC builtin/update-ref.o
    CC builtin/update-server-info.o
    CC builtin/upload-archive.o
    CC builtin/upload-pack.o
    CC builtin/var.o
    CC builtin/verify-commit.o
    CC builtin/verify-pack.o
    CC builtin/verify-tag.o
    CC builtin/worktree.o
    CC builtin/write-tree.o
    CC common-main.o
    CC abspath.o
    CC add-interactive.o
    CC add-patch.o
    CC advice.o
    CC alias.o
    CC alloc.o
    CC apply.o
    CC archive-tar.o
    CC archive-zip.o
    CC archive.o
    CC attr.o
    CC base85.o
    CC bisect.o
    CC blame.o
    CC blob.o
    CC bloom.o
    CC branch.o
    CC bulk-checkin.o
    CC bundle-uri.o
    CC bundle.o
    CC cache-tree.o
    CC cbtree.o
    CC checkout.o
    CC chdir-notify.o
    CC chunk-format.o
    CC color.o
    CC column.o
    CC combine-diff.o
    CC commit-graph.o
    CC commit-reach.o
    CC commit.o
    CC common-exit.o
    CC common-init.o
    CC compat/nonblock.o
    CC compat/obstack.o
    CC compat/terminal.o
    CC config.o
    CC connect.o
    CC connected.o
    CC convert.o
    CC copy.o
    CC credential.o
    CC csum-file.o
    CC ctype.o
    CC date.o
    CC decorate.o
    CC delta-islands.o
    CC diagnose.o
    CC diff-delta.o
    CC diff-lib.o
    CC diff-merges.o
    CC diff-no-index.o
    CC diff.o
    CC diffcore-break.o
    CC diffcore-delta.o
    CC diffcore-order.o
    CC diffcore-pickaxe.o
    CC diffcore-rename.o
    CC diffcore-rotate.o
    CC dir-iterator.o
    CC editor.o
    CC dir.o
    CC entry.o
    CC environment.o
    CC ewah/bitmap.o
    CC ewah/ewah_bitmap.o
    CC ewah/ewah_io.o
    CC ewah/ewah_rlw.o
    CC exec-cmd.o
    CC fetch-negotiator.o
    CC fetch-pack.o
    CC fmt-merge-msg.o
    CC fsck.o
    CC fsmonitor.o
    CC fsmonitor-ipc.o
    CC fsmonitor-settings.o
    CC gettext.o
    CC git-zlib.o
    CC gpg-interface.o
    CC graph.o
    CC grep.o
    CC hashmap.o
    CC hash-lookup.o
    CC help.o
    CC hex.o
    CC hex-ll.o
    CC hook.o
    CC ident.o
    CC json-writer.o
    CC kwset.o
    CC levenshtein.o
    CC line-log.o
    CC line-range.o
    CC linear-assignment.o
    CC list-objects-filter-options.o
    CC list-objects-filter.o
    CC list-objects.o
    CC lockfile.o
    CC log-tree.o
    CC loose.o
    CC ls-refs.o
    CC mailinfo.o
    CC mailmap.o
    CC match-trees.o
    CC mem-pool.o
    CC merge-blobs.o
    CC merge-ll.o
    CC merge-ort.o
    CC merge-ort-wrappers.o
    CC merge-recursive.o
    CC merge.o
    CC midx.o
    CC midx-write.o
    CC name-hash.o
    CC negotiator/default.o
    CC negotiator/noop.o
    CC negotiator/skipping.o
    CC notes-cache.o
    CC notes-merge.o
    CC notes-utils.o
    CC notes.o
    CC object-file-convert.o
    CC object-file.o
    CC object-name.o
    CC object.o
    CC oid-array.o
    CC oidmap.o
    CC oidset.o
    CC oidtree.o
    CC pack-bitmap-write.o
    CC pack-bitmap.o
    CC pack-check.o
    CC pack-mtimes.o
    CC pack-objects.o
    CC pack-revindex.o
    CC pack-write.o
    CC packfile.o
    CC pager.o
    CC parallel-checkout.o
    CC parse.o
    CC parse-options-cb.o
    CC parse-options.o
    CC patch-delta.o
    CC patch-ids.o
    CC path.o
    CC path-walk.o
    CC pathspec.o
    CC pkt-line.o
    CC preload-index.o
    CC pretty.o
    CC prio-queue.o
    CC progress.o
    CC promisor-remote.o
    CC prompt.o
    CC protocol.o
    CC protocol-caps.o
    CC prune-packed.o
    CC pseudo-merge.o
    CC quote.o
    CC range-diff.o
    CC reachable.o
    CC read-cache.o
    CC rebase-interactive.o
    CC rebase.o
    CC ref-filter.o
    CC reflog-walk.o
    CC reflog.o
    CC refs.o
    CC refs/debug.o
    CC refs/files-backend.o
    CC refs/reftable-backend.o
    CC refs/iterator.o
    CC refs/packed-backend.o
    CC refs/ref-cache.o
    CC refspec.o
    CC remote.o
    CC replace-object.o
    CC repo-settings.o
    CC repository.o
    CC rerere.o
    CC reset.o
    CC resolve-undo.o
    CC revision.o
    CC run-command.o
    CC send-pack.o
    CC sequencer.o
    CC serve.o
    CC server-info.o
    CC setup.o
    CC shallow.o
    CC sideband.o
    CC sigchain.o
    CC sparse-index.o
    CC split-index.o
    CC stable-qsort.o
    CC statinfo.o
    CC strbuf.o
    CC streaming.o
    CC string-list.o
    CC strmap.o
    CC strvec.o
    CC sub-process.o
    CC submodule-config.o
    CC submodule.o
    CC symlinks.o
    CC tag.o
    CC tempfile.o
    CC thread-utils.o
    CC tmp-objdir.o
    CC trace.o
    CC trace2.o
    CC trace2/tr2_cfg.o
    CC trace2/tr2_cmd_name.o
    CC trace2/tr2_ctr.o
    CC trace2/tr2_dst.o
    CC trace2/tr2_sid.o
    CC trace2/tr2_sysenv.o
    CC trace2/tr2_tbuf.o
    CC trace2/tr2_tgt_event.o
    CC trace2/tr2_tgt_normal.o
    CC trace2/tr2_tgt_perf.o
    CC trace2/tr2_tmr.o
    CC trace2/tr2_tls.o
    CC trailer.o
    CC transport-helper.o
    CC transport.o
    CC tree-diff.o
    CC tree-walk.o
    CC tree.o
    CC unpack-trees.o
    CC upload-pack.o
    CC url.o
    CC urlmatch.o
    CC usage.o
    CC userdiff.o
    CC utf8.o
    CC varint.o
    GEN version-def.h
    AR xdiff/lib.a
    AR reftable/libreftable.a
    CC version.o
    AR libgit.a
    LINK git
    LINK git-remote-http
    LINK git-http-backend
ld: warning: ignoring duplicate libraries: 'libgit.a'
ld: warning: ignoring duplicate libraries: 'libgit.a'
ld: warning: ignoring duplicate libraries: 'libgit.a'
==> Gitaly set up in 118.799161 seconds...

Test environment set up in 123.521742 seconds
DEPRECATION WARNING: Project model aliases `approvals_before_merge` and has a method called `approvals_before_merge` defined. Starting in Rails 7.2 `fallback_approvals_required` will not be calling `approvals_before_merge` anymore. You may want to additionally define `fallback_approvals_required` to preserve the current behavior. (called from initialize at /Users/naohashizume/gdk/gitlab/app/models/project.rb:1252)
DEPRECATION WARNING: Namespaces::ProjectNamespace model aliases `parent_id` and has a method called `parent_id=` defined. Starting in Rails 7.2 `namespace_id=` will not be calling `parent_id=` anymore. You may want to additionally define `namespace_id=` to preserve the current behavior. (called from block (3 levels) in <main> at /Users/naohashizume/gdk/gitlab/spec/factories/projects.rb:121)
..................................................................................................................................................................................................................................................................................................................................................

Finished in 4 minutes 34.1 seconds (files took 20.14 seconds to load)
338 examples, 0 failures

[TEST PROF INFO] Time spent in factories: 01:01.305 (22.05% of total time)
bundle exec rspec spec/lib/gitlab/git/repository_spec.rb  297.46s user 117.03s system 140% cpu 4:55.80 total

After: Test environment set up in 4.861512 seconds

Click to expand
$ time bundle exec rspec spec/lib/gitlab/git/repository_spec.rb
warning: parser/current is loading parser/ruby33, which recognizes 3.3.8-compliant syntax, but you are running 3.3.7.
Please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}

Test environment set up in 4.861512 seconds
DEPRECATION WARNING: Project model aliases `approvals_before_merge` and has a method called `approvals_before_merge` defined. Starting in Rails 7.2 `fallback_approvals_required` will not be calling `approvals_before_merge` anymore. You may want to additionally define `fallback_approvals_required` to preserve the current behavior. (called from initialize at /Users/naohashizume/gdk/gitlab/app/models/project.rb:1252)
DEPRECATION WARNING: Namespaces::ProjectNamespace model aliases `parent_id` and has a method called `parent_id=` defined. Starting in Rails 7.2 `namespace_id=` will not be calling `parent_id=` anymore. You may want to additionally define `namespace_id=` to preserve the current behavior. (called from block (3 levels) in <main> at /Users/naohashizume/gdk/gitlab/spec/factories/projects.rb:121)
..................................................................................................................................................................................................................................................................................................................................................

Finished in 2 minutes 25.1 seconds (files took 19.01 seconds to load)
338 examples, 0 failures

[TEST PROF INFO] Time spent in factories: 00:56.396 (37.82% of total time)
bundle exec rspec spec/lib/gitlab/git/repository_spec.rb  81.01s user 51.91s system 80% cpu 2:45.60 total

How to set up and validate locally

  1. Checkout the main branch: git checkout main
  2. Remove existing Gitaly binaries: rm -rf gitlab/tests/tmp/gitaly
  3. Run the test: bundle exec rspec spec/lib/gitlab/git/repository_spec.rb
  4. Switch to the MR branch: git checkout 2444-use-precompiled-gitaly-binaries-in-tmp-tests
  5. Set up Gitaly: make gitaly-setup
  6. Run the test again: bundle exec rspec spec/lib/gitlab/git/repository_spec.rb

Impacted categories

The following categories relate to this merge request:

Merge request checklist

  • This MR references an issue describing the change.
  • This change is backward compatible. If not, please include steps to communicate to our users.
  • Tests added for new functionality. If not, please raise an issue to follow-up.
  • Documentation added/updated, if needed.
  • Announcement added, if change is notable.
  • gdk doctor test added, if needed.
Edited by Nao Hashizume

Merge request reports

Loading