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 |
|
Running spec/lib/gitlab/git/repository_spec.rb
|
4m 34.1s | 2m 25.1s |
|
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
- Checkout the main branch:
git checkout main - Remove existing Gitaly binaries:
rm -rf gitlab/tests/tmp/gitaly - Run the test:
bundle exec rspec spec/lib/gitlab/git/repository_spec.rb - Switch to the MR branch:
git checkout 2444-use-precompiled-gitaly-binaries-in-tmp-tests - Set up Gitaly:
make gitaly-setup - Run the test again:
bundle exec rspec spec/lib/gitlab/git/repository_spec.rb
Impacted categories
The following categories relate to this merge request:
-
gdk-reliability - e.g. When a GDK action fails to complete. -
gdk-usability - e.g. Improvements or suggestions around how the GDK functions. -
gdk-performance - e.g. When a GDK action is slow or times out.
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 doctortest added, if needed.
Edited by Nao Hashizume