From 6f2065c468b05658125b746169c56764a8ccddb1 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 25 Mar 2020 15:07:47 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- doc/development/architecture.md | 123 ++++++++++++++++++--- doc/development/chatops_on_gitlabcom.md | 2 +- doc/development/code_review.md | 2 +- .../site_architecture/release_process.md | 13 +-- doc/development/documentation/workflow.md | 10 +- doc/development/fe_guide/frontend_faq.md | 2 +- doc/development/understanding_explain_plans.md | 4 +- 7 files changed, 125 insertions(+), 31 deletions(-) (limited to 'doc/development') diff --git a/doc/development/architecture.md b/doc/development/architecture.md index 8d5368bdd28..d12d4b2029c 100644 --- a/doc/development/architecture.md +++ b/doc/development/architecture.md @@ -125,18 +125,18 @@ Component statuses are linked to configuration documentation for each component. | Component | Description | [Omnibus GitLab](https://docs.gitlab.com/omnibus/) | [GitLab chart](https://docs.gitlab.com/charts/) | [Minikube Minimal](https://docs.gitlab.com/charts/development/minikube/#deploying-gitlab-with-minimal-settings) | [GitLab.com](https://gitlab.com) | [Source](../install/installation.md) | [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) | CE/EE | | --------- | ----------- |:--------------------:|:------------------:|:-----:|:--------:|:--------:|:-------:|:-------:| -| [NGINX](#nginx) | Routes requests to appropriate components, terminates SSL | [✅][nginx-omnibus] | [✅][nginx-charts] | [⚙][nginx-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#service-architecture) | [⤓][nginx-source] | ❌ | CE & EE | +| [NGINX](#nginx) | Routes requests to appropriate components, terminates SSL | [✅][nginx-omnibus] | [✅][nginx-charts] | [⚙][nginx-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture) | [⤓][nginx-source] | ❌ | CE & EE | | [Unicorn (GitLab Rails)](#unicorn) | Handles requests for the web interface and API | [✅][unicorn-omnibus] | [✅][unicorn-charts] | [✅][unicorn-charts] | [✅](../user/gitlab_com/index.md#unicorn) | [⚙][unicorn-source] | [✅][gitlab-yml] | CE & EE | | [Sidekiq](#sidekiq) | Background jobs processor | [✅][sidekiq-omnibus] | [✅][sidekiq-charts] | [✅](https://docs.gitlab.com/charts/charts/gitlab/sidekiq/index.html) | [✅](../user/gitlab_com/index.md#sidekiq) | [✅][gitlab-yml] | [✅][gitlab-yml] | CE & EE | -| [Gitaly](#gitaly) | Git RPC service for handling all Git calls made by GitLab | [✅][gitaly-omnibus] | [✅][gitaly-charts] | [✅][gitaly-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#service-architecture) | [⚙][gitaly-source] | ✅ | CE & EE | -| [Praefect](#praefect) | A transparent proxy between any Git client and Gitaly storage nodes. | [✅][gitaly-omnibus] | [❌][gitaly-charts] | [❌][gitaly-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#service-architecture) | [⚙][praefect-source] | ✅ | CE & EE | -| [GitLab Workhorse](#gitlab-workhorse) | Smart reverse proxy, handles large HTTP requests | [✅][workhorse-omnibus] | [✅][workhorse-charts] | [✅][workhorse-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#service-architecture) | [⚙][workhorse-source] | ✅ | CE & EE | -| [GitLab Shell](#gitlab-shell) | Handles `git` over SSH sessions | [✅][shell-omnibus] | [✅][shell-charts] | [✅][shell-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#service-architecture) | [⚙][shell-source] | [✅][gitlab-yml] | CE & EE | +| [Gitaly](#gitaly) | Git RPC service for handling all Git calls made by GitLab | [✅][gitaly-omnibus] | [✅][gitaly-charts] | [✅][gitaly-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture) | [⚙][gitaly-source] | ✅ | CE & EE | +| [Praefect](#praefect) | A transparent proxy between any Git client and Gitaly storage nodes. | [✅][gitaly-omnibus] | [❌][gitaly-charts] | [❌][gitaly-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture) | [⚙][praefect-source] | ✅ | CE & EE | +| [GitLab Workhorse](#gitlab-workhorse) | Smart reverse proxy, handles large HTTP requests | [✅][workhorse-omnibus] | [✅][workhorse-charts] | [✅][workhorse-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture) | [⚙][workhorse-source] | ✅ | CE & EE | +| [GitLab Shell](#gitlab-shell) | Handles `git` over SSH sessions | [✅][shell-omnibus] | [✅][shell-charts] | [✅][shell-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture) | [⚙][shell-source] | [✅][gitlab-yml] | CE & EE | | [GitLab Pages](#gitlab-pages) | Hosts static websites | [⚙][pages-omnibus] | [❌][pages-charts] | [❌][pages-charts] | [✅](../user/gitlab_com/index.md#gitlab-pages) | [⚙][pages-source] | [⚙][pages-gdk] | CE & EE | | [Registry](#registry) | Container registry, allows pushing and pulling of images | [⚙][registry-omnibus] | [✅][registry-charts] | [✅][registry-charts] | [✅](../user/packages/container_registry/index.md#build-and-push-images-using-gitlab-cicd) | [⤓][registry-source] | [⚙][registry-gdk] | CE & EE | -| [Redis](#redis) | Caching service | [✅][redis-omnibus] | [✅][redis-omnibus] | [✅][redis-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#service-architecture) | [⤓][redis-source] | ✅ | CE & EE | +| [Redis](#redis) | Caching service | [✅][redis-omnibus] | [✅][redis-omnibus] | [✅][redis-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture) | [⤓][redis-source] | ✅ | CE & EE | | [PostgreSQL](#postgresql) | Database | [✅][postgres-omnibus] | [✅][postgres-charts] | [✅][postgres-charts] | [✅](../user/gitlab_com/index.md#postgresql) | [⤓][postgres-source] | ✅ | CE & EE | -| [PgBouncer](#pgbouncer) | Database connection pooling, failover | [⚙][pgbouncer-omnibus] | [❌][pgbouncer-charts] | [❌][pgbouncer-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#database-architecture) | ❌ | ❌ | EE Only | +| [PgBouncer](#pgbouncer) | Database connection pooling, failover | [⚙][pgbouncer-omnibus] | [❌][pgbouncer-charts] | [❌][pgbouncer-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#database-architecture) | ❌ | ❌ | EE Only | | [Consul](#consul) | Database node discovery, failover | [⚙][consul-omnibus] | [❌][consul-charts] | [❌][consul-charts] | [✅](../user/gitlab_com/index.md#consul) | ❌ | ❌ | EE Only | | [GitLab self-monitoring: Prometheus](#prometheus) | Time-series database, metrics collection, and query service | [✅][prometheus-omnibus] | [✅][prometheus-charts] | [⚙][prometheus-charts] | [✅](../user/gitlab_com/index.md#prometheus) | ❌ | ❌ | CE & EE | | [GitLab self-monitoring: Alertmanager](#alertmanager) | Deduplicates, groups, and routes alerts from Prometheus | [⚙][alertmanager-omnibus] | [✅][alertmanager-charts] | [⚙][alertmanager-charts] | [✅](https://about.gitlab.com/handbook/engineering/monitoring/) | ❌ | ❌ | CE & EE | @@ -149,10 +149,10 @@ Component statuses are linked to configuration documentation for each component. | [GitLab Exporter](#gitlab-exporter) | Generates a variety of GitLab metrics | [✅][gitlab-exporter-omnibus] | [✅][gitlab-exporter-charts] | [✅][gitlab-exporter-charts] | [✅](https://about.gitlab.com/handbook/engineering/monitoring/) | ❌ | ❌ | CE & EE | | [Node Exporter](#node-exporter) | Prometheus endpoint with system metrics | [✅][node-exporter-omnibus] | [N/A][node-exporter-charts] | [N/A][node-exporter-charts] | [✅](https://about.gitlab.com/handbook/engineering/monitoring/) | ❌ | ❌ | CE & EE | | [Mattermost](#mattermost) | Open-source Slack alternative | [⚙][mattermost-omnibus] | [⤓][mattermost-charts] | [⤓][mattermost-charts] | [⤓](../user/project/integrations/mattermost.md) | ❌ | ❌ | CE & EE | -| [MinIO](#minio) | Object storage service | [⤓][minio-omnibus] | [✅][minio-charts] | [✅][minio-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#storage-architecture) | ❌ | [⚙][minio-gdk] | CE & EE | +| [MinIO](#minio) | Object storage service | [⤓][minio-omnibus] | [✅][minio-charts] | [✅][minio-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#storage-architecture) | ❌ | [⚙][minio-gdk] | CE & EE | | [Runner](#gitlab-runner) | Executes GitLab CI jobs | [⤓][runner-omnibus] | [✅][runner-charts] | [⚙][runner-charts] | [✅](../user/gitlab_com/index.md#shared-runners) | [⚙][runner-source] | [⚙][runner-gdk] | CE & EE | | [Database Migrations](#database-migrations) | Database migrations | [✅][database-migrations-omnibus] | [✅][database-migrations-charts] | [✅][database-migrations-charts] | ✅ | [⚙][database-migrations-source] | ✅ | CE & EE | -| [Certificate Management](#certificate-management) | TLS Settings, Let's Encrypt | [✅][certificate-management-omnibus] | [✅][certificate-management-charts] | [⚙][certificate-management-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/#secrets-management) | [⚙][certificate-management-source] | [⚙][certificate-management-gdk] | CE & EE | +| [Certificate Management](#certificate-management) | TLS Settings, Let's Encrypt | [✅][certificate-management-omnibus] | [✅][certificate-management-charts] | [⚙][certificate-management-charts] | [✅](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#secrets-management) | [⚙][certificate-management-source] | [⚙][certificate-management-gdk] | CE & EE | | [GitLab Geo Node](#gitlab-geo) | Geographically distributed GitLab nodes | [⚙][geo-omnibus] | [❌][geo-charts] | [❌][geo-charts] | ✅ | ❌ | [⚙][geo-gdk] | EE Only | | [LDAP Authentication](#ldap-authentication) | Authenticate users against centralized LDAP directory | [⤓][ldap-omnibus] | [⤓][ldap-charts] | [⤓][ldap-charts] | [❌](https://about.gitlab.com/pricing/#gitlab-com) | [⤓][gitlab-yml] | [⤓][ldap-gdk] | CE & EE | | [Outbound email (SMTP)](#outbound-email) | Send email messages to users | [⤓][outbound-email-omnibus] | [⤓][outbound-email-charts] | [⤓][outbound-email-charts] | [✅](../user/gitlab_com/index.md#mail-configuration) | [⤓][gitlab-yml] | [⤓][gitlab-yml] | CE & EE | @@ -446,7 +446,7 @@ Sidekiq is a Ruby background job processor that pulls jobs from the Redis queue - Layer: Core Service (Processor) - Process: `unicorn` -[Unicorn](https://bogomips.org/unicorn/) is a Ruby application server that is used to run the core Rails Application that provides the user facing features in GitLab. Often process output you will see this as `bundle` or `config.ru` depending on the GitLab version. +[Unicorn](https://yhbt.net/unicorn/) is a Ruby application server that is used to run the core Rails Application that provides the user facing features in GitLab. Often process output you will see this as `bundle` or `config.ru` depending on the GitLab version. #### LDAP Authentication @@ -494,13 +494,108 @@ Below we describe the different pathing that HTTP vs. SSH Git requests will take ### Web Request (80/443) -When you make a Git request over HTTP, the request first takes the same steps as a web HTTP request -through NGINX and GitLab Workhorse. However, the GitLab Workhorse then diverts the request towards -Gitaly, which processes it directly. +Git operations over HTTP use the stateless "smart" protocol described in the +[Git documentation](https://git-scm.com/docs/http-protocol), but responsibility +for handling these operations is split across several GitLab components. + +Here is a sequence diagram for `git fetch`. Note that all requests pass through +NGINX as well as any other HTTP load balancers, but are not transformed in any +way by them. All paths are presented relative to a `/namespace/project.git` URL. + +```mermaid +sequenceDiagram + participant Git on client + participant NGINX + participant Workhorse + participant Rails + participant Gitaly + participant Git on server + + Note left of Git on client: git fetch
info-refs + Git on client->>+Workhorse: GET /info/refs?service=git-upload-pack + Workhorse->>+Rails: GET /info/refs?service=git-upload-pack + Note right of Rails: Auth check + Rails-->>-Workhorse: Gitlab::Workhorse.git_http_ok + Workhorse->>+Gitaly: SmartHTTPService.InfoRefsUploadPack request + Gitaly->>+Git on server: git upload-pack --stateless-rpc --advertise-refs + Git on server-->>-Gitaly: git upload-pack response + Gitaly-->>-Workhorse: SmartHTTPService.InfoRefsUploadPack response + Workhorse-->>-Git on client: 200 OK + + Note left of Git on client: git fetch
fetch-pack + Git on client->>+Workhorse: POST /git-upload-pack + Workhorse->>+Rails: POST /git-upload-pack + Note right of Rails: Auth check + Rails-->>-Workhorse: Gitlab::Workhorse.git_http_ok + Workhorse->>+Gitaly: SmartHTTPService.PostUploadPack request + Gitaly->>+Git on server: git upload-pack --stateless-rpc + Git on server-->>-Gitaly: git upload-pack response + Gitaly-->>-Workhorse: SmartHTTPService.PostUploadPack response + Workhorse-->>-Git on client: 200 OK +``` + +The sequence is similar for `git push`, except `git-receive-pack` is used +instead of `git-upload-pack`. ### SSH Request (22) -TODO +Git operations over SSH can use the stateful protocol described in the +[Git documentation](https://git-scm.com/docs/pack-protocol#_ssh_transport), but +responsibility for handling them is split across several GitLab components. + +No GitLab components speak SSH directly - all SSH connections are made between +Git on the client machine and the SSH server, which terminates the connection. +To the SSH server, all connections are authenticated as the `git` user; GitLab +users are differentiated by the SSH key presented by the client. + +Here is a sequence diagram for `git fetch`, assuming [Fast SSH key lookup](../administration/operations/fast_ssh_key_lookup.md) +is enabled. Note that `AuthorizedKeysCommand` is an executable provided by +[GitLab Shell](#gitlab-shell): + +```mermaid +sequenceDiagram + participant Git on client + participant SSH server + participant AuthorizedKeysCommand + participant GitLab Shell + participant Rails + participant Gitaly + participant Git on server + + Note left of Git on client: git fetch + Git on client->>SSH server: git fetch-pack + SSH server-->>AuthorizedKeysCommand: gitlab-shell-authorized-keys-check git AAAA... + AuthorizedKeysCommand-->>Rails: GET /internal/api/authorized_keys?key=AAAA... + Note right of Rails: Lookup key ID + Rails-->>SSH server: 200 OK, command="gitlab-shell upload-pack key_id=1" + SSH server-->>GitLab Shell: gitlab-shell upload-pack key_id=1 + GitLab Shell-->>Rails: GET /internal/api/allowed?action=upload_pack&key_id=1 + Note right of Rails: Auth check + Rails-->>GitLab Shell: 200 OK, { gitaly: ... } + GitLab Shell-->>Gitaly: SSHService.SSHUploadPack bidirectional request + Gitaly-->>Git on server: git upload-pack + Git on server->>Git on client: SSHService.SSHUploadPack bidirectional response +``` + +The `git push` operation is very similar, except `git receive-pack` is used +instead of `git upload-pack`. + +If fast SSH key lookups are not enabled, the SSH server reads from the +`~git/.ssh/authorized_keys` file to determine what command to run for a given +SSH session. This is kept up to date by an [`AuthorizedKeysWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/app/workers/authorized_keys_worker.rb) +in Rails, scheduled to run whenever an SSH key is modified by a user. + +[SSH certificates](../administration/operations/ssh_certificates.md) may be used +instead of keys. In this case, `AuthorizedKeysCommand` is replaced with an +`AuthorizedPrincipalsCommand`. This extracts a username from the certificate +without using the Rails internal API, which is used instead of `key_id` in the +`/api/internal/allowed` call later. + +GitLab Shell also has a few operations that do not involve Gitaly, such as +resetting two-factor authentication codes. These are handled in the same way, +except there is no round-trip into Gitaly - Rails performs the action as part +of the [internal API](internal_api.md) call, and GitLab Shell streams the +response back to the user directly. ## System Layout diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md index a8151471b87..f3687b8d697 100644 --- a/doc/development/chatops_on_gitlabcom.md +++ b/doc/development/chatops_on_gitlabcom.md @@ -16,7 +16,7 @@ To request access to Chatops on GitLab.com: 1. Log into **using the same username** as for GitLab.com (you may have to rename it). 1. Ask in the [#production](https://gitlab.slack.com/messages/production) channel to add you by running `/chatops run member add gitlab-com/chatops --ops`. -NOTE: **Note:** If you had to change your username for GitLab.com on the first step, make sure [to reflect this information](https://gitlab.com/gitlab-com/www-gitlab-com#adding-yourself-to-the-team-page) on [the team page](https://about.gitlab.com/team). +NOTE: **Note:** If you had to change your username for GitLab.com on the first step, make sure [to reflect this information](https://gitlab.com/gitlab-com/www-gitlab-com#adding-yourself-to-the-team-page) on [the team page](https://about.gitlab.com/company/team/). ## See also diff --git a/doc/development/code_review.md b/doc/development/code_review.md index 830c3d3b3d2..efc9cad9810 100644 --- a/doc/development/code_review.md +++ b/doc/development/code_review.md @@ -79,7 +79,7 @@ from teams other than your own. #### Security requirements -View the updated documentation regarding [internal application security reviews](https://about.gitlab.com/handbook/engineering/security/index.html#internal-application-security-reviews) for **when** and **how** to request a security review. +View the updated documentation regarding [internal application security reviews](https://about.gitlab.com/handbook/engineering/security/#internal-application-security-reviews) for **when** and **how** to request a security review. ### The responsibility of the merge request author diff --git a/doc/development/documentation/site_architecture/release_process.md b/doc/development/documentation/site_architecture/release_process.md index 59a8d3cff01..b81fdb66baf 100644 --- a/doc/development/documentation/site_architecture/release_process.md +++ b/doc/development/documentation/site_architecture/release_process.md @@ -92,7 +92,7 @@ this needs to happen when the stable branches for all products have been created tagged with the branch name you created in the first step. In the end, the image will be uploaded in the [Container Registry](https://gitlab.com/gitlab-org/gitlab-docs/container_registry) and it will be listed under the - [`registry` environment folder](https://gitlab.com/gitlab-org/gitlab-docs/environments/folders/registry). + [`registry` environment folder](https://gitlab.com/gitlab-org/gitlab-docs/-/environments/folders/registry). Optionally, you can test locally by building the image and running it: @@ -179,11 +179,11 @@ The dropdown merge requests should have now been merged into their respective version (stable branch), which will trigger another pipeline. At this point, you need to only babysit the pipelines and make sure they don't fail: -1. Check the [pipelines page](https://gitlab.com/gitlab-org/gitlab-docs/pipelines) +1. Check the pipelines page: `https://gitlab.com/gitlab-org/gitlab-docs/pipelines` and make sure all stable branches have green pipelines. 1. After all the pipelines of the online versions succeed, merge the release merge request. -1. Finally, run the [Build docker images weekly](https://gitlab.com/gitlab-org/gitlab-docs/pipeline_schedules) - pipeline that will build the `:latest` and `:archives` Docker images. +1. Finally, from `https://gitlab.com/gitlab-org/gitlab-docs/pipeline_schedules` run + the `Build docker images weekly` pipeline that will build the `:latest` and `:archives` Docker images. Once the scheduled pipeline succeeds, the docs site will be deployed with all new versions online. @@ -191,8 +191,7 @@ new versions online. ## Update an old Docker image with new upstream docs content If there are any changes to any of the stable branches of the products that are -not included in the single Docker image, just -[rerun the pipeline](https://gitlab.com/gitlab-org/gitlab-docs/pipelines/new) +not included in the single Docker image, just rerun the pipeline (`https://gitlab.com/gitlab-org/gitlab-docs/pipelines/new`) for the version in question. ## Porting new website changes to old versions @@ -239,7 +238,7 @@ branches for 12.2 were used, this wouldn't have failed, but as we can see from the [`compile_dev` job](https://gitlab.com/gitlab-org/gitlab-docs/-/jobs/328042427), the `master` branches were pulled. -To fix this, [re-run the pipeline](https://gitlab.com/gitlab-org/gitlab-docs/pipelines/new) +To fix this, re-run the pipeline (`https://gitlab.com/gitlab-org/gitlab-docs/pipelines/new`) for the `update-12-2-for-release-12-4` branch, by including the following environment variables: - `BRANCH_CE` set to `12-2-stable` diff --git a/doc/development/documentation/workflow.md b/doc/development/documentation/workflow.md index 20559f9c0b5..aaf0f218387 100644 --- a/doc/development/documentation/workflow.md +++ b/doc/development/documentation/workflow.md @@ -62,7 +62,7 @@ responsible for: - Liaising with their Product Manager to understand what documentation must be delivered, and when. - Requesting technical reviews from other developers within their group. - Requesting documentation reviews from the Technical Writer - [assigned to the DevOps stage group](https://about.gitlab.com/handbook/product/technical-writing/index.html#assignments) + [assigned to the DevOps stage group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments) that is delivering the new feature or feature enhancements. TIP: **Tip:** @@ -92,7 +92,7 @@ the Product Manager and Technical Writer for a given issue: - Documentation [Structure and template](structure.md) page. - [Style Guide](styleguide.md). - [Markdown Guide](https://about.gitlab.com/handbook/engineering/ux/technical-writing/markdown-guide/). -- Contact the Technical Writer for the relevant [DevOps stage](https://about.gitlab.com/handbook/product/technical-writing/index.html#assignments) +- Contact the Technical Writer for the relevant [DevOps stage](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments) in your issue or merge request, or within `#docs` on GitLab Slack, if you: - Need any help to choose the correct place for documentation. - Want to discuss a documentation idea or outline. @@ -423,7 +423,7 @@ Request help from the Technical Writing team if you: To request help: 1. Locate the the Technical Writer for the relevant - [DevOps stage group](https://about.gitlab.com/handbook/product/technical-writing/index.html#assignments). + [DevOps stage group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments). 1. Either: - If urgent help is required, directly assign the Technical Writer in the issue or in the merge request. - If non-urgent help is required, ping the Technical Writer in the issue or merge request. @@ -439,7 +439,7 @@ Maintainers must make a good-faith effort to ensure that the content: - Meets the [Documentation Guidelines](index.md) and [Style Guide](styleguide.md). If the author or reviewer has any questions, they can mention the writer who is assigned to the relevant -[DevOps stage group](https://about.gitlab.com/handbook/product/technical-writing/index.html#assignments). +[DevOps stage group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments). The process involves the following: @@ -449,7 +449,7 @@ The process involves the following: - Technical Writer (Optional). If not completed for a merge request prior to merging, must be scheduled post-merge. Schedule post-merge reviews only if an urgent merge is required. To request a: - Pre-merge review, assign the Technical Writer listed for the applicable - [DevOps stage group](https://about.gitlab.com/handbook/product/technical-writing/index.html#assignments). + [DevOps stage group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments). - Post-merge review, see [Post-merge reviews](#post-merge-reviews). - Maintainer. For merge requests, Maintainers: - Can always request any of the above reviews. diff --git a/doc/development/fe_guide/frontend_faq.md b/doc/development/fe_guide/frontend_faq.md index ad52919a9af..3b0b1d8f0da 100644 --- a/doc/development/fe_guide/frontend_faq.md +++ b/doc/development/fe_guide/frontend_faq.md @@ -63,7 +63,7 @@ banner on top of the component examples indicates that: > component. For example, at the time of writing, this type of warning can be observed for -[all form components](https://design.gitlab.com/components/forms). It, however, +[all form components](https://design.gitlab.com/components/forms/). It, however, doesn't imply that the component should not be used. GitLab always asks to use `` components whenever a suitable component exists. diff --git a/doc/development/understanding_explain_plans.md b/doc/development/understanding_explain_plans.md index 97225e48976..48791e201eb 100644 --- a/doc/development/understanding_explain_plans.md +++ b/doc/development/understanding_explain_plans.md @@ -765,5 +765,5 @@ exec ROLLBACK ## Further reading A more extensive guide on understanding query plans can be found in -the [presentation](https://www.dalibo.org/_media/understanding_explain.pdf) -from [Dalibo.org](https://www.dalibo.org/en/). +the [presentation](https://public.dalibo.com/exports/conferences/_archives/_2012/201211_explain/understanding_explain.pdf) +from [Dalibo.org](https://www.dalibo.com/en/). -- cgit v1.2.1