Geo: Send auth headers to GitLab Shell
What does this MR do and why?
Describe in detail what your merge request does and why.
This MR adds fields that GitLab Shell needs in gitlab-shell!716 (merged) in order to proxy Git over SSH requests in a different manner.
No change in behavior by itself, or even with the GitLab Shell MR merged, since the GitLab Shell change will be toggled with the feature flag added here.
Either MR can be merged first.
Resolves #390101 (closed)
Rollout issue #391407 (closed)
Greater context: Altogether, it should resolve timeouts during large SSH pushes to a secondary site. We also expect memory usage on secondary sites to decrease significantly for Git push over SSH requests.
Architecture change
Before
sequenceDiagram
participant C as Git on client
participant S as GitLab Shell
participant I as Workhorse & Rails
participant P as Workhorse & Rails
Note left of C: git fetch
Note over S,I: Secondary site
Note over P: Primary site
C->>+S: ssh git receive-pack request
S->>I: SSH key validation (api/v4/internal/authorized_keys?key=..)
I-->>S: HTTP/1.1 300 (custom action status) with {endpoint, msg, primary_repo}
S->>I: POST /api/v4/geo/proxy_git_ssh/info_refs_receive_pack
I->>P: POST $PRIMARY/foo/bar.git/info/refs/?service=git-receive-pack
P-->>I: HTTP/1.1 200 OK
I-->>S: <response>
S-->>C: return Git response from primary
C-->>S: stream Git data to push
S->>I: POST /api/v4/geo/proxy_git_ssh/receive_pack
I->>P: POST $PRIMARY/foo/bar.git/git-receive-pack
P-->>I: HTTP/1.1 200 OK
I-->>S: <response>
S-->>-C: gitlab-shell receive-pack response
After
When a user performs a Git over SSH request to secondary node, Gitlab Shell performs Git over HTTP requests to primary Workhorse & Rails.
sequenceDiagram
participant C as Git on client
participant S as GitLab Shell
participant I as Workhorse & Rails
participant P as Workhorse & Rails
Note left of C: git fetch
Note over S,I: Secondary site
Note over P: Primary site
C->>+S: ssh git receive-pack request
S->>I: SSH key validation (api/v4/internal/authorized_keys?key=..)
I-->>S: HTTP/1.1 300 (custom action status) with {endpoint, msg, primary_repo, authorization headers}
S->>P: POST $PRIMARY/foo/bar.git/info/refs/?service=git-receive-pack
P-->>S: HTTP/1.1 200 OK
P-->>S: <response>
S-->>C: return Git response from primary
C-->>S: stream Git data to push
S->>P: POST $PRIMARY/foo/bar.git/git-receive-pack
P-->>S: HTTP/1.1 200 OK
P-->>S: <response>
S-->>-C: gitlab-shell receive-pack response
How to set up and validate locally
Numbered steps to set up and validate the change are strongly suggested.
Note that the desired behavior change is internal to GitLab. There is no user-facing change. So validation requires inspecting internal behavior.
- Set up Geo
- In your secondary GDK directory, checkout and run this branch, as well as the GitLab Shell change:
cd gitlab && git fetch && git checkout origin/mk/git-over-ssh-proxy-direct-to-primary && cd .. && make geo-secondary-migrate && cd gitlab-shell && git fetch && git checkout origin/id-geo-http-push && make && cd .. && gdk restart sshd
- Have a project with a repo
- Clone the project with SSH
- Ensure your git remote SSH URL is routed to the secondary site. It is by default, if you followed the "Easy installation" and didn't modify anything. Ask me if you need help with this.
- In the primary GDK site,
gdk tail gitlab-workhorse
- In the secondary GDK site,
gdk tail sshd gitlab-workhorse
- Push a commit
- Cancel both tails with Ctrl-C
- Compare the log output you collected with the below
GitLab Shell change, with feature flag disabled
Testing in combination withClick here to expand expected log output
Secondary:
2023-02-15_19:39:03.78889 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CTQ28GT57RDK938DB237","duration_ms":10,"host":"gdk2.test:3444","level":"info","method":"GET","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64350","remote_ip":"172.16.123.1","route":"^/api/v4/internal","status":404,"system":"http","time":"2023-02-15T09:39:03-10:00","ttfb_ms":10,"uri":"/api/v4/internal/authorized_keys?key=[FILTERED]","user_agent":"GitLab-Shell","written_bytes":31}
2023-02-15_19:39:03.78921 sshd : {"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","duration_ms":21,"error":null,"level":"error","method":"GET","msg":"Internal API error","status":404,"time":"2023-02-15T19:39:03Z","url":"https://gdk2.test:3444/api/v4/internal/authorized_keys?key=AAAAC3NzaC1lZDI1NTE5AAAAIBvfbhosc9J7qpkWelsT1ABynJRxQ%2F82dQjMa0jJEY38"}
2023-02-15_19:39:03.81202 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CTQNK5GRDBJTCM6YKBPS","duration_ms":14,"host":"gdk2.test:3444","level":"info","method":"GET","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64352","remote_ip":"172.16.123.1","route":"^/api/v4/internal","status":200,"system":"http","time":"2023-02-15T09:39:03-10:00","ttfb_ms":14,"uri":"/api/v4/internal/authorized_keys?key=[FILTERED]","user_agent":"GitLab-Shell","written_bytes":292}
2023-02-15_19:39:03.81238 sshd : {"content_length_bytes":292,"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","duration_ms":22,"level":"info","method":"GET","msg":"Finished HTTP request","status":200,"time":"2023-02-15T19:39:03Z","url":"https://gdk2.test:3444/api/v4/internal/authorized_keys?key=AAAAC3NzaC1lZDI1NTE5AAAAIPK7FC1Z1MutEZAw08bzlhbaWYBksbWLUaO8Ga8kBIrw"}
2023-02-15_19:39:03.83433 sshd : {"channel_type":"session","correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","level":"info","msg":"connection: handle: new channel requested","remote_addr":"172.16.123.1:64348","time":"2023-02-15T19:39:03Z"}
2023-02-15_19:39:03.83460 sshd : {"command":"*receivepack.Command","correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","env":{"GitProtocolVersion":"","IsSSHConnection":true,"OriginalCommand":"git-receive-pack '/root/dedicated-dev-environment.git'","RemoteAddr":"172.16.123.1:64348"},"established_session_duration_s":0.000218167,"level":"info","msg":"session: handleShell: executing command","time":"2023-02-15T19:39:03Z"}
2023-02-15_19:39:03.87331 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CTS39NEPC6ETBEVD831H","duration_ms":29,"host":"gdk2.test:3444","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64354","remote_ip":"172.16.123.1","route":"^/api/v4/internal","status":300,"system":"http","time":"2023-02-15T09:39:03-10:00","ttfb_ms":29,"uri":"/api/v4/internal/allowed","user_agent":"GitLab-Shell","written_bytes":842}
2023-02-15_19:39:03.87375 sshd : {"content_length_bytes":842,"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","duration_ms":39,"level":"info","method":"POST","msg":"Finished HTTP request","status":300,"time":"2023-02-15T19:39:03Z","url":"https://gdk2.test:3444/api/v4/internal/allowed"}
2023-02-15_19:39:03.87397 sshd : {"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","endpoint":"/api/v4/geo/proxy_git_ssh/info_refs_receive_pack","level":"info","msg":"customaction: processApiEndpoints: Performing custom action","primary_repo":"https://gdk.test:3333/root/dedicated-dev-environment.git","time":"2023-02-15T19:39:03Z"}
2023-02-15_19:39:03.96356 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CTTG9A3MJXDWEJCX6PFS","duration_ms":74,"host":"gdk2.test:3444","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64356","remote_ip":"172.16.123.1","route":"^/api/v4/geo/proxy_git_ssh","status":200,"system":"http","time":"2023-02-15T09:39:03-10:00","ttfb_ms":74,"uri":"/api/v4/geo/proxy_git_ssh/info_refs_receive_pack","user_agent":"GitLab-Shell","written_bytes":1332}
2023-02-15_19:39:03.96384 sshd : {"content_length_bytes":1332,"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","duration_ms":89,"level":"info","method":"POST","msg":"Finished HTTP request","status":200,"time":"2023-02-15T19:39:03Z","url":"https://gdk2.test:3444/api/v4/geo/proxy_git_ssh/info_refs_receive_pack"}
2023-02-15_19:39:03.97111 sshd : {"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","endpoint":"/api/v4/geo/proxy_git_ssh/receive_pack","level":"info","msg":"customaction: processApiEndpoints: Performing custom action","primary_repo":"https://gdk.test:3333/root/dedicated-dev-environment.git","time":"2023-02-15T19:39:03Z"}
2023-02-15_19:39:04.42988 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CTXFP3QMNQD6NMZ4VX0V","duration_ms":446,"host":"gdk2.test:3444","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64359","remote_ip":"172.16.123.1","route":"^/api/v4/geo/proxy_git_ssh","status":200,"system":"http","time":"2023-02-15T09:39:04-10:00","ttfb_ms":446,"uri":"/api/v4/geo/proxy_git_ssh/receive_pack","user_agent":"GitLab-Shell","written_bytes":114}
2023-02-15_19:39:04.43031 sshd : {"content_length_bytes":114,"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","duration_ms":459,"level":"info","method":"POST","msg":"Finished HTTP request","status":200,"time":"2023-02-15T19:39:04Z","url":"https://gdk2.test:3444/api/v4/geo/proxy_git_ssh/receive_pack"}
2023-02-15_19:39:04.43042 sshd : {"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","level":"info","msg":"session: handleShell: command executed successfully","time":"2023-02-15T19:39:04Z"}
2023-02-15_19:39:04.43044 sshd : {"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","exit_status":0,"level":"info","msg":"session: exit: exiting","time":"2023-02-15T19:39:04Z"}
2023-02-15_19:39:04.43047 sshd : {"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","duration_s":0.596112416,"level":"info","msg":"connection: handleRequests: done","remote_addr":"172.16.123.1:64348","time":"2023-02-15T19:39:04Z"}
2023-02-15_19:39:04.43069 sshd : {"correlation_id":"01GSB9CTNR17QZB87RRZ7FYSD8","level":"info","msg":"server: handleConn: done","reason":"ssh: disconnect, reason 11: disconnected by user","time":"2023-02-15T19:39:04Z"}
Notice above, requests to https://gdk2.test:3444/api/v4/geo/proxy_git_ssh/*
(gdk2.test:3444
is my secondary external URL). This shows that GitLab Shell is making requests to local Rails, and Rails is proxying to the primary site.
Primary:
2023-02-15_19:39:03.96148 gitlab-workhorse : {"content_type":"application/x-git-receive-pack-advertisement","correlation_id":"01GSB9CTV7DZB6ZHR0QG1TCSN7","duration_ms":50,"host":"gdk.test:3333","level":"info","method":"GET","msg":"access"
,"proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64357","remote_ip":"172.16.123.1","route":"^/.+\\.git/info/refs\\z","status":200,"system":"http","time":"2023-02-15T09:39:03-10:00","ttfb_ms":44,"uri":"/root/dedicated-dev-environme
nt.git/info/refs?service=git-receive-pack","user_agent":"Ruby","written_bytes":411}
2023-02-15_19:39:04.24741 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CV38Z9BR6P6RDJKDV2HJ","duration_ms":78,"host":"gdk.test:3443","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referr
er":"","remote_addr":"172.16.123.1:64362","remote_ip":"172.16.123.1","route":"^/api/","status":200,"system":"http","time":"2023-02-15T09:39:04-10:00","ttfb_ms":78,"uri":"/api/v4/internal/allowed","user_agent":"gitaly/15.9.0-rc3-21-g4a6f31c91",
"written_bytes":682}
2023-02-15_19:39:04.28763 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CV6K9SGJRT00G9ZK7T2C","duration_ms":11,"host":"gdk.test:3443","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referr
er":"","remote_addr":"172.16.123.1:64364","remote_ip":"172.16.123.1","route":"^/api/","status":200,"system":"http","time":"2023-02-15T09:39:04-10:00","ttfb_ms":11,"uri":"/api/v4/internal/pre_receive","user_agent":"gitaly/15.9.0-rc3-21-g4a6f31c
91","written_bytes":36}
2023-02-15_19:39:04.41047 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9CV9F3RD9MHWCQ7XG45QV","duration_ms":42,"host":"gdk.test:3443","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referr
er":"","remote_addr":"172.16.123.1:64366","remote_ip":"172.16.123.1","route":"^/api/","status":200,"system":"http","time":"2023-02-15T09:39:04-10:00","ttfb_ms":42,"uri":"/api/v4/internal/post_receive","user_agent":"gitaly/15.9.0-rc3-21-g4a6f31
c91","written_bytes":50}
2023-02-15_19:39:04.42785 gitlab-workhorse : {"content_type":"application/x-git-receive-pack-result","correlation_id":"01GSB9CTY0C16AV653QS4FEPKW","duration_ms":427,"host":"gdk.test:3333","level":"info","method":"POST","msg":"access","pro
to":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64360","remote_ip":"172.16.123.1","route":"^/.+\\.git/git-receive-pack\\z","status":200,"system":"http","time":"2023-02-15T09:39:04-10:00","ttfb_ms":335,"uri":"/root/dedicated-dev-enviro
nment.git/git-receive-pack","user_agent":"Ruby","written_bytes":50}
GitLab Shell change, with feature flag enabled
Testing in combination withClick here to expand expected log output
Secondary:
2023-02-15_19:43:16.33951 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9MHB6ZC7YBPM5T8EB7VXR","duration_ms":13,"host":"gdk2.test:3444","level":"info","method":"GET","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64431","remote_ip":"172.16.123.1","route":"^/api/v4/internal","status":404,"system":"http","time":"2023-02-15T09:43:16-10:00","ttfb_ms":12,"uri":"/api/v4/internal/authorized_keys?key=[FILTERED]","user_agent":"GitLab-Shell","written_bytes":31}
2023-02-15_19:43:16.33994 sshd : {"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","duration_ms":21,"error":null,"level":"error","method":"GET","msg":"Internal API error","status":404,"time":"2023-02-15T19:43:16Z","url":"https://gdk2.test:3444/api/v4/internal/authorized_keys?key=AAAAC3NzaC1lZDI1NTE5AAAAIBvfbhosc9J7qpkWelsT1ABynJRxQ%2F82dQjMa0jJEY38"}
2023-02-15_19:43:16.36489 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9MHBWBMBNP1E8WYM5TVG8","duration_ms":16,"host":"gdk2.test:3444","level":"info","method":"GET","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64433","remote_ip":"172.16.123.1","route":"^/api/v4/internal","status":200,"system":"http","time":"2023-02-15T09:43:16-10:00","ttfb_ms":16,"uri":"/api/v4/internal/authorized_keys?key=[FILTERED]","user_agent":"GitLab-Shell","written_bytes":292}
2023-02-15_19:43:16.36528 sshd : {"content_length_bytes":292,"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","duration_ms":24,"level":"info","method":"GET","msg":"Finished HTTP request","status":200,"time":"2023-02-15T19:43:16Z","url":"https://gdk2.test:3444/api/v4/internal/authorized_keys?key=AAAAC3NzaC1lZDI1NTE5AAAAIPK7FC1Z1MutEZAw08bzlhbaWYBksbWLUaO8Ga8kBIrw"}
2023-02-15_19:43:16.38996 sshd : {"channel_type":"session","correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","level":"info","msg":"connection: handle: new channel requested","remote_addr":"172.16.123.1:64429","time":"2023-02-15T19:43:16Z"}
2023-02-15_19:43:16.39022 sshd : {"command":"*receivepack.Command","correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","env":{"GitProtocolVersion":"","IsSSHConnection":true,"OriginalCommand":"git-receive-pack '/root/dedicated-dev-environment.git'","RemoteAddr":"172.16.123.1:64429"},"established_session_duration_s":0.000225917,"level":"info","msg":"session: handleShell: executing command","time":"2023-02-15T19:43:16Z"}
2023-02-15_19:43:16.71611 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9MHDBACN05CQXMXFG2R7G","duration_ms":320,"host":"gdk2.test:3444","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64435","remote_ip":"172.16.123.1","route":"^/api/v4/internal","status":300,"system":"http","time":"2023-02-15T09:43:16-10:00","ttfb_ms":320,"uri":"/api/v4/internal/allowed","user_agent":"GitLab-Shell","written_bytes":841}
2023-02-15_19:43:16.71661 sshd : {"content_length_bytes":841,"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","duration_ms":326,"level":"info","method":"POST","msg":"Finished HTTP request","status":300,"time":"2023-02-15T19:43:16Z","url":"https://gdk2.test:3444/api/v4/internal/allowed"}
2023-02-15_19:43:16.84352 sshd : {"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","duration_ms":126,"level":"info","method":"GET","msg":"Finished HTTP request","status":200,"time":"2023-02-15T19:43:16Z","url":"https://gdk.test:3333/root/dedicated-dev-environment.git/info/refs?service=git-receive-pack"}
2023-02-15_19:43:17.28993 sshd : {"content_length_bytes":50,"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","duration_ms":446,"level":"info","method":"POST","msg":"Finished HTTP request","status":200,"time":"2023-02-15T19:43:17Z","url":"https://gdk.test:3333/root/dedicated-dev-environment.git/git-receive-pack"}
2023-02-15_19:43:17.29004 sshd : {"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","level":"info","msg":"session: handleShell: command executed successfully","time":"2023-02-15T19:43:17Z"}
2023-02-15_19:43:17.29006 sshd : {"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","exit_status":0,"level":"info","msg":"session: exit: exiting","time":"2023-02-15T19:43:17Z"}
2023-02-15_19:43:17.29009 sshd : {"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","duration_s":0.900109417,"level":"info","msg":"connection: handleRequests: done","remote_addr":"172.16.123.1:64429","time":"2023-02-15T19:43:17Z"}
2023-02-15_19:43:17.29029 sshd : {"correlation_id":"01GSB9MH9PNAZVKEGVEENNYW6J","level":"info","msg":"server: handleConn: done","reason":"ssh: disconnect, reason 11: disconnected by user","time":"2023-02-15T19:43:17Z"}
Notice above that GitLab Shell is making requests directly against the primary site https://gdk.test:3333/root/dedicated-dev-environment.git/*
(gdk.test:3333
is my primary site's internal URL).
Primary:
2023-02-15_19:43:16.84329 gitlab-workhorse : {"content_type":"application/x-git-receive-pack-advertisement","correlation_id":"01GSB9MHQXY9JPXERRHG6DSGV7","duration_ms":109,"host":"gdk.test:3333","level":"info","method":"GET","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64436","remote_ip":"172.16.123.1","route":"^/.+\\.git/info/refs\\z","status":200,"system":"http","time":"2023-02-15T09:43:16-10:00","ttfb_ms":95,"uri":"/root/dedicated-dev-environment.git/info/refs?service=git-receive-pack","user_agent":"GitLab-Shell","written_bytes":411}
2023-02-15_19:43:17.12560 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9MJ1NF8WR5NA3DJT5X1TS","duration_ms":79,"host":"gdk.test:3443","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64439","remote_ip":"172.16.123.1","route":"^/api/","status":200,"system":"http","time":"2023-02-15T09:43:17-10:00","ttfb_ms":79,"uri":"/api/v4/internal/allowed","user_agent":"gitaly/15.9.0-rc3-21-g4a6f31c91","written_bytes":682}
2023-02-15_19:43:17.15764 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9MJ4TAYYNZBGSJM11BQRA","duration_ms":10,"host":"gdk.test:3443","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64441","remote_ip":"172.16.123.1","route":"^/api/","status":200,"system":"http","time":"2023-02-15T09:43:17-10:00","ttfb_ms":10,"uri":"/api/v4/internal/pre_receive","user_agent":"gitaly/15.9.0-rc3-21-g4a6f31c91","written_bytes":36}
2023-02-15_19:43:17.26987 gitlab-workhorse : {"content_type":"application/json","correlation_id":"01GSB9MJ7KKRQQ5E72JNB0B3MV","duration_ms":34,"host":"gdk.test:3443","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64443","remote_ip":"172.16.123.1","route":"^/api/","status":200,"system":"http","time":"2023-02-15T09:43:17-10:00","ttfb_ms":34,"uri":"/api/v4/internal/post_receive","user_agent":"gitaly/15.9.0-rc3-21-g4a6f31c91","written_bytes":50}
2023-02-15_19:43:17.28972 gitlab-workhorse : {"content_type":"application/x-git-receive-pack-result","correlation_id":"01GSB9MHW1MSDPJGAYZDQBXYWT","duration_ms":424,"host":"gdk.test:3333","level":"info","method":"POST","msg":"access","proto":"HTTP/1.1","referrer":"","remote_addr":"172.16.123.1:64437","remote_ip":"172.16.123.1","route":"^/.+\\.git/git-receive-pack\\z","status":200,"system":"http","time":"2023-02-15T09:43:17-10:00","ttfb_ms":341,"uri":"/root/dedicated-dev-environment.git/git-receive-pack","user_agent":"GitLab-Shell","written_bytes":50}
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.