Commit 98f62680 authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents 417d5355 c986e4a1
<script>
import { GlLink } from '@gitlab/ui';
export default {
components: {
GlLink,
},
props: {
path: {
type: String,
required: true,
},
text: {
type: String,
required: true,
},
cssClass: {
type: String,
required: false,
default: null,
},
},
};
</script>
<template>
<gl-link :href="path" :class="cssClass" class="btn gl-button">{{ text }}</gl-link>
</template>
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
> .dropdown, > .dropdown,
> input, > input,
> form { > form {
margin-right: $gl-padding-top; margin-right: $gl-padding-8;
&:last-child { &:last-child {
margin-right: 0; margin-right: 0;
......
---
title: Update secondary nav elements right margin to 8px
merge_request: 56794
author:
type: changed
---
# Warning: gitlab.NonStandardQuotes
#
# Use only standard single and double quotes, not left or right quotes.
#
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: existence
message: 'Use standard single quotes or double quotes only. Do not use left or right quotes.'
level: warning
ignorecase: true
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
scope: raw
raw:
- '[‘’“”]'
...@@ -5,11 +5,9 @@ ...@@ -5,11 +5,9 @@
# #
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles # For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: existence extends: existence
message: 'Rewrite "%s" to not use "’s".' message: "Rewrite '%s' to not use 's."
level: error level: error
ignorecase: true ignorecase: true
link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#trademark link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#trademark
tokens: tokens:
- GitLab's # Straight apostrophe. - GitLab's
- GitLab’s # Curly closing apostrophe.
- GitLab‘s # Curly opening apostrophe.
...@@ -154,7 +154,7 @@ The following are PostgreSQL upgrade validation tests we performed. ...@@ -154,7 +154,7 @@ The following are PostgreSQL upgrade validation tests we performed.
- Follow up issues: - Follow up issues:
- [`replicate-geo-database` incorrectly tries to back up repositories](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5241). - [`replicate-geo-database` incorrectly tries to back up repositories](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5241).
- [`pg-upgrade` fails to upgrade a standalone Geo tracking database](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5242). - [`pg-upgrade` fails to upgrade a standalone Geo tracking database](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5242).
- [`revert-pg-upgrade` fails to downgrade the PostgreSQL data of a Geo secondarys standalone tracking database](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5243). - [`revert-pg-upgrade` fails to downgrade the PostgreSQL data of a Geo secondary's standalone tracking database](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5243).
- [Timeout error on Geo secondary read-replica near the end of `gitlab-ctl pg-upgrade`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5235). - [Timeout error on Geo secondary read-replica near the end of `gitlab-ctl pg-upgrade`](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5235).
[Verify Geo installation with PostgreSQL 11](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4971): [Verify Geo installation with PostgreSQL 11](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4971):
......
...@@ -81,7 +81,7 @@ from [owasp.org](https://owasp.org/). ...@@ -81,7 +81,7 @@ from [owasp.org](https://owasp.org/).
considered an administrator with super-user privileges. considered an administrator with super-user privileges.
- See also: [more granular access control](https://gitlab.com/gitlab-org/gitlab/-/issues/18242) - See also: [more granular access control](https://gitlab.com/gitlab-org/gitlab/-/issues/18242)
(not Geo-specific). (not Geo-specific).
- Much of Geos integration (database replication, for instance) must be - Much of Geo's integration (database replication, for instance) must be
configured with the application, typically by system administrators. configured with the application, typically by system administrators.
### What administrative capabilities does the application offer? ### What administrative capabilities does the application offer?
...@@ -223,7 +223,7 @@ from [owasp.org](https://owasp.org/). ...@@ -223,7 +223,7 @@ from [owasp.org](https://owasp.org/).
### What data input validation requirements have been defined? ### What data input validation requirements have been defined?
- **Secondary** nodes must have a faithful replication of the **primary** nodes data. - **Secondary** nodes must have a faithful replication of the **primary** node's data.
### What data does the application store and how? ### What data does the application store and how?
...@@ -235,7 +235,7 @@ from [owasp.org](https://owasp.org/). ...@@ -235,7 +235,7 @@ from [owasp.org](https://owasp.org/).
rest. A subset of database columns are encrypted at rest using the `db_otp_key`. rest. A subset of database columns are encrypted at rest using the `db_otp_key`.
- A static secret shared across all hosts in a GitLab deployment. - A static secret shared across all hosts in a GitLab deployment.
- In transit, data should be encrypted, although the application does permit - In transit, data should be encrypted, although the application does permit
communication to proceed unencrypted. The two main transits are the **secondary** nodes communication to proceed unencrypted. The two main transits are the **secondary** node's
replication process for PostgreSQL, and for Git repositories/files. Both should replication process for PostgreSQL, and for Git repositories/files. Both should
be protected using TLS, with the keys for that managed via Omnibus per existing be protected using TLS, with the keys for that managed via Omnibus per existing
configuration for end-user access to GitLab. configuration for end-user access to GitLab.
......
...@@ -838,7 +838,7 @@ addition to the GitLab nodes. Some requests handled by ...@@ -838,7 +838,7 @@ addition to the GitLab nodes. Some requests handled by
process. `gitaly-ruby` uses the Gitaly address set in the GitLab server's process. `gitaly-ruby` uses the Gitaly address set in the GitLab server's
`git_data_dirs` setting to make this connection. `git_data_dirs` setting to make this connection.
We hope that if youre managing fault-tolerant systems like GitLab, you have a load balancer We hope that if you're managing fault-tolerant systems like GitLab, you have a load balancer
of choice already. Some examples include [HAProxy](https://www.haproxy.org/) of choice already. Some examples include [HAProxy](https://www.haproxy.org/)
(open-source), [Google Internal Load Balancer](https://cloud.google.com/load-balancing/docs/internal/), (open-source), [Google Internal Load Balancer](https://cloud.google.com/load-balancing/docs/internal/),
[AWS Elastic Load Balancer](https://aws.amazon.com/elasticloadbalancing/), F5 [AWS Elastic Load Balancer](https://aws.amazon.com/elasticloadbalancing/), F5
......
...@@ -105,7 +105,7 @@ Limit the maximum daily member invitations allowed per group hierarchy. ...@@ -105,7 +105,7 @@ Limit the maximum daily member invitations allowed per group hierarchy.
## Gitaly concurrency limit ## Gitaly concurrency limit
Clone traffic can put a large strain on your Gitaly service. To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in Gitalys configuration file. Clone traffic can put a large strain on your Gitaly service. To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in Gitaly's configuration file.
Read more on [Gitaly concurrency limits](gitaly/configure_gitaly.md#limit-rpc-concurrency). Read more on [Gitaly concurrency limits](gitaly/configure_gitaly.md#limit-rpc-concurrency).
......
...@@ -90,7 +90,7 @@ You can add custom metrics in the self monitoring project by: ...@@ -90,7 +90,7 @@ You can add custom metrics in the self monitoring project by:
## Troubleshooting ## Troubleshooting
### Getting error message in logs: `Could not create instance administrators group. Errors: ["You dont have permission to create groups."]` ### Getting error message in logs: `Could not create instance administrators group. Errors: ["You don't have permission to create groups."]`
There is [a bug](https://gitlab.com/gitlab-org/gitlab/-/issues/208676) which causes There is [a bug](https://gitlab.com/gitlab-org/gitlab/-/issues/208676) which causes
project creation to fail with the following error (which appears in the log file) project creation to fail with the following error (which appears in the log file)
...@@ -98,7 +98,7 @@ when the first administrator user is an ...@@ -98,7 +98,7 @@ when the first administrator user is an
[external user](../../../user/permissions.md#external-users): [external user](../../../user/permissions.md#external-users):
```plaintext ```plaintext
Could not create instance administrators group. Errors: ["You dont have permission to create groups."] Could not create instance administrators group. Errors: ["You don't have permission to create groups."]
``` ```
Run the following in a Rails console to check if the first administrator user is an external user: Run the following in a Rails console to check if the first administrator user is an external user:
......
...@@ -25,5 +25,5 @@ Explore our features to monitor your GitLab instance: ...@@ -25,5 +25,5 @@ Explore our features to monitor your GitLab instance:
- [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status): - [`nginx_status`](https://docs.gitlab.com/omnibus/settings/nginx.html#enablingdisabling-nginx_status):
Monitor your NGINX server status. Monitor your NGINX server status.
- [Auto Monitoring](../../topics/autodevops/stages.md#auto-monitoring): Automated - [Auto Monitoring](../../topics/autodevops/stages.md#auto-monitoring): Automated
monitoring for your applications server and response metrics, provided by monitoring for your application's server and response metrics, provided by
[Auto DevOps](../../topics/autodevops/index.md). [Auto DevOps](../../topics/autodevops/index.md).
...@@ -180,7 +180,7 @@ outside world. ...@@ -180,7 +180,7 @@ outside world.
pages_nginx['redirect_http_to_https'] = true pages_nginx['redirect_http_to_https'] = true
``` ```
1. If you havent named your certificate and key `example.io.crt` and `example.io.key` 1. If you haven't named your certificate and key `example.io.crt` and `example.io.key`
then you'll need to also add the full paths as shown below: then you'll need to also add the full paths as shown below:
```ruby ```ruby
......
...@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w ...@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Redis replication and failover providing your own instance **(FREE SELF)** # Redis replication and failover providing your own instance **(FREE SELF)**
If youre hosting GitLab on a cloud provider, you can optionally use a managed If you're hosting GitLab on a cloud provider, you can optionally use a managed
service for Redis. For example, AWS offers ElastiCache that runs Redis. service for Redis. For example, AWS offers ElastiCache that runs Redis.
Alternatively, you may opt to manage your own Redis instance separate from the Alternatively, you may opt to manage your own Redis instance separate from the
......
...@@ -12,7 +12,7 @@ This page details the recommended Reference Architectures that were built and ...@@ -12,7 +12,7 @@ This page details the recommended Reference Architectures that were built and
verified by the GitLab Quality and Support teams. verified by the GitLab Quality and Support teams.
Below is a chart representing each architecture tier and the number of users Below is a chart representing each architecture tier and the number of users
they can handle. As your number of users grow with time, its recommended that they can handle. As your number of users grow with time, it's recommended that
you scale GitLab accordingly. you scale GitLab accordingly.
![Reference Architectures](img/reference-architectures.png) ![Reference Architectures](img/reference-architectures.png)
......
...@@ -7,7 +7,7 @@ type: reference ...@@ -7,7 +7,7 @@ type: reference
# Troubleshooting Group SAML and SCIM **(PREMIUM SAAS)** # Troubleshooting Group SAML and SCIM **(PREMIUM SAAS)**
These are notes and screenshots regarding Group SAML and SCIM that the GitLab Support Team sometimes uses while troubleshooting, but which do not fit into the official documentation. GitLab is making this public, so that anyone can make use of the Support teams collected knowledge. These are notes and screenshots regarding Group SAML and SCIM that the GitLab Support Team sometimes uses while troubleshooting, but which do not fit into the official documentation. GitLab is making this public, so that anyone can make use of the Support team's collected knowledge.
Please refer to the GitLab [Group SAML](../../user/group/saml_sso/index.md) docs for information on the feature and how to set it up. Please refer to the GitLab [Group SAML](../../user/group/saml_sso/index.md) docs for information on the feature and how to set it up.
......
...@@ -91,7 +91,7 @@ This section is for links to information elsewhere in the GitLab documentation. ...@@ -91,7 +91,7 @@ This section is for links to information elsewhere in the GitLab documentation.
Command exceeded allowed execution time Command exceeded allowed execution time
PANIC: could not write to file ‘pg_xlog/xlogtemp.123’: No space left on device PANIC: could not write to file 'pg_xlog/xlogtemp.123': No space left on device
``` ```
- [Checking Geo configuration](../geo/replication/troubleshooting.md), including: - [Checking Geo configuration](../geo/replication/troubleshooting.md), including:
......
...@@ -347,7 +347,7 @@ Gitlab::SidekiqDaemon::Monitor.cancel_job('job-id') ...@@ -347,7 +347,7 @@ Gitlab::SidekiqDaemon::Monitor.cancel_job('job-id')
> environment variable. > environment variable.
To perform of the interrupt we use `Thread.raise` which To perform of the interrupt we use `Thread.raise` which
has number of drawbacks, as mentioned in [Why Rubys Timeout is dangerous (and Thread.raise is terrifying)](https://jvns.ca/blog/2015/11/27/why-rubys-timeout-is-dangerous-and-thread-dot-raise-is-terrifying/): has number of drawbacks, as mentioned in [Why Ruby's Timeout is dangerous (and Thread.raise is terrifying)](https://jvns.ca/blog/2015/11/27/why-rubys-timeout-is-dangerous-and-thread-dot-raise-is-terrifying/):
> This is where the implications get interesting, and terrifying. This means that an exception can get raised: > This is where the implications get interesting, and terrifying. This means that an exception can get raised:
> >
...@@ -357,4 +357,4 @@ has number of drawbacks, as mentioned in [Why Ruby’s Timeout is dangerous (and ...@@ -357,4 +357,4 @@ has number of drawbacks, as mentioned in [Why Ruby’s Timeout is dangerous (and
> - while creating an object to save to the database afterwards > - while creating an object to save to the database afterwards
> - in any of your code, regardless of whether it could have possibly raised an exception before > - in any of your code, regardless of whether it could have possibly raised an exception before
> >
> Nobody writes code to defend against an exception being raised on literally any line. That’s not even possible. So Thread.raise is basically like a sneak attack on your code that could result in almost anything. It would probably be okay if it were pure-functional code that did not modify any state. But this is Ruby, so that’s unlikely :) > Nobody writes code to defend against an exception being raised on literally any line. That's not even possible. So Thread.raise is basically like a sneak attack on your code that could result in almost anything. It would probably be okay if it were pure-functional code that did not modify any state. But this is Ruby, so that's unlikely :)
...@@ -12,7 +12,7 @@ description: 'Container Registry metadata database' ...@@ -12,7 +12,7 @@ description: 'Container Registry metadata database'
With the [Container Registry](https://gitlab.com/gitlab-org/container-registry) integrated into GitLab, every GitLab project can have its own space to store its Docker images. You can use the registry to build, push and share images using the Docker client, CI/CD or the GitLab API. With the [Container Registry](https://gitlab.com/gitlab-org/container-registry) integrated into GitLab, every GitLab project can have its own space to store its Docker images. You can use the registry to build, push and share images using the Docker client, CI/CD or the GitLab API.
Each day on GitLab.com, between [150k and 200k images are pushed to the registry](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9620193&udv=0), generating about [700k API events](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=7601761&udv=0). Its also worth noting that although some customers use other registry vendors, [more than 96% of instances](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9832282&udv=0) are using the GitLab Container Registry. Each day on GitLab.com, between [150k and 200k images are pushed to the registry](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9620193&udv=0), generating about [700k API events](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=7601761&udv=0). It's also worth noting that although some customers use other registry vendors, [more than 96% of instances](https://app.periscopedata.com/app/gitlab/527857/Package-GitLab.com-Stage-Activity-Dashboard?widget=9832282&udv=0) are using the GitLab Container Registry.
For GitLab.com and for GitLab customers, the Container Registry is a critical component to building and deploying software. For GitLab.com and for GitLab customers, the Container Registry is a critical component to building and deploying software.
......
...@@ -17,7 +17,7 @@ from development to staging, and then to production (or ...@@ -17,7 +17,7 @@ from development to staging, and then to production (or
through any series of custom environment flows you can set up). through any series of custom environment flows you can set up).
With an at-a-glance view of multiple projects, you can instantly With an at-a-glance view of multiple projects, you can instantly
see which pipelines are green and which are red allowing you to see which pipelines are green and which are red allowing you to
diagnose if there is a block at a particular point, or if theres diagnose if there is a block at a particular point, or if there's
a more systemic problem you need to investigate. a more systemic problem you need to investigate.
You can access the dashboard from the top bar by clicking You can access the dashboard from the top bar by clicking
......
...@@ -166,7 +166,7 @@ For examples of others who have implemented GitLab CI/CD, see: ...@@ -166,7 +166,7 @@ For examples of others who have implemented GitLab CI/CD, see:
To see how you can integrate GitLab CI/CD with third-party systems, see: To see how you can integrate GitLab CI/CD with third-party systems, see:
- [Streamline and shorten error remediation with Sentrys new GitLab integration](https://about.gitlab.com/blog/2019/01/25/sentry-integration-blog-post/) - [Streamline and shorten error remediation with Sentry's new GitLab integration](https://about.gitlab.com/blog/2019/01/25/sentry-integration-blog-post/)
- [How to simplify your smart home configuration with GitLab CI/CD](https://about.gitlab.com/blog/2018/08/02/using-the-gitlab-ci-slash-cd-for-smart-home-configuration-management/) - [How to simplify your smart home configuration with GitLab CI/CD](https://about.gitlab.com/blog/2018/08/02/using-the-gitlab-ci-slash-cd-for-smart-home-configuration-management/)
- [Demo: GitLab + Jira + Jenkins](https://about.gitlab.com/blog/2018/07/30/gitlab-workflow-with-jira-jenkins/) - [Demo: GitLab + Jira + Jenkins](https://about.gitlab.com/blog/2018/07/30/gitlab-workflow-with-jira-jenkins/)
- [Introducing Auto Breakfast from GitLab (sort of)](https://about.gitlab.com/blog/2018/06/29/introducing-auto-breakfast-from-gitlab/) - [Introducing Auto Breakfast from GitLab (sort of)](https://about.gitlab.com/blog/2018/06/29/introducing-auto-breakfast-from-gitlab/)
......
...@@ -2614,7 +2614,7 @@ the GitLab UI to run. ...@@ -2614,7 +2614,7 @@ the GitLab UI to run.
Also in the example, `GIT_STRATEGY` is set to `none`. If the Also in the example, `GIT_STRATEGY` is set to `none`. If the
`stop_review_app` job is [automatically triggered](../environments/index.md#stopping-an-environment), `stop_review_app` job is [automatically triggered](../environments/index.md#stopping-an-environment),
the runner wont try to check out the code after the branch is deleted. the runner won't try to check out the code after the branch is deleted.
The example also overwrites global variables. If your `stop` `environment` job depends The example also overwrites global variables. If your `stop` `environment` job depends
on global variables, use [anchor variables](#yaml-anchors-for-variables) when you set the `GIT_STRATEGY` on global variables, use [anchor variables](#yaml-anchors-for-variables) when you set the `GIT_STRATEGY`
...@@ -4197,7 +4197,7 @@ job: ...@@ -4197,7 +4197,7 @@ job:
#### `release:ref` #### `release:ref`
If the `release: tag_name` doesnt exist yet, the release is created from `ref`. If the `release: tag_name` doesn't exist yet, the release is created from `ref`.
`ref` can be a commit SHA, another tag name, or a branch name. `ref` can be a commit SHA, another tag name, or a branch name.
#### `release:milestones` #### `release:milestones`
......
...@@ -319,7 +319,7 @@ You can also use `workflow::ready for review` label. That means that your merge ...@@ -319,7 +319,7 @@ You can also use `workflow::ready for review` label. That means that your merge
When your merge request receives an approval from the first reviewer it can be passed to a maintainer. You should default to choosing a maintainer with [domain expertise](#domain-experts), and otherwise follow the Reviewer Roulette recommendation or use the label `ready for merge`. When your merge request receives an approval from the first reviewer it can be passed to a maintainer. You should default to choosing a maintainer with [domain expertise](#domain-experts), and otherwise follow the Reviewer Roulette recommendation or use the label `ready for merge`.
Sometimes, a maintainer may not be available for review. They could be out of the office or [at capacity](#review-response-slo). Sometimes, a maintainer may not be available for review. They could be out of the office or [at capacity](#review-response-slo).
You can and should check the maintainers availability in their profile. If the maintainer recommended by You can and should check the maintainer's availability in their profile. If the maintainer recommended by
the roulette is not available, choose someone else from that list. the roulette is not available, choose someone else from that list.
It is responsibility of the author of a merge request that the merge request is reviewed. If it stays in `ready for review` state too long it is recommended to assign it to a specific reviewer. It is responsibility of the author of a merge request that the merge request is reviewed. If it stays in `ready for review` state too long it is recommended to assign it to a specific reviewer.
......
...@@ -149,7 +149,7 @@ Keep the following in mind when submitting merge requests: ...@@ -149,7 +149,7 @@ Keep the following in mind when submitting merge requests:
- [Documentation](../documentation/styleguide/index.md) style guide. - [Documentation](../documentation/styleguide/index.md) style guide.
- [Code style guides](style_guides.md). - [Code style guides](style_guides.md).
- Sometimes style guides will be followed but the code will lack structural integrity, or the - Sometimes style guides will be followed but the code will lack structural integrity, or the
reviewer will have reservations about the codes overall quality. When there is a reservation, reviewer will have reservations about the code's overall quality. When there is a reservation,
the reviewer will inform the author and provide some guidance. the reviewer will inform the author and provide some guidance.
- Though GitLab generally allows anyone to indicate - Though GitLab generally allows anyone to indicate
[approval](../../user/project/merge_requests/merge_request_approvals.md) of merge requests, the [approval](../../user/project/merge_requests/merge_request_approvals.md) of merge requests, the
......
...@@ -231,7 +231,7 @@ for its search function. This is how it works: ...@@ -231,7 +231,7 @@ for its search function. This is how it works:
### Algolia notes for GitLab team members ### Algolia notes for GitLab team members
If youre a GitLab team member, find credentials for the Algolia dashboard If you're a GitLab team member, find credentials for the Algolia dashboard
in the shared [GitLab 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams). in the shared [GitLab 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams).
To receive weekly reports of the search usage, search the Google doc with To receive weekly reports of the search usage, search the Google doc with
title `Email, Slack, and GitLab Groups and Aliases`, search for `docsearch`, title `Email, Slack, and GitLab Groups and Aliases`, search for `docsearch`,
......
...@@ -52,9 +52,9 @@ A concept should answer the questions: ...@@ -52,9 +52,9 @@ A concept should answer the questions:
- What is this? - What is this?
- Why would I use it? - Why would I use it?
Think of everything someone might want to know if theyve never heard of this topic before. Think of everything someone might want to know if they've never heard of this topic before.
Dont tell them **how** to do this thing. Tell them **what it is**. Don't tell them **how** to do this thing. Tell them **what it is**.
If you start describing another topic, start a new concept and link to it. If you start describing another topic, start a new concept and link to it.
......
...@@ -28,7 +28,7 @@ so when in doubt don't use `aria-*`, `role`, and `tabindex`, and stick with sema ...@@ -28,7 +28,7 @@ so when in doubt don't use `aria-*`, `role`, and `tabindex`, and stick with sema
To provide markup with accessible names, ensure every: To provide markup with accessible names, ensure every:
- `input` has an associated `label`. - `input` has an associated `label`.
- `button` and `a` have child text, or `aria-label` when text isnt present. - `button` and `a` have child text, or `aria-label` when text isn't present.
For example, an icon button with no visible text. For example, an icon button with no visible text.
- `img` has an `alt` attribute. - `img` has an `alt` attribute.
- `fieldset` has `legend` as its first child. - `fieldset` has `legend` as its first child.
......
...@@ -26,7 +26,7 @@ production assets post-compile. ...@@ -26,7 +26,7 @@ production assets post-compile.
We use the [Renovate GitLab Bot](https://gitlab.com/gitlab-org/frontend/renovate-gitlab-bot) to We use the [Renovate GitLab Bot](https://gitlab.com/gitlab-org/frontend/renovate-gitlab-bot) to
automatically create merge requests for updating dependencies of several projects. automatically create merge requests for updating dependencies of several projects.
You can find the up-to-date list of projects managed by the renovate bot in the projects README. You can find the up-to-date list of projects managed by the renovate bot in the project's README.
Some key dependencies updated using renovate are: Some key dependencies updated using renovate are:
......
...@@ -104,7 +104,7 @@ by the examples that follow: ...@@ -104,7 +104,7 @@ by the examples that follow:
**Example 1:** **Example 1:**
The following HAML expression generates a loading icons markup and The following HAML expression generates a loading icon's markup and
centers the icon by wrapping it in a `gl-spinner-container` element. centers the icon by wrapping it in a `gl-spinner-container` element.
```haml ```haml
...@@ -121,7 +121,7 @@ centers the icon by wrapping it in a `gl-spinner-container` element. ...@@ -121,7 +121,7 @@ centers the icon by wrapping it in a `gl-spinner-container` element.
**Example 2:** **Example 2:**
The following HAML expression generates a loading icons markup The following HAML expression generates a loading icon's markup
with a custom size. It also appends a margin utility class. with a custom size. It also appends a margin utility class.
```haml ```haml
...@@ -137,7 +137,7 @@ with a custom size. It also appends a margin utility class. ...@@ -137,7 +137,7 @@ with a custom size. It also appends a margin utility class.
### Usage in Vue ### Usage in Vue
The [GitLab UI](https://gitlab-org.gitlab.io/gitlab-ui/) components library provides a The [GitLab UI](https://gitlab-org.gitlab.io/gitlab-ui/) components library provides a
`GlLoadingIcon` component. See the components `GlLoadingIcon` component. See the component's
[storybook](https://gitlab-org.gitlab.io/gitlab-ui/?path=/story/base-loading-icon--default) [storybook](https://gitlab-org.gitlab.io/gitlab-ui/?path=/story/base-loading-icon--default)
for more information about its usage. for more information about its usage.
......
...@@ -35,7 +35,7 @@ performance.getEntriesByName('my-component-start') ...@@ -35,7 +35,7 @@ performance.getEntriesByName('my-component-start')
- The start of navigation and a mark - The start of navigation and a mark
- The start of navigation and the moment the measurement is taken - The start of navigation and the moment the measurement is taken
It takes several arguments of which the measurements name is the only one required. Examples: It takes several arguments of which the measurement's name is the only one required. Examples:
- Duration between the start and end marks: - Duration between the start and end marks:
...@@ -185,16 +185,16 @@ To access stored measurements, you can use either: ...@@ -185,16 +185,16 @@ To access stored measurements, you can use either:
### Naming convention ### Naming convention
All the marks and measures should be instantiated with the constants from All the marks and measures should be instantiated with the constants from
`app/assets/javascripts/performance/constants.js`. When you’re ready to add a new mark’s or `app/assets/javascripts/performance/constants.js`. When you're ready to add a new mark's or
measurements label, you can follow the pattern. measurement's label, you can follow the pattern.
NOTE: NOTE:
This pattern is a recommendation and not a hard rule. This pattern is a recommendation and not a hard rule.
```javascript ```javascript
app-*-start // for a start ‘mark’ app-*-start // for a start 'mark'
app-*-end // for an end ‘mark’ app-*-end // for an end 'mark'
app-* // for ‘measure’ app-* // for 'measure'
``` ```
For example, `'webide-init-editor-start`, `mr-diffs-mark-file-tree-end`, and so on. We do it to For example, `'webide-init-editor-start`, `mr-diffs-mark-file-tree-end`, and so on. We do it to
......
...@@ -18,4 +18,4 @@ There are multiple ways of writing code to accomplish the same results. We shoul ...@@ -18,4 +18,4 @@ There are multiple ways of writing code to accomplish the same results. We shoul
## Improve code [iteratively](https://about.gitlab.com/handbook/values/#iteration) ## Improve code [iteratively](https://about.gitlab.com/handbook/values/#iteration)
Whenever you see existing code that does not follow our current style guide, update it proactively. You dont need to fix everything, but each merge request should iteratively improve our codebase, and reduce technical debt where possible. Whenever you see existing code that does not follow our current style guide, update it proactively. You don't need to fix everything, but each merge request should iteratively improve our codebase, and reduce technical debt where possible.
...@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w ...@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Resources ## Resources
[Mozillas HTTP Observatory CLI](https://github.com/mozilla/http-observatory-cli) and [Mozilla's HTTP Observatory CLI](https://github.com/mozilla/http-observatory-cli) and
[Qualys SSL Labs Server Test](https://www.ssllabs.com/ssltest/analyze.html) are good resources for finding [Qualys SSL Labs Server Test](https://www.ssllabs.com/ssltest/analyze.html) are good resources for finding
potential problems and ensuring compliance with security best practices. potential problems and ensuring compliance with security best practices.
...@@ -41,7 +41,7 @@ Security Policy headers in the GitLab Rails app. ...@@ -41,7 +41,7 @@ Security Policy headers in the GitLab Rails app.
Some resources on implementing Content Security Policy: Some resources on implementing Content Security Policy:
- [MDN Article on CSP](https://developer.mozilla.org/en-US/docs/Web/Security/CSP) - [MDN Article on CSP](https://developer.mozilla.org/en-US/docs/Web/Security/CSP)
- [GitHubs CSP Journey on the GitHub Engineering Blog](http://githubengineering.com/githubs-csp-journey/) - [GitHub's CSP Journey on the GitHub Engineering Blog](http://githubengineering.com/githubs-csp-journey/)
- The Dropbox Engineering Blog's series on CSP: [1](https://blogs.dropbox.com/tech/2015/09/on-csp-reporting-and-filtering/), [2](https://blogs.dropbox.com/tech/2015/09/unsafe-inline-and-nonce-deployment/), [3](https://blogs.dropbox.com/tech/2015/09/csp-the-unexpected-eval/), [4](https://blogs.dropbox.com/tech/2015/09/csp-third-party-integrations-and-privilege-separation/) - The Dropbox Engineering Blog's series on CSP: [1](https://blogs.dropbox.com/tech/2015/09/on-csp-reporting-and-filtering/), [2](https://blogs.dropbox.com/tech/2015/09/unsafe-inline-and-nonce-deployment/), [3](https://blogs.dropbox.com/tech/2015/09/csp-the-unexpected-eval/), [4](https://blogs.dropbox.com/tech/2015/09/csp-third-party-integrations-and-privilege-separation/)
### Subresource Integrity (SRI) ### Subresource Integrity (SRI)
......
...@@ -322,7 +322,7 @@ A few things to keep in mind when adding context: ...@@ -322,7 +322,7 @@ A few things to keep in mind when adding context:
- [Go 1.13 errors](https://blog.golang.org/go1.13-errors). - [Go 1.13 errors](https://blog.golang.org/go1.13-errors).
- [Programing with - [Programing with
errors](https://peter.bourgon.org/blog/2019/09/11/programming-with-errors.html). errors](https://peter.bourgon.org/blog/2019/09/11/programming-with-errors.html).
- [Dont just check errors, handle them - [Don't just check errors, handle them
gracefully](https://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully). gracefully](https://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully).
## CLIs ## CLIs
......
...@@ -106,7 +106,7 @@ and complete an integration with the Secure stage. ...@@ -106,7 +106,7 @@ and complete an integration with the Secure stage.
1. Demo the integration to GitLab: 1. Demo the integration to GitLab:
- After you have tested and are ready to demo your integration please - After you have tested and are ready to demo your integration please
[reach out](https://about.gitlab.com/partners/integrate/) to us. If you [reach out](https://about.gitlab.com/partners/integrate/) to us. If you
skip this step you wont be able to do supported marketing. skip this step you won't be able to do supported marketing.
1. Begin doing supported marketing of your GitLab integration. 1. Begin doing supported marketing of your GitLab integration.
- Work with our [partner team](https://about.gitlab.com/partners/integrate/) - Work with our [partner team](https://about.gitlab.com/partners/integrate/)
to support your go-to-market as appropriate. to support your go-to-market as appropriate.
......
...@@ -153,7 +153,7 @@ and therefore it does not have any records yet. ...@@ -153,7 +153,7 @@ and therefore it does not have any records yet.
When using a single-transaction migration, a transaction holds a database connection When using a single-transaction migration, a transaction holds a database connection
for the duration of the migration, so you must make sure the actions in the migration for the duration of the migration, so you must make sure the actions in the migration
do not take too much time: GitLab.coms production database has a `15s` timeout, so do not take too much time: GitLab.com's production database has a `15s` timeout, so
in general, the cumulative execution time in a migration should aim to fit comfortably in general, the cumulative execution time in a migration should aim to fit comfortably
in that limit. Singular query timings should fit within the [standard limit](query_performance.md#timing-guidelines-for-queries) in that limit. Singular query timings should fit within the [standard limit](query_performance.md#timing-guidelines-for-queries)
......
...@@ -576,7 +576,7 @@ overwrites the Git configuration with the appropriate settings to fetch ...@@ -576,7 +576,7 @@ overwrites the Git configuration with the appropriate settings to fetch
from the GitLab repository. from the GitLab repository.
`CI_REPO_CACHE_CREDENTIALS` contains the Google Cloud service account `CI_REPO_CACHE_CREDENTIALS` contains the Google Cloud service account
JSON for uploading to the `gitlab-ci-git-repo-cache` bucket. (If youre a JSON for uploading to the `gitlab-ci-git-repo-cache` bucket. (If you're a
GitLab Team Member, find credentials in the GitLab Team Member, find credentials in the
[GitLab shared 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams). [GitLab shared 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams).
......
...@@ -525,7 +525,7 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g ...@@ -525,7 +525,7 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g
| `contexts` | **{dotted-circle}** | | | | `contexts` | **{dotted-circle}** | | |
| `derived_contexts` | **{dotted-circle}** | | Contexts derived in the Enrich process | | `derived_contexts` | **{dotted-circle}** | | Contexts derived in the Enrich process |
| `derived_tstamp` | **{dotted-circle}** | timestamp | Timestamp making allowance for inaccurate device clock | | `derived_tstamp` | **{dotted-circle}** | timestamp | Timestamp making allowance for inaccurate device clock |
| `doc_charset` | **{dotted-circle}** | string | Web pages character encoding | | `doc_charset` | **{dotted-circle}** | string | Web page's character encoding |
| `doc_height` | **{dotted-circle}** | string | Web page height | | `doc_height` | **{dotted-circle}** | string | Web page height |
| `doc_width` | **{dotted-circle}** | string | Web page width | | `doc_width` | **{dotted-circle}** | string | Web page width |
| `domain_sessionid` | **{dotted-circle}** | string | Unique identifier (UUID) for this visit of this user_id to this domain | | `domain_sessionid` | **{dotted-circle}** | string | Unique identifier (UUID) for this visit of this user_id to this domain |
...@@ -554,10 +554,10 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g ...@@ -554,10 +554,10 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g
| `geo_region_name` | **{dotted-circle}** | string | Region of IP origin | | `geo_region_name` | **{dotted-circle}** | string | Region of IP origin |
| `geo_timezone` | **{dotted-circle}** | string | Timezone of IP origin | | `geo_timezone` | **{dotted-circle}** | string | Timezone of IP origin |
| `geo_zipcode` | **{dotted-circle}** | string | Zip (postal) code of IP origin | | `geo_zipcode` | **{dotted-circle}** | string | Zip (postal) code of IP origin |
| `ip_domain` | **{dotted-circle}** | string | Second level domain name associated with the visitors IP address | | `ip_domain` | **{dotted-circle}** | string | Second level domain name associated with the visitor's IP address |
| `ip_isp` | **{dotted-circle}** | string | Visitors ISP | | `ip_isp` | **{dotted-circle}** | string | Visitor's ISP |
| `ip_netspeed` | **{dotted-circle}** | string | Visitors connection type | | `ip_netspeed` | **{dotted-circle}** | string | Visitor's connection type |
| `ip_organization` | **{dotted-circle}** | string | Organization associated with the visitors IP address – defaults to ISP name if none is found | | `ip_organization` | **{dotted-circle}** | string | Organization associated with the visitor's IP address – defaults to ISP name if none is found |
| `mkt_campaign` | **{dotted-circle}** | string | The campaign ID | | `mkt_campaign` | **{dotted-circle}** | string | The campaign ID |
| `mkt_clickid` | **{dotted-circle}** | string | The click ID | | `mkt_clickid` | **{dotted-circle}** | string | The click ID |
| `mkt_content` | **{dotted-circle}** | string | The content or ID of the ad. | | `mkt_content` | **{dotted-circle}** | string | The content or ID of the ad. |
...@@ -566,7 +566,7 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g ...@@ -566,7 +566,7 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g
| `mkt_source` | **{dotted-circle}** | string | The company / website where the traffic came from | | `mkt_source` | **{dotted-circle}** | string | The company / website where the traffic came from |
| `mkt_term` | **{dotted-circle}** | string | Keywords associated with the referrer | | `mkt_term` | **{dotted-circle}** | string | Keywords associated with the referrer |
| `name_tracker` | **{dotted-circle}** | string | The tracker namespace | | `name_tracker` | **{dotted-circle}** | string | The tracker namespace |
| `network_userid` | **{dotted-circle}** | string | Unique identifier for a user, based on a cookie from the collector (so set at a network level and shouldnt be set by a tracker) | | `network_userid` | **{dotted-circle}** | string | Unique identifier for a user, based on a cookie from the collector (so set at a network level and shouldn't be set by a tracker) |
| `os_family` | **{dotted-circle}** | string | Operating system family | | `os_family` | **{dotted-circle}** | string | Operating system family |
| `os_manufacturer` | **{dotted-circle}** | string | Manufacturers of operating system | | `os_manufacturer` | **{dotted-circle}** | string | Manufacturers of operating system |
| `os_name` | **{dotted-circle}** | string | Name of operating system | | `os_name` | **{dotted-circle}** | string | Name of operating system |
...@@ -598,7 +598,7 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g ...@@ -598,7 +598,7 @@ The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/g
| `refr_urlscheme` | **{dotted-circle}** | string | Referer scheme | | `refr_urlscheme` | **{dotted-circle}** | string | Referer scheme |
| `se_action` | **{dotted-circle}** | string | The action / event itself | | `se_action` | **{dotted-circle}** | string | The action / event itself |
| `se_category` | **{dotted-circle}** | string | The category of event | | `se_category` | **{dotted-circle}** | string | The category of event |
| `se_label` | **{dotted-circle}** | string | A label often used to refer to the ‘object’ the action is performed on | | `se_label` | **{dotted-circle}** | string | A label often used to refer to the 'object' the action is performed on |
| `se_property` | **{dotted-circle}** | string | A property associated with either the action or the object | | `se_property` | **{dotted-circle}** | string | A property associated with either the action or the object |
| `se_value` | **{dotted-circle}** | decimal | A value associated with the user action | | `se_value` | **{dotted-circle}** | decimal | A value associated with the user action |
| `ti_category` | **{dotted-circle}** | string | Item category | | `ti_category` | **{dotted-circle}** | string | Item category |
......
...@@ -55,12 +55,12 @@ Including when that expanded content is: ...@@ -55,12 +55,12 @@ Including when that expanded content is:
### Using assertions to detect transient bugs caused by unmet conditions ### Using assertions to detect transient bugs caused by unmet conditions
Transient bugs happen in the context of code that executes under the assumption Transient bugs happen in the context of code that executes under the assumption
that the applications state meets one or more conditions. We may write a feature that the application's state meets one or more conditions. We may write a feature
that assumes a server-side API response always include a group of attributes or that that assumes a server-side API response always include a group of attributes or that
an operation only executes when the application has successfully transitioned to a new an operation only executes when the application has successfully transitioned to a new
state. state.
Transient bugs are difficult to debug because there isnt any mechanism that alerts Transient bugs are difficult to debug because there isn't any mechanism that alerts
the user or the developer about unsatisfied conditions. These conditions are usually the user or the developer about unsatisfied conditions. These conditions are usually
not expressed explicitly in the code. A useful debugging technique for such situations not expressed explicitly in the code. A useful debugging technique for such situations
is placing assertions to make any assumption explicit. They can help detect the cause is placing assertions to make any assumption explicit. They can help detect the cause
......
...@@ -25,7 +25,7 @@ More links: ...@@ -25,7 +25,7 @@ More links:
## What is Usage Ping? ## What is Usage Ping?
- GitLab sends a weekly payload containing usage data to GitLab Inc. Usage Ping provides high-level data to help our product, support, and sales teams. It does not send any project names, usernames, or any other specific data. The information from the usage ping is not anonymous, it is linked to the hostname of the instance. Sending usage ping is optional, and any instance can disable analytics. - GitLab sends a weekly payload containing usage data to GitLab Inc. Usage Ping provides high-level data to help our product, support, and sales teams. It does not send any project names, usernames, or any other specific data. The information from the usage ping is not anonymous, it is linked to the hostname of the instance. Sending usage ping is optional, and any instance can disable analytics.
- The usage data is primarily composed of row counts for different tables in the instances database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features in the product. In addition to counts, other facts - The usage data is primarily composed of row counts for different tables in the instance's database. By comparing these counts month over month (or week over week), we can get a rough sense for how an instance is using the different features in the product. In addition to counts, other facts
that help us classify and understand GitLab installations are collected. that help us classify and understand GitLab installations are collected.
- Usage ping is important to GitLab as we use it to calculate our Stage Monthly Active Users (SMAU) which helps us measure the success of our stages and features. - Usage ping is important to GitLab as we use it to calculate our Stage Monthly Active Users (SMAU) which helps us measure the success of our stages and features.
- While usage ping is enabled, GitLab gathers data from the other instances and can show usage statistics of your instance to your users. - While usage ping is enabled, GitLab gathers data from the other instances and can show usage statistics of your instance to your users.
...@@ -33,8 +33,8 @@ More links: ...@@ -33,8 +33,8 @@ More links:
### Why should we enable Usage Ping? ### Why should we enable Usage Ping?
- The main purpose of Usage Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions. - The main purpose of Usage Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions.
- As a benefit of having the usage ping active, GitLab lets you analyze the users activities over time of your GitLab installation. - As a benefit of having the usage ping active, GitLab lets you analyze the users' activities over time of your GitLab installation.
- As a benefit of having the usage ping active, GitLab provides you with The DevOps Report,which gives you an overview of your entire instances adoption of Concurrent DevOps from planning to monitoring. - As a benefit of having the usage ping active, GitLab provides you with The DevOps Report,which gives you an overview of your entire instance's adoption of Concurrent DevOps from planning to monitoring.
- You get better, more proactive support. (assuming that our TAMs and support organization used the data to deliver more value) - You get better, more proactive support. (assuming that our TAMs and support organization used the data to deliver more value)
- You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization? - You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization?
- You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes. - You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
...@@ -827,7 +827,7 @@ pry(main)> Gitlab::UsageData.count(User.active) ...@@ -827,7 +827,7 @@ pry(main)> Gitlab::UsageData.count(User.active)
Paste the SQL query into `#database-lab` to see how the query performs at scale. Paste the SQL query into `#database-lab` to see how the query performs at scale.
- `#database-lab` is a Slack channel which uses a production-sized environment to test your queries. - `#database-lab` is a Slack channel which uses a production-sized environment to test your queries.
- GitLab.coms production database has a 15 second timeout. - GitLab.com's production database has a 15 second timeout.
- Any single query must stay below [1 second execution time](../query_performance.md#timing-guidelines-for-queries) with cold caches. - Any single query must stay below [1 second execution time](../query_performance.md#timing-guidelines-for-queries) with cold caches.
- Add a specialized index on columns involved to reduce the execution time. - Add a specialized index on columns involved to reduce the execution time.
......
...@@ -33,9 +33,9 @@ The list below is not exhaustive, but contains many of the most commonly used co ...@@ -33,9 +33,9 @@ The list below is not exhaustive, but contains many of the most commonly used co
|--------------------------------|---------------------------------------------| |--------------------------------|---------------------------------------------|
| `cd NAME-OF-DIRECTORY` | Go into a directory to work in it | | `cd NAME-OF-DIRECTORY` | Go into a directory to work in it |
| `cd ..` | Go back one directory | | `cd ..` | Go back one directory |
| `ls` | List whats in the current directory | | `ls` | List what's in the current directory |
| `ls a*` | List whats in the current directory that starts with `a` | | `ls a*` | List what's in the current directory that starts with `a` |
| `ls *.md` | List whats in the current directory that ends with `.md` | | `ls *.md` | List what's in the current directory that ends with `.md` |
| `mkdir NAME-OF-YOUR-DIRECTORY` | Create a new directory | | `mkdir NAME-OF-YOUR-DIRECTORY` | Create a new directory |
| `cat README.md` | Display the contents of a [text file you created previously](#create-a-text-file-in-the-current-directory) | | `cat README.md` | Display the contents of a [text file you created previously](#create-a-text-file-in-the-current-directory) |
| `pwd` | Show the current directory | | `pwd` | Show the current directory |
......
...@@ -13,7 +13,7 @@ handle everything from small to very large projects with speed and efficiency. G ...@@ -13,7 +13,7 @@ handle everything from small to very large projects with speed and efficiency. G
on top of Git. on top of Git.
While GitLab has a powerful user interface from which you can do a great amount of Git operations While GitLab has a powerful user interface from which you can do a great amount of Git operations
directly in the browser, youll eventually need to use Git through the command line for advanced directly in the browser, you'll eventually need to use Git through the command line for advanced
tasks. tasks.
For example, if you need to fix complex merge conflicts, rebase branches, For example, if you need to fix complex merge conflicts, rebase branches,
...@@ -27,7 +27,7 @@ can download the GitLab [Git Cheat Sheet](https://about.gitlab.com/images/press/ ...@@ -27,7 +27,7 @@ can download the GitLab [Git Cheat Sheet](https://about.gitlab.com/images/press/
> For more information about the advantages of working with Git and GitLab: > For more information about the advantages of working with Git and GitLab:
> >
> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Watch the [GitLab Source Code Management Walkthrough](https://www.youtube.com/watch?v=wTQ3aXJswtM) video. > - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Watch the [GitLab Source Code Management Walkthrough](https://www.youtube.com/watch?v=wTQ3aXJswtM) video.
> - Learn how GitLab became the backbone of [Worldline](https://about.gitlab.com/customers/worldline/)s development environment. > - Learn how GitLab became the backbone of [Worldline](https://about.gitlab.com/customers/worldline/)'s development environment.
NOTE: NOTE:
To help you visualize what you're doing locally, there are To help you visualize what you're doing locally, there are
......
...@@ -413,7 +413,7 @@ If you do not want to maintain bastion hosts, you can set up [AWS Systems Manage ...@@ -413,7 +413,7 @@ If you do not want to maintain bastion hosts, you can set up [AWS Systems Manage
1. Leave everything else as default and click **Add Storage**. 1. Leave everything else as default and click **Add Storage**.
1. For storage, we'll leave everything as default and only add an 8GB root volume. We won't store anything on this instance. 1. For storage, we'll leave everything as default and only add an 8GB root volume. We won't store anything on this instance.
1. Click **Add Tags** and on the next screen click **Add Tag**. 1. Click **Add Tags** and on the next screen click **Add Tag**.
1. Well only set `Key: Name` and `Value: Bastion Host A`. 1. We'll only set `Key: Name` and `Value: Bastion Host A`.
1. Click **Configure Security Group**. 1. Click **Configure Security Group**.
1. Select **Create a new security group**, enter a **Security group name** (we'll use `bastion-sec-group`), and add a description. 1. Select **Create a new security group**, enter a **Security group name** (we'll use `bastion-sec-group`), and add a description.
1. We'll enable SSH access from anywhere (`0.0.0.0/0`). If you want stricter security, specify a single IP address or an IP address range in CIDR notation. 1. We'll enable SSH access from anywhere (`0.0.0.0/0`). If you want stricter security, specify a single IP address or an IP address range in CIDR notation.
...@@ -432,7 +432,7 @@ Confirm that you can SSH into the instance: ...@@ -432,7 +432,7 @@ Confirm that you can SSH into the instance:
1. Create an EC2 instance following the same steps as above with the following changes: 1. Create an EC2 instance following the same steps as above with the following changes:
1. For the **Subnet**, select the second public subnet we created earlier (`gitlab-public-10.0.2.0`). 1. For the **Subnet**, select the second public subnet we created earlier (`gitlab-public-10.0.2.0`).
1. Under the **Add Tags** section, well set `Key: Name` and `Value: Bastion Host B` so that we can easily identify our two instances. 1. Under the **Add Tags** section, we'll set `Key: Name` and `Value: Bastion Host B` so that we can easily identify our two instances.
1. For the security group, select the existing `bastion-sec-group` we created above. 1. For the security group, select the existing `bastion-sec-group` we created above.
### Use SSH Agent Forwarding ### Use SSH Agent Forwarding
...@@ -456,10 +456,10 @@ From the EC2 dashboard: ...@@ -456,10 +456,10 @@ From the EC2 dashboard:
1. In the **Subnet** dropdown, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier. 1. In the **Subnet** dropdown, select `gitlab-private-10.0.1.0` from the list of subnets we created earlier.
1. Double check that **Auto-assign Public IP** is set to `Use subnet setting (Disable)`. 1. Double check that **Auto-assign Public IP** is set to `Use subnet setting (Disable)`.
1. Click **Add Storage**. 1. Click **Add Storage**.
1. The root volume is 8GiB by default and should be enough given that we wont store any data there. 1. The root volume is 8GiB by default and should be enough given that we won't store any data there.
1. Click **Add Tags** and add any tags you may need. In our case, we'll only set `Key: Name` and `Value: GitLab`. 1. Click **Add Tags** and add any tags you may need. In our case, we'll only set `Key: Name` and `Value: GitLab`.
1. Click **Configure Security Group**. Check **Select an existing security group** and select the `gitlab-loadbalancer-sec-group` we created earlier. 1. Click **Configure Security Group**. Check **Select an existing security group** and select the `gitlab-loadbalancer-sec-group` we created earlier.
1. Click **Review and launch** followed by **Launch** if youre happy with your settings. 1. Click **Review and launch** followed by **Launch** if you're happy with your settings.
1. Finally, acknowledge that you have access to the selected private key file or create a new one. Click **Launch Instances**. 1. Finally, acknowledge that you have access to the selected private key file or create a new one. Click **Launch Instances**.
### Add custom configuration ### Add custom configuration
...@@ -683,7 +683,7 @@ From the EC2 dashboard: ...@@ -683,7 +683,7 @@ From the EC2 dashboard:
1. **Do not** check **Request Spot Instance**. 1. **Do not** check **Request Spot Instance**.
1. From the **IAM Role** dropdown, pick the `GitLabAdmin` instance role we [created earlier](#create-an-iam-ec2-instance-role-and-profile). 1. From the **IAM Role** dropdown, pick the `GitLabAdmin` instance role we [created earlier](#create-an-iam-ec2-instance-role-and-profile).
1. Leave the rest as defaults and click **Add Storage**. 1. Leave the rest as defaults and click **Add Storage**.
1. The root volume is 8GiB by default and should be enough given that we wont store any data there. Click **Configure Security Group**. 1. The root volume is 8GiB by default and should be enough given that we won't store any data there. Click **Configure Security Group**.
1. Check **Select and existing security group** and select the `gitlab-loadbalancer-sec-group` we created earlier. 1. Check **Select and existing security group** and select the `gitlab-loadbalancer-sec-group` we created earlier.
1. Click **Review**, review your changes, and click **Create launch configuration**. 1. Click **Review**, review your changes, and click **Create launch configuration**.
1. Acknowledge that you have access to the private key or create a new one. Click **Create launch configuration**. 1. Acknowledge that you have access to the private key or create a new one. Click **Create launch configuration**.
......
...@@ -231,8 +231,8 @@ The following Elasticsearch settings are available: ...@@ -231,8 +231,8 @@ The following Elasticsearch settings are available:
| `AWS Secret Access Key` | The AWS secret access key. | | `AWS Secret Access Key` | The AWS secret access key. |
| `Maximum file size indexed` | See [the explanation in instance limits.](../administration/instance_limits.md#maximum-file-size-indexed). | | `Maximum file size indexed` | See [the explanation in instance limits.](../administration/instance_limits.md#maximum-file-size-indexed). |
| `Maximum field length` | See [the explanation in instance limits.](../administration/instance_limits.md#maximum-field-length). | | `Maximum field length` | See [the explanation in instance limits.](../administration/instance_limits.md#maximum-field-length). |
| `Maximum bulk request size (MiB)` | The Maximum Bulk Request size is used by the GitLab Golang-based indexer processes and indicates how much data it ought to collect (and store in memory) in a given indexing process before submitting the payload to Elasticsearchs Bulk API. This setting should be used with the Bulk request concurrency setting (see below) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running the GitLab Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. | | `Maximum bulk request size (MiB)` | The Maximum Bulk Request size is used by the GitLab Golang-based indexer processes and indicates how much data it ought to collect (and store in memory) in a given indexing process before submitting the payload to Elasticsearch's Bulk API. This setting should be used with the Bulk request concurrency setting (see below) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running the GitLab Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. |
| `Bulk request concurrency` | The Bulk request concurrency indicates how many of the GitLab Golang-based indexer processes (or threads) can run in parallel to collect data to subsequently submit to Elasticsearchs Bulk API. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. This setting should be used together with the Maximum bulk request size setting (see above) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running the GitLab Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. | | `Bulk request concurrency` | The Bulk request concurrency indicates how many of the GitLab Golang-based indexer processes (or threads) can run in parallel to collect data to subsequently submit to Elasticsearch's Bulk API. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. This setting should be used together with the Maximum bulk request size setting (see above) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running the GitLab Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. |
| `Client request timeout` | Elasticsearch HTTP client request timeout value in seconds. `0` means using the system default timeout value, which depends on the libraries that GitLab application is built upon. | | `Client request timeout` | Elasticsearch HTTP client request timeout value in seconds. `0` means using the system default timeout value, which depends on the libraries that GitLab application is built upon. |
WARNING: WARNING:
......
...@@ -87,7 +87,7 @@ authorize the connection to GitLab. ...@@ -87,7 +87,7 @@ authorize the connection to GitLab.
1. On the Jenkins server, go to **Manage Jenkins > Manage Plugins**. 1. On the Jenkins server, go to **Manage Jenkins > Manage Plugins**.
1. Install the [Jenkins GitLab Plugin](https://wiki.jenkins.io/display/JENKINS/GitLab+Plugin). 1. Install the [Jenkins GitLab Plugin](https://wiki.jenkins.io/display/JENKINS/GitLab+Plugin).
1. Go to **Manage Jenkins > Configure System**. 1. Go to **Manage Jenkins > Configure System**.
1. In the **GitLab** section, check the **Enable authentication for ‘/project’ end-point** checkbox. 1. In the **GitLab** section, check the **Enable authentication for '/project' end-point** checkbox.
1. Click **Add**, then choose **Jenkins Credential Provider**. 1. Click **Add**, then choose **Jenkins Credential Provider**.
1. Choose **GitLab API token** as the token type. 1. Choose **GitLab API token** as the token type.
1. Enter the GitLab personal access token's value in the **API Token** field and click **Add**. 1. Enter the GitLab personal access token's value in the **API Token** field and click **Add**.
......
...@@ -27,9 +27,9 @@ least Maintainer [permissions](../user/permissions.md) to enable the Sentry inte ...@@ -27,9 +27,9 @@ least Maintainer [permissions](../user/permissions.md) to enable the Sentry inte
1. [Create](https://docs.sentry.io/product/sentry-basics/guides/integrate-frontend/create-new-project/) a new Sentry project. For each GitLab project that you want to integrate, we recommend that you create a new Sentry project. 1. [Create](https://docs.sentry.io/product/sentry-basics/guides/integrate-frontend/create-new-project/) a new Sentry project. For each GitLab project that you want to integrate, we recommend that you create a new Sentry project.
1. [Find or generate](https://docs.sentry.io/api/auth/) a Sentry auth token for your Sentry project. 1. [Find or generate](https://docs.sentry.io/api/auth/) a Sentry auth token for your Sentry project.
Make sure to give the token at least the following scopes: `event:read` and `project:read`. Make sure to give the token at least the following scopes: `event:read` and `project:read`.
1. In GitLab, navigate to your projects **Operations > Error Tracking** page, and 1. In GitLab, navigate to your project's **Operations > Error Tracking** page, and
click **Enable Error Tracking**. click **Enable Error Tracking**.
1. Navigate to your projects **Settings > Operations**. In the **Error Tracking** section, 1. Navigate to your project's **Settings > Operations**. In the **Error Tracking** section,
ensure the **Active** checkbox is set. ensure the **Active** checkbox is set.
1. In the **Sentry API URL** field, enter your Sentry hostname. For example, enter `https://sentry.example.com` if this is the address at which your Sentry instance is available. For the SaaS version of Sentry, the hostname is `https://sentry.io`. 1. In the **Sentry API URL** field, enter your Sentry hostname. For example, enter `https://sentry.example.com` if this is the address at which your Sentry instance is available. For the SaaS version of Sentry, the hostname is `https://sentry.io`.
1. In the **Auth Token** field, enter the token you previously generated. 1. In the **Auth Token** field, enter the token you previously generated.
......
...@@ -22,7 +22,7 @@ they inherit permissions from the user who created them. ...@@ -22,7 +22,7 @@ they inherit permissions from the user who created them.
## OAuth2 tokens ## OAuth2 tokens
GitLab can serve as an [OAuth2 provider](../api/oauth2.md) to allow other services to access the GitLab API on a users behalf. GitLab can serve as an [OAuth2 provider](../api/oauth2.md) to allow other services to access the GitLab API on a user's behalf.
You can limit the scope and lifetime of your OAuth2 tokens. You can limit the scope and lifetime of your OAuth2 tokens.
...@@ -57,7 +57,7 @@ Deploy tokens can be managed by project maintainers and owners. ...@@ -57,7 +57,7 @@ Deploy tokens can be managed by project maintainers and owners.
[Deploy keys](../user/project/deploy_keys/index.md) allow read-only or read-write access to your repositories by importing an SSH public key into your GitLab instance. Deploy keys cannot be used with the GitLab API or the registry. [Deploy keys](../user/project/deploy_keys/index.md) allow read-only or read-write access to your repositories by importing an SSH public key into your GitLab instance. Deploy keys cannot be used with the GitLab API or the registry.
This is useful, for example, for cloning repositories to your Continuous Integration (CI) server. By using deploy keys, you dont have to set up a fake user account. This is useful, for example, for cloning repositories to your Continuous Integration (CI) server. By using deploy keys, you don't have to set up a fake user account.
Project maintainers and owners can add or enable a deploy key for a project repository Project maintainers and owners can add or enable a deploy key for a project repository
...@@ -65,7 +65,7 @@ Project maintainers and owners can add or enable a deploy key for a project repo ...@@ -65,7 +65,7 @@ Project maintainers and owners can add or enable a deploy key for a project repo
Runner registration tokens are used to [register](https://docs.gitlab.com/runner/register/) a [runner](https://docs.gitlab.com/runner/) with GitLab. Group or project owners or instance admins can obtain them through the GitLab user interface. The registration token is limited to runner registration and has no further scope. Runner registration tokens are used to [register](https://docs.gitlab.com/runner/register/) a [runner](https://docs.gitlab.com/runner/) with GitLab. Group or project owners or instance admins can obtain them through the GitLab user interface. The registration token is limited to runner registration and has no further scope.
You can use the runner registration token to add runners that execute jobs in a project or group. The runner has access to the projects code, so be careful when assigning project and group-level permissions. You can use the runner registration token to add runners that execute jobs in a project or group. The runner has access to the project's code, so be careful when assigning project and group-level permissions.
## Runner authentication tokens (also called runner tokens) ## Runner authentication tokens (also called runner tokens)
......
...@@ -190,7 +190,7 @@ We recommend following these steps during renewal: ...@@ -190,7 +190,7 @@ We recommend following these steps during renewal:
NOTE: NOTE:
If you need to change your [GitLab tier](https://about.gitlab.com/pricing/), contact our sales team via `renewals@gitlab.com` for assistance as this can't be done in the Customers Portal. If you need to change your [GitLab tier](https://about.gitlab.com/pricing/), contact our sales team via `renewals@gitlab.com` for assistance as this can't be done in the Customers Portal.
1. In the first box, enter the total number of user licenses youll need for the upcoming year. Be sure this number is at least **equal to, or greater than** the number of billable users in the system at the time of performing the renewal. 1. In the first box, enter the total number of user licenses you'll need for the upcoming year. Be sure this number is at least **equal to, or greater than** the number of billable users in the system at the time of performing the renewal.
1. Enter the number of [users over license](#users-over-license) in the second box for the user overage incurred in your previous subscription term. 1. Enter the number of [users over license](#users-over-license) in the second box for the user overage incurred in your previous subscription term.
1. Review your renewal details and complete the payment process. 1. Review your renewal details and complete the payment process.
1. A license for the renewal term is available for download on the [Manage Purchases](https://customers.gitlab.com/subscriptions) page on the relevant subscription card. Select **Copy license to clipboard** or **Download license** to get a copy. 1. A license for the renewal term is available for download on the [Manage Purchases](https://customers.gitlab.com/subscriptions) page on the relevant subscription card. Select **Copy license to clipboard** or **Download license** to get a copy.
......
...@@ -91,7 +91,7 @@ To make full use of Auto DevOps with Kubernetes, you need: ...@@ -91,7 +91,7 @@ To make full use of Auto DevOps with Kubernetes, you need:
To enable HTTPS endpoints for your application, you must install cert-manager, To enable HTTPS endpoints for your application, you must install cert-manager,
a native Kubernetes certificate management controller that helps with issuing a native Kubernetes certificate management controller that helps with issuing
certificates. Installing cert-manager on your cluster issues a certificates. Installing cert-manager on your cluster issues a
[Lets Encrypt](https://letsencrypt.org/) certificate and ensures the [Let's Encrypt](https://letsencrypt.org/) certificate and ensures the
certificates are valid and up-to-date. If you've configured the GitLab integration certificates are valid and up-to-date. If you've configured the GitLab integration
with Kubernetes, you can deploy it to your cluster by installing the with Kubernetes, you can deploy it to your cluster by installing the
[GitLab-managed app for cert-manager](../../user/clusters/applications.md#cert-manager). [GitLab-managed app for cert-manager](../../user/clusters/applications.md#cert-manager).
......
...@@ -39,7 +39,7 @@ Found errors in your .gitlab-ci.yml: ...@@ -39,7 +39,7 @@ Found errors in your .gitlab-ci.yml:
jobs:test config key may not be used with `rules`: only jobs:test config key may not be used with `rules`: only
``` ```
This error appears when the included jobs rules configuration has been overridden with the `only` or `except` syntax. This error appears when the included job's rules configuration has been overridden with the `only` or `except` syntax.
To fix this issue, you must either: To fix this issue, you must either:
- Transition your `only/except` syntax to rules. - Transition your `only/except` syntax to rules.
......
...@@ -28,7 +28,7 @@ git checkout master ...@@ -28,7 +28,7 @@ git checkout master
git tag my_lightweight_tag git tag my_lightweight_tag
# Annotated tag # Annotated tag
git tag -a v1.0 -m ‘Version 1.0’ git tag -a v1.0 -m 'Version 1.0'
# Show list of the existing tags # Show list of the existing tags
git tag git tag
......
...@@ -55,7 +55,7 @@ Configuring both the client and the server is unnecessary. ...@@ -55,7 +55,7 @@ Configuring both the client and the server is unnecessary.
**To configure SSH on the client side**: **To configure SSH on the client side**:
- On UNIX, edit `~/.ssh/config` (create the file if it doesnt exist) and - On UNIX, edit `~/.ssh/config` (create the file if it doesn't exist) and
add or edit: add or edit:
```plaintext ```plaintext
......
...@@ -175,7 +175,7 @@ GIT_TRACE_PACKET=1 GIT_TRACE=2 GIT_CURL_VERBOSE=1 git clone <url> ...@@ -175,7 +175,7 @@ GIT_TRACE_PACKET=1 GIT_TRACE=2 GIT_CURL_VERBOSE=1 git clone <url>
Git includes a complete set of [traces for debugging Git commands](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_debugging), for example: Git includes a complete set of [traces for debugging Git commands](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_debugging), for example:
- `GIT_TRACE_PERFORMANCE=1`: enables tracing of performance data, showing how long each particular `git` invocation takes. - `GIT_TRACE_PERFORMANCE=1`: enables tracing of performance data, showing how long each particular `git` invocation takes.
- `GIT_TRACE_SETUP=1`: enables tracing of what `git` is discovering about the repository and environment its interacting with. - `GIT_TRACE_SETUP=1`: enables tracing of what `git` is discovering about the repository and environment it's interacting with.
- `GIT_TRACE_PACKET=1`: enables packet-level tracing for network operations. - `GIT_TRACE_PACKET=1`: enables packet-level tracing for network operations.
## Rebasing ## Rebasing
......
...@@ -187,7 +187,7 @@ git push origin squash_some_bugs ...@@ -187,7 +187,7 @@ git push origin squash_some_bugs
## Merge requests ## Merge requests
- When you want feedback create a merge request. - When you want feedback create a merge request.
- Target is the ‘default’ branch (usually master). - Target is the 'default' branch (usually master).
- Assign or mention the person you would like to review. - Assign or mention the person you would like to review.
- Add `[Draft]` to the title if it's a work in progress. - Add `[Draft]` to the title if it's a work in progress.
- When accepting, always delete the branch. - When accepting, always delete the branch.
...@@ -260,7 +260,7 @@ git checkout master ...@@ -260,7 +260,7 @@ git checkout master
git tag my_lightweight_tag git tag my_lightweight_tag
# Annotated tag # Annotated tag
git tag -a v1.0 -m ‘Version 1.0’ git tag -a v1.0 -m 'Version 1.0'
git tag git tag
git push origin --tags git push origin --tags
......
...@@ -374,7 +374,7 @@ comment - content which is not included in the output document ...@@ -374,7 +374,7 @@ comment - content which is not included in the output document
### Colors ### Colors
Its possible to have color written in `HEX`, `RGB`, or `HSL` format rendered with a color indicator. It's possible to have color written in `HEX`, `RGB`, or `HSL` format rendered with a color indicator.
Supported formats (named colors are not supported): Supported formats (named colors are not supported):
- HEX: `` `#RGB[A]` `` or `` `#RRGGBB[AA]` `` - HEX: `` `#RGB[A]` `` or `` `#RRGGBB[AA]` ``
......
...@@ -86,7 +86,7 @@ your cluster, which can cause deployment jobs to fail. ...@@ -86,7 +86,7 @@ your cluster, which can cause deployment jobs to fail.
To clear the cache: To clear the cache:
1. Navigate to your groups **Kubernetes** page, 1. Navigate to your group's **Kubernetes** page,
and select your cluster. and select your cluster.
1. Expand the **Advanced settings** section. 1. Expand the **Advanced settings** section.
1. Click **Clear cluster cache**. 1. Click **Clear cluster cache**.
......
...@@ -481,7 +481,7 @@ Administrators and group owners are able to access the group regardless of the I ...@@ -481,7 +481,7 @@ Administrators and group owners are able to access the group regardless of the I
To restrict group access by IP address: To restrict group access by IP address:
1. Go to the groups **Settings > General** page. 1. Go to the group's **Settings > General** page.
1. Expand the **Permissions, LFS, 2FA** section. 1. Expand the **Permissions, LFS, 2FA** section.
1. In the **Allow access to the following IP addresses** field, enter IP address ranges in CIDR notation. 1. In the **Allow access to the following IP addresses** field, enter IP address ranges in CIDR notation.
1. Select **Save changes**. 1. Select **Save changes**.
......
...@@ -117,7 +117,7 @@ Follow the same process to create any subsequent groups. ...@@ -117,7 +117,7 @@ Follow the same process to create any subsequent groups.
## Membership ## Membership
When you add a member to a group, that member is also added to all subgroups. When you add a member to a group, that member is also added to all subgroups.
Permission level is inherited from the groups parent. This model allows access to Permission level is inherited from the group's parent. This model allows access to
subgroups if you have membership in one of its parents. subgroups if you have membership in one of its parents.
Jobs for pipelines in subgroups can use [runners](../../../ci/runners/README.md) registered to the parent group(s). Jobs for pipelines in subgroups can use [runners](../../../ci/runners/README.md) registered to the parent group(s).
......
...@@ -16,7 +16,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w ...@@ -16,7 +16,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING: WARNING:
This feature might not be available to you. Check the **version history** note above for details. This feature might not be available to you. Check the **version history** note above for details.
Publish generic files, like release binaries, in your projects Package Registry. Then, install the packages whenever you need to use them as a dependency. Publish generic files, like release binaries, in your project's Package Registry. Then, install the packages whenever you need to use them as a dependency.
## Authenticate to the Package Registry ## Authenticate to the Package Registry
......
...@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w ...@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5811) in GitLab Premium 11.3. > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5811) in GitLab Premium 11.3.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3. > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
Publish [Maven](https://maven.apache.org) artifacts in your projects Package Registry. Publish [Maven](https://maven.apache.org) artifacts in your project's Package Registry.
Then, install the packages whenever you need to use them as a dependency. Then, install the packages whenever you need to use them as a dependency.
## Build a Maven package ## Build a Maven package
......
...@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w ...@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20050) in GitLab Premium 12.8. > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20050) in GitLab Premium 12.8.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3. > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
Publish NuGet packages in your projects Package Registry. Then, install the Publish NuGet packages in your project's Package Registry. Then, install the
packages whenever you need to use them as a dependency. packages whenever you need to use them as a dependency.
The Package Registry works with: The Package Registry works with:
...@@ -314,7 +314,7 @@ dotnet nuget push MyPackage.1.0.0.nupkg --source gitlab ...@@ -314,7 +314,7 @@ dotnet nuget push MyPackage.1.0.0.nupkg --source gitlab
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36424) in GitLab 13.3. > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36424) in GitLab 13.3.
If youre using NuGet with GitLab CI/CD, a CI job token can be used instead of a If you're using NuGet with GitLab CI/CD, a CI job token can be used instead of a
personal access token or deploy token. The token inherits the permissions of the personal access token or deploy token. The token inherits the permissions of the
user that generates the pipeline. user that generates the pipeline.
......
...@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w ...@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208747) in GitLab Premium 12.10. > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208747) in GitLab Premium 12.10.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3. > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
Publish PyPI packages in your projects Package Registry. Then install the Publish PyPI packages in your project's Package Registry. Then install the
packages whenever you need to use them as a dependency. packages whenever you need to use them as a dependency.
The Package Registry works with: The Package Registry works with:
......
...@@ -51,7 +51,7 @@ See the epic for: ...@@ -51,7 +51,7 @@ See the epic for:
- A list of known issues. - A list of known issues.
- Our planned direction and next steps. - Our planned direction and next steps.
If you find an issue that isnt listed, please leave a comment on the epic or create a If you find an issue that isn't listed, please leave a comment on the epic or create a
new issue. new issue.
Dark mode is available as a navigation theme, for MVC and compatibility reasons. In Dark mode is available as a navigation theme, for MVC and compatibility reasons. In
...@@ -124,7 +124,7 @@ You can include the following options for your default dashboard view: ...@@ -124,7 +124,7 @@ You can include the following options for your default dashboard view:
### Group overview content ### Group overview content
The **Group overview content** dropdown allows you to choose what information is The **Group overview content** dropdown allows you to choose what information is
displayed on a groups home page. displayed on a group's home page.
You can choose between 2 options: You can choose between 2 options:
...@@ -134,7 +134,7 @@ You can choose between 2 options: ...@@ -134,7 +134,7 @@ You can choose between 2 options:
### Project overview content ### Project overview content
The **Project overview content** setting allows you to choose what content you want to The **Project overview content** setting allows you to choose what content you want to
see on a projects home page. see on a project's home page.
### Tab width ### Tab width
......
...@@ -189,7 +189,7 @@ your cluster. This can cause deployment jobs to fail. ...@@ -189,7 +189,7 @@ your cluster. This can cause deployment jobs to fail.
To clear the cache: To clear the cache:
1. Navigate to your projects **Operations > Kubernetes** page, and select your cluster. 1. Navigate to your project's **Operations > Kubernetes** page, and select your cluster.
1. Expand the **Advanced settings** section. 1. Expand the **Advanced settings** section.
1. Click **Clear cluster cache**. 1. Click **Clear cluster cache**.
......
...@@ -26,7 +26,7 @@ pre-written code blocks or database queries against a given environment. ...@@ -26,7 +26,7 @@ pre-written code blocks or database queries against a given environment.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45912) in GitLab 11.4. > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45912) in GitLab 11.4.
The JupyterHub app offered via the GitLab Kubernetes integration now ships The JupyterHub app offered via the GitLab Kubernetes integration now ships
with Nurtchs Rubix library, providing a simple way to create DevOps with Nurtch's Rubix library, providing a simple way to create DevOps
runbooks. A sample runbook is provided, showcasing common operations. While runbooks. A sample runbook is provided, showcasing common operations. While
Rubix makes it simple to create common Kubernetes and AWS workflows, you can Rubix makes it simple to create common Kubernetes and AWS workflows, you can
also create them manually without Rubix. also create them manually without Rubix.
......
...@@ -403,7 +403,7 @@ production: ...@@ -403,7 +403,7 @@ production:
environment: production environment: production
``` ```
Lets examine the configuration file more closely: Let's examine the configuration file more closely:
- `image` specifies the Docker image to use for this build. This is the latest Python - `image` specifies the Docker image to use for this build. This is the latest Python
image since the sample application is written in Python. image since the sample application is written in Python.
......
...@@ -562,7 +562,7 @@ over `https`, you must manually obtain and install TLS certificates. ...@@ -562,7 +562,7 @@ over `https`, you must manually obtain and install TLS certificates.
The simplest way to accomplish this is to use Certbot to The simplest way to accomplish this is to use Certbot to
[manually obtain Let's Encrypt certificates](https://knative.dev/docs/serving/using-a-tls-cert/#using-certbot-to-manually-obtain-let-s-encrypt-certificates). [manually obtain Let's Encrypt certificates](https://knative.dev/docs/serving/using-a-tls-cert/#using-certbot-to-manually-obtain-let-s-encrypt-certificates).
Certbot is a free, open source software tool for automatically using Lets Encrypt Certbot is a free, open source software tool for automatically using Let's Encrypt
certificates on manually-administered websites to enable HTTPS. certificates on manually-administered websites to enable HTTPS.
The following instructions relate to installing and running Certbot on a Linux The following instructions relate to installing and running Certbot on a Linux
......
...@@ -117,7 +117,7 @@ must **lock the file** before [editing it](#edit-lockable-files). ...@@ -117,7 +117,7 @@ must **lock the file** before [editing it](#edit-lockable-files).
### Lock files ### Lock files
By locking a file, you verify that no one else is editing it, and By locking a file, you verify that no one else is editing it, and
prevent anyone else from editing the file until youre done. On the other prevent anyone else from editing the file until you're done. On the other
hand, when you unlock a file, you communicate that you've finished editing hand, when you unlock a file, you communicate that you've finished editing
and allow other people to edit it. and allow other people to edit it.
......
...@@ -47,9 +47,9 @@ time. ...@@ -47,9 +47,9 @@ time.
| Capability | Jira integration | Jira Development Panel integration | | Capability | Jira integration | Jira Development Panel integration |
|:----------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------| |:----------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|
| Mention of Jira issue ID in GitLab is automatically linked to that issue | Yes | No | | Mention of Jira issue ID in GitLab is automatically linked to that issue | Yes | No |
| Mention of Jira issue ID in GitLab issue/MR is reflected in the Jira issue | Yes, as a Jira comment with the GitLab issue/MR title and a link back to it. Its first mention also adds the GitLab page to the Jira issue under “Web links”. | Yes, in the issues Development panel | | Mention of Jira issue ID in GitLab issue/MR is reflected in the Jira issue | Yes, as a Jira comment with the GitLab issue/MR title and a link back to it. Its first mention also adds the GitLab page to the Jira issue under “Web links”. | Yes, in the issue's Development panel |
| Mention of Jira issue ID in GitLab commit message is reflected in the issue | Yes. The entire commit message is added to the Jira issue as a comment and under “Web links”, each with a link back to the commit in GitLab. | Yes, in the issues Development panel and optionally with a custom comment on the Jira issue using Jira Smart Commits. | | Mention of Jira issue ID in GitLab commit message is reflected in the issue | Yes. The entire commit message is added to the Jira issue as a comment and under “Web links”, each with a link back to the commit in GitLab. | Yes, in the issue's Development panel and optionally with a custom comment on the Jira issue using Jira Smart Commits. |
| Mention of Jira issue ID in GitLab branch names is reflected in Jira issue | No | Yes, in the issues Development panel | | Mention of Jira issue ID in GitLab branch names is reflected in Jira issue | No | Yes, in the issue's Development panel |
| Record Jira time tracking information against an issue | No | Yes. Time can be specified via Jira Smart Commits. | | Record Jira time tracking information against an issue | No | Yes. Time can be specified via Jira Smart Commits. |
| Transition or close a Jira issue with a Git commit or merge request | Yes. Only a single transition type, typically configured to close the issue by setting it to Done. | Yes. Transition to any state using Jira Smart Commits. | | Transition or close a Jira issue with a Git commit or merge request | Yes. Only a single transition type, typically configured to close the issue by setting it to Done. | Yes. Transition to any state using Jira Smart Commits. |
| Display a list of Jira issues | Yes **(PREMIUM)** | No | | Display a list of Jira issues | Yes **(PREMIUM)** | No |
......
...@@ -574,7 +574,7 @@ worked on by the designers. ...@@ -574,7 +574,7 @@ worked on by the designers.
Then, when they're done, all they have to do is Then, when they're done, all they have to do is
drag it to the next list, **Backend**. Then, a backend developer can drag it to the next list, **Backend**. Then, a backend developer can
eventually pick it up. When theyre done, they move it to **Done**, to close the eventually pick it up. When they're done, they move it to **Done**, to close the
issue. issue.
This process can be seen clearly when visiting an issue. With every move This process can be seen clearly when visiting an issue. With every move
......
...@@ -162,7 +162,7 @@ Scoped labels allow teams to use the label feature to annotate issues, merge req ...@@ -162,7 +162,7 @@ Scoped labels allow teams to use the label feature to annotate issues, merge req
and epics with mutually exclusive labels. This can enable more complicated workflows and epics with mutually exclusive labels. This can enable more complicated workflows
by preventing certain labels from being used together. by preventing certain labels from being used together.
A label is scoped when it uses a special double-colon (`::`) syntax in the labels A label is scoped when it uses a special double-colon (`::`) syntax in the label's
title, for example: title, for example:
![Scoped labels](img/labels_key_value_v13_5.png) ![Scoped labels](img/labels_key_value_v13_5.png)
......
...@@ -41,5 +41,5 @@ The following table shows what attributes will be present in the CSV. ...@@ -41,5 +41,5 @@ The following table shows what attributes will be present in the CSV.
## Limitations ## Limitations
- Export merge requests to CSV is not available at the Groups merge request list. - Export merge requests to CSV is not available at the Group's merge request list.
- As the merge request CSV file is sent as an email attachment, the size is limited to 15MB to ensure successful delivery across a range of email providers. If you need to minimize the size of the file, you can narrow the search before export. For example, you can set up exports of open and closed merge requests in separate files. - As the merge request CSV file is sent as an email attachment, the size is limited to 15MB to ensure successful delivery across a range of email providers. If you need to minimize the size of the file, you can narrow the search before export. For example, you can set up exports of open and closed merge requests in separate files.
...@@ -242,7 +242,7 @@ Alternatively, you can select a very specific protected branch from the **Target ...@@ -242,7 +242,7 @@ Alternatively, you can select a very specific protected branch from the **Target
![Scoped to protected branch](img/scoped_to_protected_branch_v13_10.png) ![Scoped to protected branch](img/scoped_to_protected_branch_v13_10.png)
To enable this configuration, see [Code Owners approvals for protected branches](../protected_branches.md#protected-branches-approval-by-code-owners). To enable this configuration, see [Code Owner's approvals for protected branches](../protected_branches.md#protected-branches-approval-by-code-owners).
### Adding or removing an approval ### Adding or removing an approval
......
...@@ -19,7 +19,7 @@ or link to useful information directly from merge requests: ...@@ -19,7 +19,7 @@ or link to useful information directly from merge requests:
| [Code Quality](code_quality.md) | Analyze your source code quality using the [Code Climate](https://codeclimate.com/) analyzer and show the Code Climate report right in the merge request widget area. | | [Code Quality](code_quality.md) | Analyze your source code quality using the [Code Climate](https://codeclimate.com/) analyzer and show the Code Climate report right in the merge request widget area. |
| [Display arbitrary job artifacts](../../../ci/yaml/README.md#artifactsexpose_as) | Configure CI pipelines with the `artifacts:expose_as` parameter to directly link to selected [artifacts](../../../ci/pipelines/job_artifacts.md) in merge requests. | | [Display arbitrary job artifacts](../../../ci/yaml/README.md#artifactsexpose_as) | Configure CI pipelines with the `artifacts:expose_as` parameter to directly link to selected [artifacts](../../../ci/pipelines/job_artifacts.md) in merge requests. |
| [GitLab CI/CD](../../../ci/README.md) | Build, test, and deploy your code in a per-branch basis with built-in CI/CD. | | [GitLab CI/CD](../../../ci/README.md) | Build, test, and deploy your code in a per-branch basis with built-in CI/CD. |
| [Unit test reports](../../../ci/unit_test_reports.md) | Configure your CI jobs to use Unit test reports, and let GitLab display a report on the merge request so that its easier and faster to identify the failure without having to check the entire job log. | | [Unit test reports](../../../ci/unit_test_reports.md) | Configure your CI jobs to use Unit test reports, and let GitLab display a report on the merge request so that it's easier and faster to identify the failure without having to check the entire job log. |
| [License Compliance](../../compliance/license_compliance/index.md) **(ULTIMATE)** | Manage the licenses of your dependencies. | | [License Compliance](../../compliance/license_compliance/index.md) **(ULTIMATE)** | Manage the licenses of your dependencies. |
| [Metrics Reports](../../../ci/metrics_reports.md) **(PREMIUM)** | Display the Metrics Report on the merge request so that it's fast and easy to identify changes to important metrics. | | [Metrics Reports](../../../ci/metrics_reports.md) **(PREMIUM)** | Display the Metrics Report on the merge request so that it's fast and easy to identify changes to important metrics. |
| [Multi-Project pipelines](../../../ci/multi_project_pipelines.md) **(PREMIUM)** | When you set up GitLab CI/CD across multiple projects, you can visualize the entire pipeline, including all cross-project interdependencies. | | [Multi-Project pipelines](../../../ci/multi_project_pipelines.md) **(PREMIUM)** | When you set up GitLab CI/CD across multiple projects, you can visualize the entire pipeline, including all cross-project interdependencies. |
......
...@@ -36,7 +36,7 @@ with financial transactions. ...@@ -36,7 +36,7 @@ with financial transactions.
Now we have a different picture. [According to Josh Aas](https://letsencrypt.org/2015/10/29/phishing-and-malware.html), Executive Director at [ISRG](https://en.wikipedia.org/wiki/Internet_Security_Research_Group): Now we have a different picture. [According to Josh Aas](https://letsencrypt.org/2015/10/29/phishing-and-malware.html), Executive Director at [ISRG](https://en.wikipedia.org/wiki/Internet_Security_Research_Group):
<!-- vale gitlab.rulename = YES --> <!-- vale gitlab.rulename = YES -->
> _We’ve since come to realize that HTTPS is important for almost all websites. It’s important for any website that allows people to log in with a password, any website that [tracks its users](https://www.washingtonpost.com/news/the-switch/wp/2013/12/10/nsa-uses-google-cookies-to-pinpoint-targets-for-hacking/) in any way, any website that [doesn’t want its content altered](https://arstechnica.com/tech-policy/2014/09/why-comcasts-javascript-ad-injections-threaten-security-net-neutrality/), and for any site that offers content people might not want others to know they are consuming. We’ve also learned that any site not secured by HTTPS [can be used to attack other sites](https://krebsonsecurity.com/2015/04/dont-be-fodder-for-chinas-great-cannon/)._ > _We've since come to realize that HTTPS is important for almost all websites. It's important for any website that allows people to log in with a password, any website that [tracks its users](https://www.washingtonpost.com/news/the-switch/wp/2013/12/10/nsa-uses-google-cookies-to-pinpoint-targets-for-hacking/) in any way, any website that [doesn't want its content altered](https://arstechnica.com/tech-policy/2014/09/why-comcasts-javascript-ad-injections-threaten-security-net-neutrality/), and for any site that offers content people might not want others to know they are consuming. We've also learned that any site not secured by HTTPS [can be used to attack other sites](https://krebsonsecurity.com/2015/04/dont-be-fodder-for-chinas-great-cannon/)._
Therefore, the reason why certificates are so important is that they encrypt Therefore, the reason why certificates are so important is that they encrypt
the connection between the **client** (you, me, your visitors) the connection between the **client** (you, me, your visitors)
......
...@@ -26,4 +26,4 @@ You can deploy [Jupyter Hub as a GitLab managed app](../../../clusters/applicati ...@@ -26,4 +26,4 @@ You can deploy [Jupyter Hub as a GitLab managed app](../../../clusters/applicati
## Jupyter Git integration ## Jupyter Git integration
Find out how to [leverage JupyterLabs Git extension on your Kubernetes cluster](../../../clusters/applications.md#jupyter-git-integration). Find out how to [leverage JupyterLab's Git extension on your Kubernetes cluster](../../../clusters/applications.md#jupyter-git-integration).
...@@ -312,7 +312,7 @@ GitLab instance. ...@@ -312,7 +312,7 @@ GitLab instance.
WARNING: WARNING:
This feature might not be available to you. Check the **version history** note above for details. This feature might not be available to you. Check the **version history** note above for details.
You can search inside a Project, Group, Admin, or Users settings by entering You can search inside a Project, Group, Admin, or User's settings by entering
a search term in the search box located at the top of the page. The search results a search term in the search box located at the top of the page. The search results
appear highlighted in the sections that match the search term. appear highlighted in the sections that match the search term.
......
...@@ -8,6 +8,7 @@ module SubscriptionsHelper ...@@ -8,6 +8,7 @@ module SubscriptionsHelper
setup_for_company: (current_user.setup_for_company == true).to_s, setup_for_company: (current_user.setup_for_company == true).to_s,
full_name: current_user.name, full_name: current_user.name,
available_plans: subscription_available_plans.to_json, available_plans: subscription_available_plans.to_json,
ci_minutes_plans: ci_minutes_plans.to_json,
plan_id: params[:plan_id], plan_id: params[:plan_id],
namespace_id: params[:namespace_id], namespace_id: params[:namespace_id],
new_user: new_user?.to_s, new_user: new_user?.to_s,
...@@ -43,6 +44,26 @@ module SubscriptionsHelper ...@@ -43,6 +44,26 @@ module SubscriptionsHelper
plans_data.reject { |plan_data| plan_data[:deprecated] } plans_data.reject { |plan_data| plan_data[:deprecated] }
end end
def ci_minutes_plans
return if ::Feature.disabled?(:new_route_ci_minutes_purchase, default_enabled: :yaml)
strong_memoize(:ci_minutes_plans) do
fields = %w[
name
code
active
free
price_per_month
price_per_year
features
about_page_href
hide_deprecated_card
]
Gitlab::SubscriptionPortal::Client.plan_data("CI_1000_MINUTES_PLAN", fields)[:plans]
end
end
def group_data def group_data
current_user.manageable_groups_eligible_for_subscription.with_counts(archived: false).map do |namespace| current_user.manageable_groups_eligible_for_subscription.with_counts(archived: false).map do |namespace|
{ {
......
...@@ -6,6 +6,8 @@ module Gitlab ...@@ -6,6 +6,8 @@ module Gitlab
include SubscriptionPortal::Clients::REST include SubscriptionPortal::Clients::REST
include SubscriptionPortal::Clients::Graphql include SubscriptionPortal::Clients::Graphql
ResponseError = Class.new(StandardError)
class << self class << self
private private
......
...@@ -57,7 +57,7 @@ module Gitlab ...@@ -57,7 +57,7 @@ module Gitlab
} }
GQL GQL
response = execute_graphql_query({ query: query }).dig(:data) response = execute_graphql_query({ query: query })[:data]
if response['errors'].blank? if response['errors'].blank?
eligible = response.dig('data', 'subscription', 'eoaStarterBronzeEligible') eligible = response.dig('data', 'subscription', 'eoaStarterBronzeEligible')
...@@ -75,6 +75,31 @@ module Gitlab ...@@ -75,6 +75,31 @@ module Gitlab
end end
end end
def plan_data(plan_tags, fields)
query = <<~GQL
query($tags: [PlanTag!]) {
plans(planTags: $tags) {
deprecated
#{(fields - ['deprecated']).map { |field| "#{field}: #{field.to_s.camelize(:lower)}" }.join(" ")}
}
}
GQL
response = execute_graphql_query({ query: query, variables: { tags: plan_tags } })[:data]
if response['errors'].present?
exception = SubscriptionPortal::Client::ResponseError.new("Received an error from CustomerDot")
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(exception, query: query, response: response)
return { success: false }
end
{
success: true,
plans: response.dig('data', 'plans')
.reject { |plan| plan['deprecated'] }
}
end
private private
def execute_graphql_query(params) def execute_graphql_query(params)
......
...@@ -3,13 +3,17 @@ ...@@ -3,13 +3,17 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe 'Subscriptions Content Security Policy' do RSpec.describe 'Subscriptions Content Security Policy' do
include SubscriptionPortalHelpers
subject { response_headers['Content-Security-Policy'] } subject { response_headers['Content-Security-Policy'] }
let_it_be(:default_csp_values) { "'self' https://some-cdn.test" } let_it_be(:default_csp_values) { "'self' https://some-cdn.test" }
let_it_be(:zuora_url) { 'https://*.zuora.com' } let_it_be(:zuora_url) { 'https://*.zuora.com' }
let(:plan_tags) { 'CI_1000_MINUTES_PLAN' }
before do before do
stub_request(:get, /.*gitlab_plans.*/).to_return(status: 200, body: "{}") stub_request(:get, /.*gitlab_plans.*/).to_return(status: 200, body: "{}")
stub_plan_data_request(plan_tags)
expect_next_instance_of(SubscriptionsController) do |controller| expect_next_instance_of(SubscriptionsController) do |controller|
expect(controller).to receive(:current_content_security_policy).and_return(csp) expect(controller).to receive(:current_content_security_policy).and_return(csp)
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe SubscriptionsHelper do RSpec.describe SubscriptionsHelper do
include SubscriptionPortalHelpers
using RSpec::Parameterized::TableSyntax using RSpec::Parameterized::TableSyntax
let_it_be(:free_plan) do let_it_be(:free_plan) do
...@@ -23,12 +25,15 @@ RSpec.describe SubscriptionsHelper do ...@@ -23,12 +25,15 @@ RSpec.describe SubscriptionsHelper do
[free_plan, bronze_plan] [free_plan, bronze_plan]
end end
let(:plan_tags) { 'CI_1000_MINUTES_PLAN' }
before do before do
stub_feature_flags(hide_deprecated_billing_plans: false) stub_feature_flags(hide_deprecated_billing_plans: false)
allow(helper).to receive(:params).and_return(plan_id: 'bronze_id', namespace_id: nil) allow(helper).to receive(:params).and_return(plan_id: 'bronze_id', namespace_id: nil)
allow_next_instance_of(GitlabSubscriptions::FetchSubscriptionPlansService) do |instance| allow_next_instance_of(GitlabSubscriptions::FetchSubscriptionPlansService) do |instance|
allow(instance).to receive(:execute).and_return(raw_plan_data) allow(instance).to receive(:execute).and_return(raw_plan_data)
end end
stub_plan_data_request(plan_tags)
end end
describe '#subscription_data' do describe '#subscription_data' do
...@@ -46,6 +51,7 @@ RSpec.describe SubscriptionsHelper do ...@@ -46,6 +51,7 @@ RSpec.describe SubscriptionsHelper do
it { is_expected.to include(setup_for_company: 'false') } it { is_expected.to include(setup_for_company: 'false') }
it { is_expected.to include(full_name: 'First Last') } it { is_expected.to include(full_name: 'First Last') }
it { is_expected.to include(available_plans: '[{"id":"bronze_id","code":"bronze","price_per_year":48.0,"name":"Bronze Plan"}]') } it { is_expected.to include(available_plans: '[{"id":"bronze_id","code":"bronze","price_per_year":48.0,"name":"Bronze Plan"}]') }
it { is_expected.to include(ci_minutes_plans: '[{"name":"1000 CI minutes pack","code":"ci_minutes","active":true,"deprecated":false,"free":null,"price_per_month":0.8333333333333334,"price_per_year":10,"features":null,"about_page_href":null,"hide_deprecated_card":false}]') }
it { is_expected.to include(plan_id: 'bronze_id') } it { is_expected.to include(plan_id: 'bronze_id') }
it { is_expected.to include(namespace_id: group.id.to_s) } it { is_expected.to include(namespace_id: group.id.to_s) }
it { is_expected.to include(group_data: %Q{[{"id":#{group.id},"name":"My Namespace","users":1}]}) } it { is_expected.to include(group_data: %Q{[{"id":#{group.id},"name":"My Namespace","users":1}]}) }
...@@ -103,6 +109,14 @@ RSpec.describe SubscriptionsHelper do ...@@ -103,6 +109,14 @@ RSpec.describe SubscriptionsHelper do
it { is_expected.to include(available_plans: '[]') } it { is_expected.to include(available_plans: '[]') }
end end
end end
context 'when ff new_route_ci_minutes_purchase is disabled' do
before do
stub_feature_flags(new_route_ci_minutes_purchase: false)
end
it { is_expected.not_to include(ci_minutes_plans: '[{"name":"1000 CI minutes pack","code":"ci_minutes","active":true,"deprecated":false,"free":null,"price_per_month":0.8333333333333334,"price_per_year":10,"features":null,"about_page_href":null,"hide_deprecated_card":false}]') }
end
end end
describe '#plan_title' do describe '#plan_title' do
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe Gitlab::SubscriptionPortal::Clients::Graphql do RSpec.describe Gitlab::SubscriptionPortal::Clients::Graphql do
include SubscriptionPortalHelpers
let(:client) { Gitlab::SubscriptionPortal::Client } let(:client) { Gitlab::SubscriptionPortal::Client }
describe '#activate' do describe '#activate' do
...@@ -123,4 +125,61 @@ RSpec.describe Gitlab::SubscriptionPortal::Clients::Graphql do ...@@ -123,4 +125,61 @@ RSpec.describe Gitlab::SubscriptionPortal::Clients::Graphql do
end end
end end
end end
describe '#plan_data' do
let(:plan_tags) { 'CI_1000_MINUTES_PLAN' }
subject(:plan_data) { client.plan_data(plan_tags, stubbed_plan_data_query_fields) }
context 'when the response contains errors' do
before do
expect(client).to receive(:execute_graphql_query).and_return(response)
end
let(:response) do
{
success: true,
data: {
'errors' => [{ 'message' => 'this will be ignored' }]
}
}
end
it 'logs an error and returns a failure' do
expect(Gitlab::ErrorTracking)
.to receive(:track_and_raise_for_dev_exception)
.with(
a_kind_of(Gitlab::SubscriptionPortal::Client::ResponseError),
query: include(*stubbed_plan_data_query_fields_camelized), response: response[:data])
expect(plan_data).to eq({ success: false })
end
end
context 'when the response does not contain errors' do
before do
allow(client).to receive(:execute_graphql_query).and_return({ data: Gitlab::Json.parse(stubbed_plan_data_response_body) })
end
it 'filters out the deprecated plans' do
expect(plan_data).to match({
success: true,
plans: contain_exactly(include('deprecated' => false))
})
end
context 'when plans is an empty array' do
before do
allow(client).to receive(:execute_graphql_query).and_return({
success: true,
data: { "data" => { "plans" => [] } }
})
end
it 'returns the correct response' do
expect(plan_data).to eq({ success: true, plans: [] })
end
end
end
end
end end
...@@ -21,6 +21,24 @@ module SubscriptionPortalHelpers ...@@ -21,6 +21,24 @@ module SubscriptionPortalHelpers
) )
end end
def stub_plan_data_request(plan_tags)
stub_full_request("#{EE::SUBSCRIPTIONS_URL}/graphql", method: :post)
.with(
body: include(*plan_tags, *stubbed_plan_data_query_fields_camelized),
headers: {
'Accept' => 'application/json',
'Content-Type' => 'application/json',
'X-Admin-Email' => EE::SUBSCRIPTION_PORTAL_ADMIN_EMAIL,
'X-Admin-Token' => EE::SUBSCRIPTION_PORTAL_ADMIN_TOKEN
}
)
.to_return(
status: 200,
headers: { 'Content-Type' => 'application/json' },
body: stubbed_plan_data_response_body
)
end
private private
def stubbed_eoa_eligibility_response_body def stubbed_eoa_eligibility_response_body
...@@ -34,4 +52,55 @@ module SubscriptionPortalHelpers ...@@ -34,4 +52,55 @@ module SubscriptionPortalHelpers
} }
}.to_json }.to_json
end end
def stubbed_plan_data_query_fields
%w[
name
code
active
free
price_per_month
price_per_year
features
about_page_href
hide_deprecated_card
]
end
def stubbed_plan_data_query_fields_camelized
stubbed_plan_data_query_fields.map { |field| field.to_s.camelize(:lower) }
end
def stubbed_plan_data_response_body
{
"data": {
"plans": [
{
"name": "1000 CI minutes pack",
"code": "ci_minutes",
"active": true,
"deprecated": false,
"free": nil,
"price_per_month": 0.8333333333333334,
"price_per_year": 10,
"features": nil,
"about_page_href": nil,
"hide_deprecated_card": false
},
{
"name": "Deprecated 1000 CI minutes pack",
"code": "deprecated_ci_minutes",
"active": true,
"deprecated": true,
"free": nil,
"price_per_month": 1,
"price_per_year": 12,
"features": nil,
"about_page_href": nil,
"hide_deprecated_card": false
}
]
}
}.to_json
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment