Skip to content

Geo: Send auth headers to GitLab Shell

Michael Kozono requested to merge mk/git-over-ssh-proxy-direct-to-primary into master

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.

  1. Set up Geo
  2. 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
  3. Have a project with a repo
  4. Clone the project with SSH
  5. 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.
  6. In the primary GDK site, gdk tail gitlab-workhorse
  7. In the secondary GDK site, gdk tail sshd gitlab-workhorse
  8. Push a commit
  9. Cancel both tails with Ctrl-C
  10. Compare the log output you collected with the below

Testing in combination with GitLab Shell change, with feature flag disabled

Click 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}

Testing in combination with GitLab Shell change, with feature flag enabled

Click 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.

Edited by Michael Kozono

Merge request reports