Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
e32f083f49
commit
22fe7d7df6
|
@ -1 +1 @@
|
||||||
5c57bbfef4f37bcca64e3db2e147265450b86300
|
080f9fb5c6d7e1e5e3c3e2a5202b3f0a83ddd180
|
||||||
|
|
|
@ -4,6 +4,7 @@ class Admin::ApplicationSettings::AppearancesController < Admin::ApplicationCont
|
||||||
before_action :set_appearance, except: :create
|
before_action :set_appearance, except: :create
|
||||||
|
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def show
|
def show
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,6 +6,7 @@ class Admin::BroadcastMessagesController < Admin::ApplicationController
|
||||||
before_action :finder, only: [:edit, :update, :destroy]
|
before_action :finder, only: [:edit, :update, :destroy]
|
||||||
|
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
# rubocop: disable CodeReuse/ActiveRecord
|
# rubocop: disable CodeReuse/ActiveRecord
|
||||||
def index
|
def index
|
||||||
|
|
|
@ -5,8 +5,7 @@ class Groups::AutocompleteSourcesController < Groups::ApplicationController
|
||||||
feature_category :team_planning, [:issues, :labels, :milestones, :commands]
|
feature_category :team_planning, [:issues, :labels, :milestones, :commands]
|
||||||
feature_category :code_review, [:merge_requests]
|
feature_category :code_review, [:merge_requests]
|
||||||
|
|
||||||
urgency :low, [:issues, :labels, :milestones, :commands]
|
urgency :low, [:issues, :labels, :milestones, :commands, :merge_requests, :members]
|
||||||
urgency :low, [:merge_requests]
|
|
||||||
|
|
||||||
def members
|
def members
|
||||||
render json: ::Groups::ParticipantsService.new(@group, current_user).execute(target)
|
render json: ::Groups::ParticipantsService.new(@group, current_user).execute(target)
|
||||||
|
|
|
@ -4,6 +4,7 @@ class Groups::EmailCampaignsController < Groups::ApplicationController
|
||||||
EMAIL_CAMPAIGNS_SCHEMA_URL = 'iglu:com.gitlab/email_campaigns/jsonschema/1-0-0'
|
EMAIL_CAMPAIGNS_SCHEMA_URL = 'iglu:com.gitlab/email_campaigns/jsonschema/1-0-0'
|
||||||
|
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
before_action :check_params
|
before_action :check_params
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ class Projects::UsageQuotasController < Projects::ApplicationController
|
||||||
layout "project_settings"
|
layout "project_settings"
|
||||||
|
|
||||||
feature_category :utilization
|
feature_category :utilization
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@hide_search_settings = true
|
@hide_search_settings = true
|
||||||
|
|
|
@ -4,6 +4,7 @@ class PwaController < ApplicationController # rubocop:disable Gitlab/NamespacedC
|
||||||
layout 'errors'
|
layout 'errors'
|
||||||
|
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
skip_before_action :authenticate_user!
|
skip_before_action :authenticate_user!
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
module Users
|
module Users
|
||||||
class CalloutsController < ApplicationController
|
class CalloutsController < ApplicationController
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def create
|
def create
|
||||||
if callout.persisted?
|
if callout.persisted?
|
||||||
|
|
|
@ -34,8 +34,8 @@ class UsersController < ApplicationController
|
||||||
feature_category :snippets, [:snippets]
|
feature_category :snippets, [:snippets]
|
||||||
|
|
||||||
# TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/357914
|
# TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/357914
|
||||||
urgency :low, [:show, :calendar_activities, :contributed, :activity, :projects, :groups]
|
urgency :low, [:show, :calendar_activities, :contributed, :activity, :projects, :groups, :calendar]
|
||||||
urgency :default, [:calendar, :followers, :following, :starred]
|
urgency :default, [:followers, :following, :starred]
|
||||||
urgency :high, [:exists]
|
urgency :high, [:exists]
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|
|
@ -9,6 +9,7 @@ class WhatsNewController < ApplicationController
|
||||||
before_action :check_valid_page_param, :set_pagination_headers
|
before_action :check_valid_page_param, :set_pagination_headers
|
||||||
|
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def index
|
def index
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
|
|
|
@ -44,15 +44,28 @@ class Namespace::RootStorageStatistics < ApplicationRecord
|
||||||
def merged_attributes
|
def merged_attributes
|
||||||
attributes_from_project_statistics.merge!(
|
attributes_from_project_statistics.merge!(
|
||||||
attributes_from_personal_snippets,
|
attributes_from_personal_snippets,
|
||||||
attributes_from_namespace_statistics
|
attributes_from_namespace_statistics,
|
||||||
|
attributes_for_container_registry_size
|
||||||
) { |key, v1, v2| v1 + v2 }
|
) { |key, v1, v2| v1 + v2 }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def attributes_for_container_registry_size
|
||||||
|
return {} unless Feature.enabled?(:container_registry_namespace_statistics, namespace)
|
||||||
|
|
||||||
|
container_registry_size = namespace.container_repositories_size || 0
|
||||||
|
|
||||||
|
{
|
||||||
|
storage_size: container_registry_size,
|
||||||
|
container_registry_size: container_registry_size
|
||||||
|
}.with_indifferent_access
|
||||||
|
end
|
||||||
|
|
||||||
def attributes_from_project_statistics
|
def attributes_from_project_statistics
|
||||||
from_project_statistics
|
from_project_statistics
|
||||||
.take
|
.take
|
||||||
.attributes
|
.attributes
|
||||||
.slice(*STATISTICS_ATTRIBUTES)
|
.slice(*STATISTICS_ATTRIBUTES)
|
||||||
|
.with_indifferent_access
|
||||||
end
|
end
|
||||||
|
|
||||||
def from_project_statistics
|
def from_project_statistics
|
||||||
|
@ -74,7 +87,10 @@ class Namespace::RootStorageStatistics < ApplicationRecord
|
||||||
def attributes_from_personal_snippets
|
def attributes_from_personal_snippets
|
||||||
return {} unless namespace.user_namespace?
|
return {} unless namespace.user_namespace?
|
||||||
|
|
||||||
from_personal_snippets.take.slice(SNIPPETS_SIZE_STAT_NAME)
|
from_personal_snippets
|
||||||
|
.take
|
||||||
|
.slice(SNIPPETS_SIZE_STAT_NAME)
|
||||||
|
.with_indifferent_access
|
||||||
end
|
end
|
||||||
|
|
||||||
def from_personal_snippets
|
def from_personal_snippets
|
||||||
|
@ -102,7 +118,12 @@ class Namespace::RootStorageStatistics < ApplicationRecord
|
||||||
# guard clause.
|
# guard clause.
|
||||||
return {} unless namespace.group_namespace?
|
return {} unless namespace.group_namespace?
|
||||||
|
|
||||||
from_namespace_statistics.take.slice(*self.class.namespace_statistics_attributes)
|
from_namespace_statistics
|
||||||
|
.take
|
||||||
|
.slice(
|
||||||
|
*self.class.namespace_statistics_attributes
|
||||||
|
)
|
||||||
|
.with_indifferent_access
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
name: container_registry_namespace_statistics
|
||||||
|
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87080
|
||||||
|
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361960
|
||||||
|
milestone: '15.0'
|
||||||
|
type: development
|
||||||
|
group: group::utilization
|
||||||
|
default_enabled: false
|
|
@ -0,0 +1,24 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ChangeMaintainerNoteLimitInCiRunner < Gitlab::Database::Migration[1.0]
|
||||||
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
def up
|
||||||
|
add_text_limit(
|
||||||
|
:ci_runners,
|
||||||
|
:maintainer_note,
|
||||||
|
1024,
|
||||||
|
constraint_name: check_constraint_name(:ci_runners, :maintainer_note, 'max_length_1MB')
|
||||||
|
)
|
||||||
|
|
||||||
|
remove_text_limit(
|
||||||
|
:ci_runners,
|
||||||
|
:maintainer_note,
|
||||||
|
constraint_name: check_constraint_name(:ci_runners, :maintainer_note, 'max_length')
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
# no-op: Danger of failing if there are records with length(maintainer_note) > 255
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,14 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class ChangeMaintainerNoteLimitInCiRunner < Gitlab::Database::Migration[1.0]
|
|
||||||
disable_ddl_transaction!
|
|
||||||
|
|
||||||
def up
|
|
||||||
add_text_limit :ci_runners, :maintainer_note, 1024, constraint_name: check_constraint_name(:ci_runners, :maintainer_note, 'max_length_1MB')
|
|
||||||
remove_text_limit :ci_runners, :maintainer_note, constraint_name: check_constraint_name(:ci_runners, :maintainer_note, 'max_length')
|
|
||||||
end
|
|
||||||
|
|
||||||
def down
|
|
||||||
# no-op: Danger of failing if there are records with length(maintainer_note) > 255
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -131,6 +131,7 @@ so be sure to select the correct group.
|
||||||
|
|
||||||
1. On the top bar, select **Menu > Groups** and find your group.
|
1. On the top bar, select **Menu > Groups** and find your group.
|
||||||
1. On the left sidebar, select **Settings > Usage Quotas**.
|
1. On the left sidebar, select **Settings > Usage Quotas**.
|
||||||
|
1. Select **Pipelines**.
|
||||||
1. Select **Buy additional minutes**.
|
1. Select **Buy additional minutes**.
|
||||||
1. Complete the details of the transaction.
|
1. Complete the details of the transaction.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,218 @@
|
||||||
|
---
|
||||||
|
type: reference, dev
|
||||||
|
stage: Create
|
||||||
|
group: Editor
|
||||||
|
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||||
|
description: "GitLab's development guidelines for GitLab Pages"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Getting started with development
|
||||||
|
|
||||||
|
## Configuring GitLab Pages hostname
|
||||||
|
|
||||||
|
GitLab Pages needs a hostname or domain, as each different GitLab Pages site is accessed via a
|
||||||
|
subdomain. GitLab Pages hostname can be set in different manners:
|
||||||
|
|
||||||
|
- [Without wildcard, editing your hosts file](#without-wildcard-editing-your-hosts-file).
|
||||||
|
- [With DNS wildcard alternatives](#with-dns-wildcard-alternatives).
|
||||||
|
|
||||||
|
### Without wildcard, editing your hosts file
|
||||||
|
|
||||||
|
As `/etc/hosts` don't support wildcard hostnames, you must configure one entry
|
||||||
|
for GitLab Pages, and then one entry for each page site:
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
127.0.0.1 gdk.test # If you're using GDK
|
||||||
|
127.0.0.1 pages.gdk.test # Pages host
|
||||||
|
# Any namespace/group/user needs to be added
|
||||||
|
# as a subdomain to the pages host. This is because
|
||||||
|
# /etc/hosts doesn't accept wildcards
|
||||||
|
127.0.0.1 root.pages.gdk.test # for the root pages
|
||||||
|
```
|
||||||
|
|
||||||
|
### With DNS wildcard alternatives
|
||||||
|
|
||||||
|
If instead of editing your `/etc/hosts` you'd prefer to use a DNS wildcard, you can use:
|
||||||
|
|
||||||
|
- [`nip.io`](https://nip.io)
|
||||||
|
- [`dnsmasq`](https://wiki.debian.org/dnsmasq)
|
||||||
|
|
||||||
|
## Configuring GitLab Pages without GDK
|
||||||
|
|
||||||
|
Create a `gitlab-pages.conf` in the root of the GitLab Pages site, like:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
# Default port is 3010, but you can use any other
|
||||||
|
listen-http=:3010
|
||||||
|
|
||||||
|
# Your local GitLab Pages domain
|
||||||
|
pages-domain=pages.gdk.test
|
||||||
|
|
||||||
|
# Directory where the pages are stored
|
||||||
|
pages-root=shared/pages
|
||||||
|
|
||||||
|
# Show more information in the logs
|
||||||
|
log-verbose=true
|
||||||
|
```
|
||||||
|
|
||||||
|
To see more options you can check
|
||||||
|
[`internal/config/flags.go`](https://gitlab.com/gitlab-org/gitlab-pages/blob/master/internal/config/flags.go)
|
||||||
|
or run `gitlab-pages --help`.
|
||||||
|
|
||||||
|
### Running GitLab Pages manually
|
||||||
|
|
||||||
|
For any changes in the code, you must run `make` to build the app. It's best to just always run
|
||||||
|
it before you start the app. It's quick to build so don't worry!
|
||||||
|
|
||||||
|
```shell
|
||||||
|
make && ./gitlab-pages -config=gitlab-pages.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuring GitLab Pages with GDK
|
||||||
|
|
||||||
|
In the following steps, `$GDK_ROOT` is the directory where you cloned GDK.
|
||||||
|
|
||||||
|
1. Set up the [GDK hostname](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/local_network.md).
|
||||||
|
1. Add a [GitLab Pages hostname](#configuring-gitlab-pages-hostname) to the `gdk.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
gitlab_pages:
|
||||||
|
enabled: true # enable GitLab Pages to be managed by gdk
|
||||||
|
port: 3010 # default port is 3010
|
||||||
|
host: pages.gdk.test # the GitLab Pages domain
|
||||||
|
auto_update: true # if gdk must update GitLab Pages git
|
||||||
|
verbose: true # show more information in the logs
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running GitLab Pages with GDK
|
||||||
|
|
||||||
|
After these configurations are set, GDK manages a GitLab Pages process, giving you access to
|
||||||
|
it with commands like:
|
||||||
|
|
||||||
|
- Start: `gdk start gitlab-pages`
|
||||||
|
- Stop: `gdk stop gitlab-pages`
|
||||||
|
- Restart: `gdk restart gitlab-pages`
|
||||||
|
- Tail logs: `gdk tail gitlab-pages`
|
||||||
|
|
||||||
|
### Running GitLab Pages manually
|
||||||
|
|
||||||
|
You can also build and start the app independent of GDK processes management.
|
||||||
|
|
||||||
|
For any changes in the code, you must run `make` to build the app. It's best to just always run
|
||||||
|
it before you start the app. It's quick to build so don't worry!
|
||||||
|
|
||||||
|
```shell
|
||||||
|
make && ./gitlab-pages -config=gitlab-pages.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Building GitLab Pages in FIPS mode
|
||||||
|
|
||||||
|
```shell
|
||||||
|
FIPS_MODE=1 make && ./gitlab-pages -config=gitlab-pages.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Creating GitLab Pages site
|
||||||
|
|
||||||
|
To build a GitLab Pages site locally you must
|
||||||
|
[configure `gitlab-runner`](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/runner.md)
|
||||||
|
|
||||||
|
Check the [user manual](../../user/project/pages/index.md).
|
||||||
|
|
||||||
|
### Enabling access control
|
||||||
|
|
||||||
|
GitLab Pages support private sites. Private sites can be accessed only by users
|
||||||
|
who have access to your GitLab project.
|
||||||
|
|
||||||
|
GitLab Pages access control is disabled by default. To enable it:
|
||||||
|
|
||||||
|
1. Enable the GitLab Pages access control in GitLab itself, which can be done by either:
|
||||||
|
- If you're not using GDK, editing `gitlab.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# gitlab/config/gitlab.yml
|
||||||
|
pages:
|
||||||
|
access_control: true
|
||||||
|
```
|
||||||
|
|
||||||
|
- Editing `gdk.yml` if you're using GDK:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# $GDK_ROOT/gdk.yml
|
||||||
|
gitlab_pages:
|
||||||
|
enabled: true
|
||||||
|
access_control: true
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Restart GitLab (if running through the GDK, run `gdk restart`). Running
|
||||||
|
`gdk reconfigure` overwrites the value of `access_control` in `config/gitlab.yml`.
|
||||||
|
1. In your local GitLab instance, in the browser go to `http://gdk.test:3000/admin/applications`.
|
||||||
|
1. Create an [Instance-wide OAuth application](../../integration/oauth_provider.md#instance-wide-applications)
|
||||||
|
with the `api` scope.
|
||||||
|
1. Set the value of your `redirect-uri` to the `pages-domain` authorization endpoint
|
||||||
|
- `http://pages.gdk.test:3010/auth`, for example
|
||||||
|
- The `redirect-uri` must not contain any GitLab Pages site domain.
|
||||||
|
1. Add the auth client configuration:
|
||||||
|
|
||||||
|
- With GDK, in `gdk.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
gitlab_pages:
|
||||||
|
enabled: true
|
||||||
|
access_control: true
|
||||||
|
auth_client_id: $CLIENT_ID # the OAuth application id created in http://gdk.test:3000/admin/applications
|
||||||
|
auth_client_secret: $CLIENT_SECRET # the OAuth application secret created in http://gdk.test:3000/admin/applications
|
||||||
|
```
|
||||||
|
|
||||||
|
GDK generates random `auth_secret` and builds the `auth_redirect_uri` based on GitLab Pages
|
||||||
|
host configuration.
|
||||||
|
|
||||||
|
- Without GDK, in `gitlab-pages.conf`:
|
||||||
|
|
||||||
|
```conf
|
||||||
|
## the following are only needed if you want to test auth for private projects
|
||||||
|
auth-client-id=$CLIENT_ID # the OAuth application id created in http://gdk.test:3000/admin/applications
|
||||||
|
auth-client-secret=$CLIENT_SECRET # the OAuth application secret created in http://gdk.test:3000/admin/applications
|
||||||
|
auth-secret=$SOME_RANDOM_STRING # should be at least 32 bytes long
|
||||||
|
auth-redirect-uri=http://pages.gdk.test:3010/auth # the authentication callback url for GitLab Pages
|
||||||
|
```
|
||||||
|
|
||||||
|
1. If running Pages inside the GDK, you can use GDK's `protected_config_files` section under `gdk` in
|
||||||
|
your `gdk.yml` to avoid getting `gitlab-pages.conf` configuration rewritten:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
gdk:
|
||||||
|
protected_config_files:
|
||||||
|
- 'gitlab-pages/gitlab-pages.conf'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Linting
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# Run the linter locally
|
||||||
|
make lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
To run tests, you can use these commands:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# This will run all of the tests in the codebase
|
||||||
|
make test
|
||||||
|
|
||||||
|
# Run a specfic test file
|
||||||
|
go test ./internal/serving/disk/
|
||||||
|
|
||||||
|
# Run a specific test in a file
|
||||||
|
go test ./internal/serving/disk/ -run TestDisk_ServeFileHTTP
|
||||||
|
|
||||||
|
# Run all unit tests except acceptance_test.go
|
||||||
|
go test ./... -short
|
||||||
|
|
||||||
|
# Run acceptance_test.go only
|
||||||
|
make acceptance
|
||||||
|
# Run specific acceptance tests
|
||||||
|
# We add `make` here because acceptance tests use the last binary that was compiled,
|
||||||
|
# so we want to have the latest changes in the build that is tested
|
||||||
|
make && go test ./ -run TestRedirect
|
||||||
|
```
|
|
@ -273,7 +273,7 @@ If you are an administrator, you can export your license usage into a CSV:
|
||||||
1. On the left sidebar, select **Subscription**.
|
1. On the left sidebar, select **Subscription**.
|
||||||
1. In the top right, select **Export license usage file**.
|
1. In the top right, select **Export license usage file**.
|
||||||
|
|
||||||
This file contains the information GitLab uses to manually process quarterly reconciliations or renewals. If your instance is firewalled or air-gapped, you must provide GitLab with this information.
|
This file contains the information GitLab uses to manually process quarterly reconciliations or renewals. If your instance is firewalled or in an offline environment, you must provide GitLab with this information.
|
||||||
|
|
||||||
The **License Usage** CSV includes the following details:
|
The **License Usage** CSV includes the following details:
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ In this case, the feature branch would be `release-X-Y`. Assuming the `release-X
|
||||||
|
|
||||||
![Create merge request](img/create_merge_request_v13_1.png)
|
![Create merge request](img/create_merge_request_v13_1.png)
|
||||||
|
|
||||||
1. After you click **Create merge request**, an option to **Change branches** displays. Select that option.
|
1. After you select **Create merge request**, an option to **Change branches** displays. Select that option.
|
||||||
|
|
||||||
1. In the **New Merge Request** screen, you can now select the **Source** and **Target** branches.
|
1. In the **New Merge Request** screen, you can now select the **Source** and **Target** branches.
|
||||||
In the screenshot shown,
|
In the screenshot shown,
|
||||||
|
|
|
@ -36,7 +36,7 @@ To activate your instance with an activation code:
|
||||||
|
|
||||||
The subscription is activated.
|
The subscription is activated.
|
||||||
|
|
||||||
If you have an offline or air gapped environment,
|
If you have an offline environment,
|
||||||
[activate GitLab EE with a license file or key](license_file.md) instead.
|
[activate GitLab EE with a license file or key](license_file.md) instead.
|
||||||
|
|
||||||
If you have questions or need assistance activating your instance,
|
If you have questions or need assistance activating your instance,
|
||||||
|
@ -64,6 +64,6 @@ This error occurs when you use an activation code to activate your instance, but
|
||||||
|
|
||||||
You may have connectivity issues due to the following reasons:
|
You may have connectivity issues due to the following reasons:
|
||||||
|
|
||||||
- **You have an offline or air gapped environment**: Configure your setup to allow connection to GitLab servers. If connection to GitLab servers is not possible, contact [GitLab support](https://about.gitlab.com/support/#contact-support) to request a license key.
|
- **You have an offline environment**: Configure your setup to allow connection to GitLab servers. If connection to GitLab servers is not possible, contact [GitLab support](https://about.gitlab.com/support/#contact-support) to request a license key.
|
||||||
- **Firewall settings**: Enable an encrypted HTTPS connection from your GitLab instance to `customers.gitlab.com` (with IP addresses 104.18.26.123 and 104.18.27.123) on port 443.
|
- **Firewall settings**: Enable an encrypted HTTPS connection from your GitLab instance to `customers.gitlab.com` (with IP addresses 104.18.26.123 and 104.18.27.123) on port 443.
|
||||||
- **Customers Portal is not operational**: To check for performance or service disruptions, check the Customers Portal [status](https://status.gitlab.com/).
|
- **Customers Portal is not operational**: To check for performance or service disruptions, check the Customers Portal [status](https://status.gitlab.com/).
|
||||||
|
|
|
@ -1296,7 +1296,7 @@ variables:
|
||||||
|
|
||||||
The `api-fuzzing-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
|
The `api-fuzzing-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
|
||||||
|
|
||||||
### Exclude URLS
|
### Exclude URLs
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10.
|
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10.
|
||||||
|
|
||||||
|
|
|
@ -1250,7 +1250,7 @@ variables:
|
||||||
|
|
||||||
The `dast-api-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
|
The `dast-api-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
|
||||||
|
|
||||||
### Exclude URLS
|
### Exclude URLs
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10.
|
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357195) in GitLab 14.10.
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,7 @@ For each compatible analyzer, a job is created in the `test`, `dast` or `fuzz` s
|
||||||
Features such as the [Security Dashboard](security_dashboard/index.md), [Vulnerability Report](vulnerability_report/index.md), and [Dependency List](dependency_list/index.md)
|
Features such as the [Security Dashboard](security_dashboard/index.md), [Vulnerability Report](vulnerability_report/index.md), and [Dependency List](dependency_list/index.md)
|
||||||
that rely on this scan data only show results from pipelines on the default branch, only if all jobs are finished, including manual ones. One tool might use many analyzers.
|
that rely on this scan data only show results from pipelines on the default branch, only if all jobs are finished, including manual ones. One tool might use many analyzers.
|
||||||
|
|
||||||
Our language and package manager specific jobs attempt to assess which analyzer(s) they should run for your project so that you can do less configuration.
|
Our language and package manager specific jobs attempt to assess which analyzers they should run for your project so that you can do less configuration.
|
||||||
|
|
||||||
If you want to override this to increase the pipeline speed you may choose which analyzers to exclude if you know they are not applicable (languages or package managers not contained in your project) by following variable customization directions for that specific tool.
|
If you want to override this to increase the pipeline speed you may choose which analyzers to exclude if you know they are not applicable (languages or package managers not contained in your project) by following variable customization directions for that specific tool.
|
||||||
|
|
||||||
|
@ -560,18 +560,18 @@ When overriding the template to control job execution, previous instances of
|
||||||
[`only` or `except`](../../ci/yaml/index.md#only--except) are no longer compatible
|
[`only` or `except`](../../ci/yaml/index.md#only--except) are no longer compatible
|
||||||
and must be transitioned to [the `rules` syntax](../../ci/yaml/index.md#rules).
|
and must be transitioned to [the `rules` syntax](../../ci/yaml/index.md#rules).
|
||||||
|
|
||||||
If your override is aimed at limiting jobs to only run on `master`, the previous syntax
|
If your override is aimed at limiting jobs to only run on `main`, the previous syntax
|
||||||
would look similar to:
|
would look similar to:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
include:
|
include:
|
||||||
- template: Security/SAST.gitlab-ci.yml
|
- template: Security/SAST.gitlab-ci.yml
|
||||||
|
|
||||||
# Ensure that the scanning is only executed on master or merge requests
|
# Ensure that the scanning is only executed on main or merge requests
|
||||||
spotbugs-sast:
|
spotbugs-sast:
|
||||||
only:
|
only:
|
||||||
refs:
|
refs:
|
||||||
- master
|
- main
|
||||||
- merge_requests
|
- merge_requests
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -582,10 +582,10 @@ would be written as follows:
|
||||||
include:
|
include:
|
||||||
- template: Security/SAST.gitlab-ci.yml
|
- template: Security/SAST.gitlab-ci.yml
|
||||||
|
|
||||||
# Ensure that the scanning is only executed on master or merge requests
|
# Ensure that the scanning is only executed on main or merge requests
|
||||||
spotbugs-sast:
|
spotbugs-sast:
|
||||||
rules:
|
rules:
|
||||||
- if: $CI_COMMIT_BRANCH == "master"
|
- if: $CI_COMMIT_BRANCH == "main"
|
||||||
- if: $CI_MERGE_REQUEST_ID
|
- if: $CI_MERGE_REQUEST_ID
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,13 @@ In GitLab, you can:
|
||||||
- Lock and unlock states.
|
- Lock and unlock states.
|
||||||
- Remotely execute `terraform plan` and `terraform apply` commands.
|
- Remotely execute `terraform plan` and `terraform apply` commands.
|
||||||
|
|
||||||
For self-managed instances, before you can use GitLab for your Terraform state files,
|
## Prerequisites
|
||||||
an administrator must [set up Terraform state storage](../../../administration/terraform_state.md).
|
|
||||||
|
For self-managed GitLab, before you can use GitLab for your Terraform state files:
|
||||||
|
|
||||||
|
- An administrator must [set up Terraform state storage](../../../administration/terraform_state.md).
|
||||||
|
- You must enable [Operations](../../../operations/index.md) for your project. Go to **Settings > General**,
|
||||||
|
expand **Visibility, project features, permissions**, and under **Operations**, turn on the toggle.
|
||||||
|
|
||||||
## Initialize a Terraform state as a backend by using GitLab CI/CD
|
## Initialize a Terraform state as a backend by using GitLab CI/CD
|
||||||
|
|
||||||
|
|
|
@ -140,7 +140,7 @@ In the [IAM Management Console](https://console.aws.amazon.com/iam/home),
|
||||||
create another IAM role (**role B**) for GitLab authentication with AWS:
|
create another IAM role (**role B**) for GitLab authentication with AWS:
|
||||||
|
|
||||||
1. On the AWS IAM console, select **Roles** from the left panel.
|
1. On the AWS IAM console, select **Roles** from the left panel.
|
||||||
1. Click **Create role**.
|
1. Select **Create role**.
|
||||||
1. Under **Select type of trusted entity**, select **Another AWS account**.
|
1. Under **Select type of trusted entity**, select **Another AWS account**.
|
||||||
1. Enter the Account ID from GitLab into the **Account ID** field.
|
1. Enter the Account ID from GitLab into the **Account ID** field.
|
||||||
1. Check **Require external ID**.
|
1. Check **Require external ID**.
|
||||||
|
|
|
@ -64,8 +64,8 @@ cluster certificates:
|
||||||
cluster.
|
cluster.
|
||||||
- Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
|
- Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
|
||||||
- **Menu > Admin > Kubernetes** page, for an instance-level cluster.
|
- **Menu > Admin > Kubernetes** page, for an instance-level cluster.
|
||||||
1. Click **Integrate with a cluster certificate**.
|
1. Select **Integrate with a cluster certificate**.
|
||||||
1. Under the **Create new cluster** tab, click **Google GKE**.
|
1. Under the **Create new cluster** tab, select **Google GKE**.
|
||||||
1. Connect your Google account if you haven't done already by clicking the
|
1. Connect your Google account if you haven't done already by clicking the
|
||||||
**Sign in with Google** button.
|
**Sign in with Google** button.
|
||||||
1. Choose your cluster's settings:
|
1. Choose your cluster's settings:
|
||||||
|
@ -83,7 +83,7 @@ cluster certificates:
|
||||||
See the [Cloud Run for Anthos section](#cloud-run-for-anthos) for more information.
|
See the [Cloud Run for Anthos section](#cloud-run-for-anthos) for more information.
|
||||||
- **GitLab-managed cluster** - Leave this checked if you want GitLab to manage namespaces and service accounts for this cluster.
|
- **GitLab-managed cluster** - Leave this checked if you want GitLab to manage namespaces and service accounts for this cluster.
|
||||||
See the [Managed clusters section](gitlab_managed_clusters.md) for more information.
|
See the [Managed clusters section](gitlab_managed_clusters.md) for more information.
|
||||||
1. Finally, click the **Create Kubernetes cluster** button.
|
1. Finally, select the **Create Kubernetes cluster** button.
|
||||||
|
|
||||||
After a couple of minutes, your cluster is ready.
|
After a couple of minutes, your cluster is ready.
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ When you successfully connect an existing cluster using cluster certificates, th
|
||||||
- **Menu > Admin > Kubernetes** page, for an instance-level cluster.
|
- **Menu > Admin > Kubernetes** page, for an instance-level cluster.
|
||||||
1. Select the name of the cluster you want to disable.
|
1. Select the name of the cluster you want to disable.
|
||||||
1. Toggle **GitLab Integration** off (in gray).
|
1. Toggle **GitLab Integration** off (in gray).
|
||||||
1. Click **Save changes**.
|
1. Select **Save changes**.
|
||||||
|
|
||||||
## Remove a cluster
|
## Remove a cluster
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ To clear the cache:
|
||||||
|
|
||||||
1. Navigate to your project's **Infrastructure > Kubernetes clusters** page, and select your cluster.
|
1. Navigate to your project's **Infrastructure > Kubernetes clusters** page, and select your cluster.
|
||||||
1. Expand the **Advanced settings** section.
|
1. Expand the **Advanced settings** section.
|
||||||
1. Click **Clear cluster cache**.
|
1. Select **Clear cluster cache**.
|
||||||
|
|
||||||
## Base domain
|
## Base domain
|
||||||
|
|
||||||
|
@ -66,10 +66,10 @@ You can either:
|
||||||
To determine the external Ingress IP address, or external Ingress hostname:
|
To determine the external Ingress IP address, or external Ingress hostname:
|
||||||
|
|
||||||
- *If the cluster is on GKE*:
|
- *If the cluster is on GKE*:
|
||||||
1. Click the **Google Kubernetes Engine** link in the **Advanced settings**,
|
1. Select the **Google Kubernetes Engine** link in the **Advanced settings**,
|
||||||
or go directly to the [Google Kubernetes Engine dashboard](https://console.cloud.google.com/kubernetes/).
|
or go directly to the [Google Kubernetes Engine dashboard](https://console.cloud.google.com/kubernetes/).
|
||||||
1. Select the proper project and cluster.
|
1. Select the proper project and cluster.
|
||||||
1. Click **Connect**
|
1. Select **Connect**.
|
||||||
1. Execute the `gcloud` command in a local terminal or using the **Cloud Shell**.
|
1. Execute the `gcloud` command in a local terminal or using the **Cloud Shell**.
|
||||||
|
|
||||||
- *If the cluster is not on GKE*: Follow the specific instructions for your
|
- *If the cluster is not on GKE*: Follow the specific instructions for your
|
||||||
|
|
|
@ -52,7 +52,7 @@ is required to use Logs.
|
||||||
|
|
||||||
## Accessing the log explorer
|
## Accessing the log explorer
|
||||||
|
|
||||||
To access the **Log explorer**, click the **More actions** **{ellipsis_v}** menu on
|
To access the **Log explorer**, select the **More actions** **{ellipsis_v}** menu on
|
||||||
a [metrics dashboard](../../../operations/metrics/index.md) and select **View logs**, or:
|
a [metrics dashboard](../../../operations/metrics/index.md) and select **View logs**, or:
|
||||||
|
|
||||||
1. Sign in as a user with the _View pod logs_
|
1. Sign in as a user with the _View pod logs_
|
||||||
|
@ -68,7 +68,7 @@ a [metrics dashboard](../../../operations/metrics/index.md) and select **View lo
|
||||||
1. When mousing over the list of pods, GitLab displays a tooltip with the exact pod name
|
1. When mousing over the list of pods, GitLab displays a tooltip with the exact pod name
|
||||||
and status.
|
and status.
|
||||||
![deploy boards pod list](img/pod_logs_deploy_board.png)
|
![deploy boards pod list](img/pod_logs_deploy_board.png)
|
||||||
1. Click on the desired pod to display the **Log Explorer**.
|
1. Select on the desired pod to display the **Log Explorer**.
|
||||||
|
|
||||||
### Logs view
|
### Logs view
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ Support for historical data is coming
|
||||||
When you enable [Elastic Stack](../../clusters/integrations.md#elastic-stack-cluster-integration)
|
When you enable [Elastic Stack](../../clusters/integrations.md#elastic-stack-cluster-integration)
|
||||||
on your cluster, you can filter logs displayed in the **Log Explorer** by date.
|
on your cluster, you can filter logs displayed in the **Log Explorer** by date.
|
||||||
|
|
||||||
Click **Show last** in the **Log Explorer** to see the available options.
|
Select **Show last** in the **Log Explorer** to see the available options.
|
||||||
|
|
||||||
### Full text search
|
### Full text search
|
||||||
|
|
||||||
|
|
|
@ -153,15 +153,15 @@ the components outlined above and the pre-loaded demo runbook.
|
||||||
```
|
```
|
||||||
|
|
||||||
1. After JupyterHub has been installed successfully, open the **Jupyter Hostname**
|
1. After JupyterHub has been installed successfully, open the **Jupyter Hostname**
|
||||||
in your browser. Click the **Sign in with GitLab** button to log in to
|
in your browser. Select **Sign in with GitLab** button to log in to
|
||||||
JupyterHub and start the server. Authentication is enabled for any user of the
|
JupyterHub and start the server. Authentication is enabled for any user of the
|
||||||
GitLab instance with OAuth2. This button redirects you to a page at GitLab
|
GitLab instance with OAuth2. This button redirects you to a page at GitLab
|
||||||
requesting authorization for JupyterHub to use your GitLab account.
|
requesting authorization for JupyterHub to use your GitLab account.
|
||||||
|
|
||||||
![authorize Jupyter](img/authorize-jupyter.png)
|
![authorize Jupyter](img/authorize-jupyter.png)
|
||||||
|
|
||||||
1. Click **Authorize**, and GitLab redirects you to the JupyterHub application.
|
1. Select **Authorize**, and GitLab redirects you to the JupyterHub application.
|
||||||
1. Click **Start My Server** to start the server in a few seconds.
|
1. Select **Start My Server** to start the server in a few seconds.
|
||||||
1. To configure the runbook's access to your GitLab project, you must enter your
|
1. To configure the runbook's access to your GitLab project, you must enter your
|
||||||
[GitLab Access Token](../../../profile/personal_access_tokens.md)
|
[GitLab Access Token](../../../profile/personal_access_tokens.md)
|
||||||
and your Project ID in the **Setup** section of the demo runbook:
|
and your Project ID in the **Setup** section of the demo runbook:
|
||||||
|
@ -208,9 +208,9 @@ the components outlined above and the pre-loaded demo runbook.
|
||||||
|
|
||||||
![GitLab variables](img/gitlab-variables.png)
|
![GitLab variables](img/gitlab-variables.png)
|
||||||
|
|
||||||
1. Click **Save variables**.
|
1. Select **Save variables**.
|
||||||
|
|
||||||
1. In Jupyter, click the **Run SQL queries in Notebook** heading, and then click
|
1. In Jupyter, select the **Run SQL queries in Notebook** heading, and then click
|
||||||
**Run**. The results are displayed inline as follows:
|
**Run**. The results are displayed inline as follows:
|
||||||
|
|
||||||
![PostgreSQL query](img/postgres-query.png)
|
![PostgreSQL query](img/postgres-query.png)
|
||||||
|
|
|
@ -71,19 +71,19 @@ To import Jira issues to a GitLab project:
|
||||||
|
|
||||||
![Import issues from Jira form](img/jira/import_issues_from_jira_form_v13_2.png)
|
![Import issues from Jira form](img/jira/import_issues_from_jira_form_v13_2.png)
|
||||||
|
|
||||||
1. Click the **Import from** dropdown list and select the Jira project that you wish to import issues from.
|
1. Select the **Import from** dropdown list and select the Jira project that you wish to import issues from.
|
||||||
|
|
||||||
In the **Jira-GitLab user mapping template** section, the table shows to which GitLab users your Jira
|
In the **Jira-GitLab user mapping template** section, the table shows to which GitLab users your Jira
|
||||||
users are mapped.
|
users are mapped.
|
||||||
When the form appears, the dropdown list defaults to the user conducting the import.
|
When the form appears, the dropdown list defaults to the user conducting the import.
|
||||||
|
|
||||||
1. To change any of the mappings, click the dropdown list in the **GitLab username** column and
|
1. To change any of the mappings, select the dropdown list in the **GitLab username** column and
|
||||||
select the user you want to map to each Jira user.
|
select the user you want to map to each Jira user.
|
||||||
|
|
||||||
The dropdown list may not show all the users, so use the search bar to find a specific
|
The dropdown list may not show all the users, so use the search bar to find a specific
|
||||||
user in this GitLab project.
|
user in this GitLab project.
|
||||||
|
|
||||||
1. Click **Continue**. You're presented with a confirmation that import has started.
|
1. Select **Continue**. You're presented with a confirmation that import has started.
|
||||||
|
|
||||||
While the import is running in the background, you can navigate away from the import status page
|
While the import is running in the background, you can navigate away from the import status page
|
||||||
to the issues page, and you can see the new issues appearing in the issues list.
|
to the issues page, and you can see the new issues appearing in the issues list.
|
||||||
|
|
|
@ -53,13 +53,13 @@ As a result, the following projects are created:
|
||||||
|
|
||||||
To start the import:
|
To start the import:
|
||||||
|
|
||||||
1. From your GitLab dashboard click **New project**.
|
1. From your GitLab dashboard select **New project**.
|
||||||
1. Switch to the **Import project** tab.
|
1. Switch to the **Import project** tab.
|
||||||
1. Click on the **Manifest file** button.
|
1. Select on the **Manifest file** button.
|
||||||
1. Provide GitLab with a manifest XML file.
|
1. Provide GitLab with a manifest XML file.
|
||||||
1. Select a group you want to import to (you need to create a group first if you don't have one).
|
1. Select a group you want to import to (you need to create a group first if you don't have one).
|
||||||
1. Click **List available repositories**. At this point, you are redirected
|
1. Select **List available repositories**. At this point, you are redirected
|
||||||
to the import status page with projects list based on the manifest file.
|
to the import status page with projects list based on the manifest file.
|
||||||
1. Check the list and click **Import all repositories** to start the import.
|
1. Check the list and select **Import all repositories** to start the import.
|
||||||
|
|
||||||
![Manifest status](img/manifest_status_v13_3.png)
|
![Manifest status](img/manifest_status_v13_3.png)
|
||||||
|
|
|
@ -33,6 +33,6 @@ notifications:
|
||||||
1. Ensure that the **Active** toggle is enabled.
|
1. Ensure that the **Active** toggle is enabled.
|
||||||
1. Select the checkboxes corresponding to the GitLab events you want to receive in Webex Teams.
|
1. Select the checkboxes corresponding to the GitLab events you want to receive in Webex Teams.
|
||||||
1. Paste the **Webhook** URL for the Webex Teams space.
|
1. Paste the **Webhook** URL for the Webex Teams space.
|
||||||
1. Configure the remaining options and then click **Test settings and save changes**.
|
1. Configure the remaining options and then select **Test settings and save changes**.
|
||||||
|
|
||||||
The Webex Teams space begins to receive all applicable GitLab events.
|
The Webex Teams space begins to receive all applicable GitLab events.
|
||||||
|
|
|
@ -70,17 +70,17 @@ GitLab automatically loads the last board you visited.
|
||||||
|
|
||||||
To create a new issue board:
|
To create a new issue board:
|
||||||
|
|
||||||
1. Click the dropdown with the current board name in the upper left corner of the issue boards page.
|
1. Select the dropdown with the current board name in the upper left corner of the issue boards page.
|
||||||
1. Click **Create new board**.
|
1. Select **Create new board**.
|
||||||
1. Enter the new board's name and select its scope: milestone, labels, assignee, or weight.
|
1. Enter the new board's name and select its scope: milestone, labels, assignee, or weight.
|
||||||
|
|
||||||
### Delete an issue board
|
### Delete an issue board
|
||||||
|
|
||||||
To delete the currently active issue board:
|
To delete the currently active issue board:
|
||||||
|
|
||||||
1. Click the dropdown with the current board name in the upper left corner of the issue boards page.
|
1. Select the dropdown with the current board name in the upper left corner of the issue boards page.
|
||||||
1. Click **Delete board**.
|
1. Select **Delete board**.
|
||||||
1. Click **Delete** to confirm.
|
1. Select **Delete** to confirm.
|
||||||
|
|
||||||
## Issue boards use cases
|
## Issue boards use cases
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ assignee list:
|
||||||
|
|
||||||
Now that the assignee list is added, you can assign or unassign issues to that user
|
Now that the assignee list is added, you can assign or unassign issues to that user
|
||||||
by [moving issues](#move-issues-and-lists) to and from an assignee list.
|
by [moving issues](#move-issues-and-lists) to and from an assignee list.
|
||||||
To remove an assignee list, just as with a label list, click the trash icon.
|
To remove an assignee list, just as with a label list, select the trash icon.
|
||||||
|
|
||||||
![Assignee lists](img/issue_board_assignee_lists_v14_1.png)
|
![Assignee lists](img/issue_board_assignee_lists_v14_1.png)
|
||||||
|
|
||||||
|
@ -307,7 +307,7 @@ milestone, giving you more freedom and visibility on the issue board. To add a m
|
||||||
|
|
||||||
Like the assignee lists, you're able to [drag issues](#move-issues-and-lists)
|
Like the assignee lists, you're able to [drag issues](#move-issues-and-lists)
|
||||||
to and from a milestone list to manipulate the milestone of the dragged issues.
|
to and from a milestone list to manipulate the milestone of the dragged issues.
|
||||||
As in other list types, click the trash icon to remove a list.
|
As in other list types, select the trash icon to remove a list.
|
||||||
|
|
||||||
![Milestone lists](img/issue_board_milestone_lists_v14_1.png)
|
![Milestone lists](img/issue_board_milestone_lists_v14_1.png)
|
||||||
|
|
||||||
|
@ -392,8 +392,8 @@ Examples:
|
||||||
To set a WIP limit for a list:
|
To set a WIP limit for a list:
|
||||||
|
|
||||||
1. Navigate to a Project or Group board of which you're a member.
|
1. Navigate to a Project or Group board of which you're a member.
|
||||||
1. Click the settings icon in a list's header.
|
1. Select the settings icon in a list's header.
|
||||||
1. Next to **Work In Progress Limit**, click **Edit**.
|
1. Next to **Work In Progress Limit**, select **Edit**.
|
||||||
1. Enter the maximum number of issues.
|
1. Enter the maximum number of issues.
|
||||||
1. Press <kbd>Enter</kbd> to save.
|
1. Press <kbd>Enter</kbd> to save.
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ You can also add a linked issue from a commit message or the description in anot
|
||||||
|
|
||||||
## Remove a linked issue
|
## Remove a linked issue
|
||||||
|
|
||||||
In the **Linked issues** section of an issue, click the remove button (**{close}**) on the
|
In the **Linked issues** section of an issue, select the remove button (**{close}**) on the
|
||||||
right-side of each issue token to remove.
|
right-side of each issue token to remove.
|
||||||
|
|
||||||
Due to the bi-directional relationship, the relationship no longer appears in either issue.
|
Due to the bi-directional relationship, the relationship no longer appears in either issue.
|
||||||
|
|
|
@ -23,7 +23,7 @@ highly recommendable.
|
||||||
|
|
||||||
Let's start with an introduction to the importance of HTTPS.
|
Let's start with an introduction to the importance of HTTPS.
|
||||||
|
|
||||||
## Why should I care about HTTPS?
|
## Why should you care about HTTPS?
|
||||||
|
|
||||||
This might be your first question. If our sites are hosted by GitLab Pages,
|
This might be your first question. If our sites are hosted by GitLab Pages,
|
||||||
they are static, hence we are not dealing with server-side scripts
|
they are static, hence we are not dealing with server-side scripts
|
||||||
|
@ -42,7 +42,7 @@ Now we have a different picture. [According to Josh Aas](https://letsencrypt.org
|
||||||
> _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, your visitors)
|
||||||
and the **server** (where you site lives), through a keychain of
|
and the **server** (where you site lives), through a keychain of
|
||||||
authentications and validations.
|
authentications and validations.
|
||||||
|
|
||||||
|
|
|
@ -259,20 +259,20 @@ for both the `/data` and `/data/` URL paths.
|
||||||
|
|
||||||
## Frequently Asked Questions
|
## Frequently Asked Questions
|
||||||
|
|
||||||
### Can I download my generated pages?
|
### Can you download your generated pages?
|
||||||
|
|
||||||
Sure. All you need to do is download the artifacts archive from the job page.
|
Sure. All you need to do is download the artifacts archive from the job page.
|
||||||
|
|
||||||
### Can I use GitLab Pages if my project is private?
|
### Can you use GitLab Pages if your project is private?
|
||||||
|
|
||||||
Yes. GitLab Pages doesn't care whether you set your project's visibility level
|
Yes. GitLab Pages doesn't care whether you set your project's visibility level
|
||||||
to private, internal or public.
|
to private, internal or public.
|
||||||
|
|
||||||
### Can I create a personal or a group website
|
### Can you create a personal or a group website?
|
||||||
|
|
||||||
Yes. See the documentation about [GitLab Pages domain names, URLs, and base URLs](getting_started_part_one.md).
|
Yes. See the documentation about [GitLab Pages domain names, URLs, and base URLs](getting_started_part_one.md).
|
||||||
|
|
||||||
### Do I need to create a user/group website before creating a project website?
|
### Do you need to create a user/group website before creating a project website?
|
||||||
|
|
||||||
No, you don't. You can create your project first and access it under
|
No, you don't. You can create your project first and access it under
|
||||||
`http(s)://namespace.example.io/projectname`.
|
`http(s)://namespace.example.io/projectname`.
|
||||||
|
|
|
@ -31,7 +31,7 @@ To protect a tag, you must have at least the Maintainer role.
|
||||||
|
|
||||||
1. Go to the project's **Settings > Repository**.
|
1. Go to the project's **Settings > Repository**.
|
||||||
|
|
||||||
1. From the **Tag** dropdown list, select the tag you want to protect or type and click **Create wildcard**. In the screenshot below, we chose to protect all tags matching `v*`:
|
1. From the **Tag** dropdown list, select the tag you want to protect or type and select **Create wildcard**. In the screenshot below, we chose to protect all tags matching `v*`:
|
||||||
|
|
||||||
![Protected tags page](img/protected_tags_page_v12_3.png)
|
![Protected tags page](img/protected_tags_page_v12_3.png)
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ To compare branches in a repository:
|
||||||
1. Select **Repository > Compare** in the sidebar.
|
1. Select **Repository > Compare** in the sidebar.
|
||||||
1. Select the target repository to compare with the [repository filter search box](#repository-filter-search-box).
|
1. Select the target repository to compare with the [repository filter search box](#repository-filter-search-box).
|
||||||
1. Select branches to compare using the [branch filter search box](#branch-filter-search-box).
|
1. Select branches to compare using the [branch filter search box](#branch-filter-search-box).
|
||||||
1. Click **Compare** to view the changes inline:
|
1. Select **Compare** to view the changes inline:
|
||||||
|
|
||||||
![compare branches](img/compare_branches_v13_12.png)
|
![compare branches](img/compare_branches_v13_12.png)
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ are shown.
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19299) in GitLab 12.7.
|
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/19299) in GitLab 12.7.
|
||||||
|
|
||||||
To see earlier revisions of a specific line, click **View blame prior to this change**
|
To see earlier revisions of a specific line, select **View blame prior to this change**
|
||||||
until you've found the changes you're interested in viewing:
|
until you've found the changes you're interested in viewing:
|
||||||
|
|
||||||
![Blame previous commit](img/file_blame_previous_commit_v12_7.png "Blame previous commit")
|
![Blame previous commit](img/file_blame_previous_commit_v12_7.png "Blame previous commit")
|
||||||
|
|
|
@ -353,8 +353,8 @@ in project listings.
|
||||||
To archive a project:
|
To archive a project:
|
||||||
|
|
||||||
1. Navigate to your project's **Settings > General**.
|
1. Navigate to your project's **Settings > General**.
|
||||||
1. Under **Advanced**, click **Expand**.
|
1. Under **Advanced**, select **Expand**.
|
||||||
1. In the **Archive project** section, click the **Archive project** button.
|
1. In the **Archive project** section, select **Archive project**.
|
||||||
1. Confirm the action when asked to.
|
1. Confirm the action when asked to.
|
||||||
|
|
||||||
#### Unarchiving a project
|
#### Unarchiving a project
|
||||||
|
@ -373,13 +373,13 @@ To find an archived project:
|
||||||
1. Select **Explore projects**.
|
1. Select **Explore projects**.
|
||||||
1. In the **Sort projects** dropdown box, select **Show archived projects**.
|
1. In the **Sort projects** dropdown box, select **Show archived projects**.
|
||||||
1. In the **Filter by name** field, provide the project's name.
|
1. In the **Filter by name** field, provide the project's name.
|
||||||
1. Click the link to the project to open its **Details** page.
|
1. Select the link to the project to open its **Details** page.
|
||||||
|
|
||||||
Next, to unarchive the project:
|
Next, to unarchive the project:
|
||||||
|
|
||||||
1. Navigate to your project's **Settings > General**.
|
1. Navigate to your project's **Settings > General**.
|
||||||
1. Under **Advanced**, click **Expand**.
|
1. Under **Advanced**, select **Expand**.
|
||||||
1. In the **Unarchive project** section, click the **Unarchive project** button.
|
1. In the **Unarchive project** section, select **Unarchive project**.
|
||||||
1. Confirm the action when asked to.
|
1. Confirm the action when asked to.
|
||||||
|
|
||||||
#### Renaming a repository
|
#### Renaming a repository
|
||||||
|
@ -395,9 +395,9 @@ project via a browser) and its place on the file disk where GitLab is installed.
|
||||||
To rename a repository:
|
To rename a repository:
|
||||||
|
|
||||||
1. Navigate to your project's **Settings > General**.
|
1. Navigate to your project's **Settings > General**.
|
||||||
1. Under **Advanced**, click **Expand**.
|
1. Under **Advanced**, select **Expand**.
|
||||||
1. Under **Change path**, update the repository's path.
|
1. Under **Change path**, update the repository's path.
|
||||||
1. Click **Change path**.
|
1. Select **Change path**.
|
||||||
|
|
||||||
Remember that this can have unintended side effects since everyone with the
|
Remember that this can have unintended side effects since everyone with the
|
||||||
old URL can't push or pull. Read more about what happens with the
|
old URL can't push or pull. Read more about what happens with the
|
||||||
|
@ -512,7 +512,7 @@ The following are deleted:
|
||||||
To restore a project marked for deletion:
|
To restore a project marked for deletion:
|
||||||
|
|
||||||
1. Navigate to your project, and select **Settings > General > Advanced**.
|
1. Navigate to your project, and select **Settings > General > Advanced**.
|
||||||
1. In the Restore project section, click the **Restore project** button.
|
1. In the Restore project section, select **Restore project**.
|
||||||
|
|
||||||
#### Removing a fork relationship
|
#### Removing a fork relationship
|
||||||
|
|
||||||
|
@ -529,7 +529,7 @@ To restore the fork relationship, [use the API](../../../api/projects.md#create-
|
||||||
To do so:
|
To do so:
|
||||||
|
|
||||||
1. Navigate to your project's **Settings > General > Advanced**.
|
1. Navigate to your project's **Settings > General > Advanced**.
|
||||||
1. Under **Remove fork relationship**, click the likewise-labeled button.
|
1. Under **Remove fork relationship**, select the likewise-labeled button.
|
||||||
1. Confirm the action by typing the project's path as instructed.
|
1. Confirm the action by typing the project's path as instructed.
|
||||||
|
|
||||||
NOTE:
|
NOTE:
|
||||||
|
|
|
@ -5,6 +5,7 @@ module API
|
||||||
before { authenticated_as_admin! }
|
before { authenticated_as_admin! }
|
||||||
|
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
helpers do
|
helpers do
|
||||||
def current_appearance
|
def current_appearance
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
module API
|
module API
|
||||||
class Avatar < ::API::Base
|
class Avatar < ::API::Base
|
||||||
feature_category :users
|
feature_category :users
|
||||||
urgency :high
|
urgency :medium
|
||||||
|
|
||||||
resource :avatar do
|
resource :avatar do
|
||||||
desc 'Return avatar url for a user' do
|
desc 'Return avatar url for a user' do
|
||||||
|
|
|
@ -32,7 +32,7 @@ module API
|
||||||
params do
|
params do
|
||||||
use :pagination
|
use :pagination
|
||||||
end
|
end
|
||||||
get ":id/badges", urgency: :default do
|
get ":id/badges", urgency: :low do
|
||||||
source = find_source(source_type, params[:id])
|
source = find_source(source_type, params[:id])
|
||||||
|
|
||||||
badges = source.badges
|
badges = source.badges
|
||||||
|
@ -91,7 +91,7 @@ module API
|
||||||
requires :image_url, type: String, desc: 'URL of the badge image'
|
requires :image_url, type: String, desc: 'URL of the badge image'
|
||||||
optional :name, type: String, desc: 'Name for the badge'
|
optional :name, type: String, desc: 'Name for the badge'
|
||||||
end
|
end
|
||||||
post ":id/badges", urgency: :default do
|
post ":id/badges" do
|
||||||
source = find_source_if_admin(source_type)
|
source = find_source_if_admin(source_type)
|
||||||
|
|
||||||
badge = ::Badges::CreateService.new(declared_params(include_missing: false)).execute(source)
|
badge = ::Badges::CreateService.new(declared_params(include_missing: false)).execute(source)
|
||||||
|
|
|
@ -5,6 +5,7 @@ module API
|
||||||
include PaginationParams
|
include PaginationParams
|
||||||
|
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
resource :broadcast_messages do
|
resource :broadcast_messages do
|
||||||
helpers do
|
helpers do
|
||||||
|
|
|
@ -417,7 +417,7 @@ module API
|
||||||
requires :group_access, type: Integer, values: Gitlab::Access.all_values, desc: 'The group access level'
|
requires :group_access, type: Integer, values: Gitlab::Access.all_values, desc: 'The group access level'
|
||||||
optional :expires_at, type: Date, desc: 'Share expiration date'
|
optional :expires_at, type: Date, desc: 'Share expiration date'
|
||||||
end
|
end
|
||||||
post ":id/share", feature_category: :subgroups do
|
post ":id/share", feature_category: :subgroups, urgency: :low do
|
||||||
shared_with_group = find_group!(params[:group_id])
|
shared_with_group = find_group!(params[:group_id])
|
||||||
|
|
||||||
group_link_create_params = {
|
group_link_create_params = {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
module API
|
module API
|
||||||
class UserCounts < ::API::Base
|
class UserCounts < ::API::Base
|
||||||
feature_category :navigation
|
feature_category :navigation
|
||||||
|
urgency :low
|
||||||
|
|
||||||
resource :user_counts do
|
resource :user_counts do
|
||||||
desc 'Return the user specific counts' do
|
desc 'Return the user specific counts' do
|
||||||
|
|
|
@ -10,7 +10,7 @@ module API
|
||||||
|
|
||||||
feature_category :users, ['/users/:id/custom_attributes', '/users/:id/custom_attributes/:key']
|
feature_category :users, ['/users/:id/custom_attributes', '/users/:id/custom_attributes/:key']
|
||||||
|
|
||||||
urgency :high, ['/users/:id/custom_attributes', '/users/:id/custom_attributes/:key']
|
urgency :medium, ['/users/:id/custom_attributes', '/users/:id/custom_attributes/:key']
|
||||||
|
|
||||||
resource :users, requirements: { uid: /[0-9]*/, id: /[0-9]*/ } do
|
resource :users, requirements: { uid: /[0-9]*/, id: /[0-9]*/ } do
|
||||||
include CustomAttributesEndpoints
|
include CustomAttributesEndpoints
|
||||||
|
@ -145,7 +145,7 @@ module API
|
||||||
use :with_custom_attributes
|
use :with_custom_attributes
|
||||||
end
|
end
|
||||||
# rubocop: disable CodeReuse/ActiveRecord
|
# rubocop: disable CodeReuse/ActiveRecord
|
||||||
get ":id", feature_category: :users, urgency: :medium do
|
get ":id", feature_category: :users, urgency: :default do
|
||||||
forbidden!('Not authorized!') unless current_user
|
forbidden!('Not authorized!') unless current_user
|
||||||
|
|
||||||
unless current_user.admin?
|
unless current_user.admin?
|
||||||
|
@ -170,7 +170,7 @@ module API
|
||||||
params do
|
params do
|
||||||
requires :user_id, type: String, desc: 'The ID or username of the user'
|
requires :user_id, type: String, desc: 'The ID or username of the user'
|
||||||
end
|
end
|
||||||
get ":user_id/status", requirements: API::USER_REQUIREMENTS, feature_category: :users, urgency: :high do
|
get ":user_id/status", requirements: API::USER_REQUIREMENTS, feature_category: :users, urgency: :default do
|
||||||
user = find_user(params[:user_id])
|
user = find_user(params[:user_id])
|
||||||
|
|
||||||
not_found!('User') unless user && can?(current_user, :read_user, user)
|
not_found!('User') unless user && can?(current_user, :read_user, user)
|
||||||
|
@ -921,7 +921,7 @@ module API
|
||||||
desc 'Get the currently authenticated user' do
|
desc 'Get the currently authenticated user' do
|
||||||
success Entities::UserPublic
|
success Entities::UserPublic
|
||||||
end
|
end
|
||||||
get feature_category: :users, urgency: :medium do
|
get feature_category: :users, urgency: :default do
|
||||||
entity =
|
entity =
|
||||||
if current_user.admin?
|
if current_user.admin?
|
||||||
Entities::UserWithAdmin
|
Entities::UserWithAdmin
|
||||||
|
|
|
@ -19,6 +19,10 @@ module Backup
|
||||||
def start(type, backup_repos_path, backup_id: nil)
|
def start(type, backup_repos_path, backup_id: nil)
|
||||||
raise Error, 'already started' if started?
|
raise Error, 'already started' if started?
|
||||||
|
|
||||||
|
if type == :create && !incremental?
|
||||||
|
FileUtils.rm_rf(backup_repos_path)
|
||||||
|
end
|
||||||
|
|
||||||
command = case type
|
command = case type
|
||||||
when :create
|
when :create
|
||||||
'create'
|
'create'
|
||||||
|
@ -34,7 +38,7 @@ module Backup
|
||||||
if Feature.enabled?(:incremental_repository_backup)
|
if Feature.enabled?(:incremental_repository_backup)
|
||||||
args += ['-layout', 'pointer']
|
args += ['-layout', 'pointer']
|
||||||
if type == :create
|
if type == :create
|
||||||
args += ['-incremental'] if @incremental
|
args += ['-incremental'] if incremental?
|
||||||
args += ['-id', backup_id] if backup_id
|
args += ['-id', backup_id] if backup_id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -68,6 +72,10 @@ module Backup
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def incremental?
|
||||||
|
@incremental
|
||||||
|
end
|
||||||
|
|
||||||
# Schedule a new backup job through a non-blocking JSON based pipe protocol
|
# Schedule a new backup job through a non-blocking JSON based pipe protocol
|
||||||
#
|
#
|
||||||
# @see https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/gitaly-backup.md
|
# @see https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/gitaly-backup.md
|
||||||
|
|
|
@ -10,7 +10,6 @@ module Sidebars
|
||||||
|
|
||||||
add_item(metrics_dashboard_menu_item)
|
add_item(metrics_dashboard_menu_item)
|
||||||
add_item(logs_menu_item)
|
add_item(logs_menu_item)
|
||||||
add_item(tracing_menu_item)
|
|
||||||
add_item(error_tracking_menu_item)
|
add_item(error_tracking_menu_item)
|
||||||
add_item(alert_management_menu_item)
|
add_item(alert_management_menu_item)
|
||||||
add_item(incidents_menu_item)
|
add_item(incidents_menu_item)
|
||||||
|
@ -72,21 +71,6 @@ module Sidebars
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def tracing_menu_item
|
|
||||||
if !Feature.enabled?(:monitor_tracing, context.project) ||
|
|
||||||
!can?(context.current_user, :read_environment, context.project) ||
|
|
||||||
!can?(context.current_user, :admin_project, context.project)
|
|
||||||
return ::Sidebars::NilMenuItem.new(item_id: :tracing)
|
|
||||||
end
|
|
||||||
|
|
||||||
::Sidebars::MenuItem.new(
|
|
||||||
title: _('Tracing'),
|
|
||||||
link: project_tracing_path(context.project),
|
|
||||||
active_routes: { path: 'tracings#show' },
|
|
||||||
item_id: :tracing
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def error_tracking_menu_item
|
def error_tracking_menu_item
|
||||||
unless can?(context.current_user, :read_sentry_issue, context.project)
|
unless can?(context.current_user, :read_sentry_issue, context.project)
|
||||||
return ::Sidebars::NilMenuItem.new(item_id: :error_tracking)
|
return ::Sidebars::NilMenuItem.new(item_id: :error_tracking)
|
||||||
|
|
|
@ -59,6 +59,16 @@ RSpec.describe Backup::GitalyBackup do
|
||||||
expect(File).to exist(File.join(destination, project_snippet.disk_path, backup_id, '001.bundle'))
|
expect(File).to exist(File.join(destination, project_snippet.disk_path, backup_id, '001.bundle'))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'erases any existing repository backups' do
|
||||||
|
existing_file = File.join(destination, 'some_existing_file')
|
||||||
|
IO.write(existing_file, "Some existing file.\n")
|
||||||
|
|
||||||
|
subject.start(:create, destination, backup_id: backup_id)
|
||||||
|
subject.finish!
|
||||||
|
|
||||||
|
expect(File).not_to exist(existing_file)
|
||||||
|
end
|
||||||
|
|
||||||
context 'parallel option set' do
|
context 'parallel option set' do
|
||||||
let(:max_parallelism) { 3 }
|
let(:max_parallelism) { 3 }
|
||||||
|
|
||||||
|
|
|
@ -82,20 +82,6 @@ RSpec.describe Sidebars::Projects::Menus::MonitorMenu do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Tracing' do
|
|
||||||
let(:item_id) { :tracing }
|
|
||||||
|
|
||||||
it_behaves_like 'access rights checks'
|
|
||||||
|
|
||||||
context 'when feature disabled' do
|
|
||||||
before do
|
|
||||||
stub_feature_flags(monitor_tracing: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
specify { is_expected.to be_nil }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'Error Tracking' do
|
describe 'Error Tracking' do
|
||||||
let(:item_id) { :error_tracking }
|
let(:item_id) { :error_tracking }
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,32 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do
|
||||||
expect(root_storage_statistics.uploads_size).to eq(total_uploads_size)
|
expect(root_storage_statistics.uploads_size).to eq(total_uploads_size)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'aggregates container_repositories_size and storage_size' do
|
||||||
|
allow(namespace).to receive(:container_repositories_size).and_return(999)
|
||||||
|
|
||||||
|
root_storage_statistics.recalculate!
|
||||||
|
|
||||||
|
root_storage_statistics.reload
|
||||||
|
|
||||||
|
total_storage_size = project_stat1.storage_size + project_stat2.storage_size + 999
|
||||||
|
|
||||||
|
expect(root_storage_statistics.container_registry_size).to eq(999)
|
||||||
|
expect(root_storage_statistics.storage_size).to eq(total_storage_size)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not aggregate container_repositories_size when FF is disabled' do
|
||||||
|
stub_feature_flags(container_registry_namespace_statistics: false)
|
||||||
|
|
||||||
|
root_storage_statistics.recalculate!
|
||||||
|
|
||||||
|
root_storage_statistics.reload
|
||||||
|
|
||||||
|
total_storage_size = project_stat1.storage_size + project_stat2.storage_size
|
||||||
|
|
||||||
|
expect(root_storage_statistics.container_registry_size).to eq(0)
|
||||||
|
expect(root_storage_statistics.storage_size).to eq(total_storage_size)
|
||||||
|
end
|
||||||
|
|
||||||
it 'works when there are no projects' do
|
it 'works when there are no projects' do
|
||||||
Project.delete_all
|
Project.delete_all
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,6 @@ RSpec.shared_context 'project navbar structure' do
|
||||||
nav_sub_items: [
|
nav_sub_items: [
|
||||||
_('Metrics'),
|
_('Metrics'),
|
||||||
_('Logs'),
|
_('Logs'),
|
||||||
_('Tracing'),
|
|
||||||
_('Error Tracking'),
|
_('Error Tracking'),
|
||||||
_('Alerts'),
|
_('Alerts'),
|
||||||
_('Incidents'),
|
_('Incidents'),
|
||||||
|
|
|
@ -437,32 +437,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Tracing' do
|
|
||||||
it 'has a link to the tracing page' do
|
|
||||||
render
|
|
||||||
|
|
||||||
expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'without project.tracing_external_url' do
|
|
||||||
it 'has a link to the tracing page' do
|
|
||||||
render
|
|
||||||
|
|
||||||
expect(rendered).to have_link('Tracing', href: project_tracing_path(project))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'when the user does not have access' do
|
|
||||||
let(:user) { nil }
|
|
||||||
|
|
||||||
it 'does not have a link to the tracing page' do
|
|
||||||
render
|
|
||||||
|
|
||||||
expect(rendered).not_to have_text 'Tracing'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'Error Tracking' do
|
describe 'Error Tracking' do
|
||||||
it 'has a link to the error tracking page' do
|
it 'has a link to the error tracking page' do
|
||||||
render
|
render
|
||||||
|
|
Loading…
Reference in New Issue