From 6f5b1492ab0eb74f7594a97d94c10199708c7fd3 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 19 Feb 2021 00:11:06 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- GITALY_SERVER_VERSION | 2 +- .../boards/components/config_toggle.vue | 64 +++++++++++ .../javascripts/boards/config_toggle.js | 25 +++- app/assets/javascripts/boards/index.js | 2 +- .../pages/projects/tags/new/index.js | 8 +- app/graphql/types/mutation_type.rb | 1 + app/models/list.rb | 1 + app/serializers/current_board_entity.rb | 2 + app/services/boards/lists/list_service.rb | 21 +++- app/views/admin/groups/_group.html.haml | 2 +- app/views/admin/projects/_projects.html.haml | 2 +- .../shared/issuable/_search_bar.html.haml | 2 +- .../unreleased/btn-default-admin-edit.yml | 5 + doc/.vale/gitlab/spelling-exceptions.txt | 13 +++ doc/README.md | 2 +- doc/administration/consul.md | 2 +- doc/administration/raketasks/github_import.md | 4 +- .../github_integration.md | 2 +- doc/ci/cloud_deployment/index.md | 2 +- doc/ci/docker/using_docker_build.md | 2 +- doc/ci/environments/index.md | 2 +- doc/ci/environments/protected_environments.md | 2 +- .../index.md | 6 +- .../end_to_end_testing_webdriverio/index.md | 3 +- .../laravel_with_gitlab_and_envoy/index.md | 2 +- doc/development/agent/user_stories.md | 2 +- doc/development/api_graphql_styleguide.md | 2 +- doc/development/cicd/templates.md | 2 +- .../contributing/issue_workflow.md | 2 +- doc/development/distributed_tracing.md | 2 +- doc/development/documentation/testing.md | 6 +- doc/development/go_guide/index.md | 14 +-- doc/development/image_scaling.md | 2 +- .../secure_partner_integration.md | 2 +- .../namespaces_storage_statistics.md | 6 +- .../new_fe_guide/development/components.md | 2 +- doc/development/performance.md | 8 +- doc/development/pipelines.md | 2 +- doc/development/query_performance.md | 2 +- doc/development/redis.md | 9 +- doc/development/secure_coding_guidelines.md | 2 +- doc/development/sidekiq_style_guide.md | 2 +- .../testing_guide/best_practices.md | 5 +- .../testing_guide/frontend_testing.md | 6 +- doc/development/usage_ping.md | 4 +- doc/gitlab-basics/index.md | 2 +- doc/integration/saml.md | 20 ++-- doc/intro/index.md | 2 +- doc/ssh/README.md | 6 +- doc/topics/autodevops/customize.md | 60 +++++----- .../img/alexj_autodevops_min_v13_8.png | Bin 20836 -> 0 bytes .../img/kai_autodevops_min_v13_8.png | Bin 39770 -> 0 bytes doc/topics/autodevops/index.md | 15 +-- doc/topics/autodevops/quick_start_guide.md | 6 +- doc/topics/autodevops/requirements.md | 8 +- doc/topics/autodevops/stages.md | 28 ++--- .../upgrading_auto_deploy_dependencies.md | 8 +- doc/user/admin_area/index.md | 2 +- .../security_dashboard/index.md | 2 +- doc/user/clusters/applications.md | 4 +- doc/user/group/img/groups.png | Bin 61507 -> 0 bytes doc/user/group/index.md | 108 +++++++----------- doc/user/project/clusters/add_eks_clusters.md | 2 +- .../quick_start_guide.md | 2 +- .../quick_start_guide.md | 2 +- .../project/merge_requests/getting_started.md | 14 ++- .../merge_requests/merge_request_approvals.md | 4 +- locale/gitlab.pot | 3 + qa/qa/page/component/issue_board/show.rb | 8 ++ rubocop/rubocop-migrations.yml | 1 + spec/graphql/mutations/boards/update_spec.rb | 57 +++++++++ spec/models/list_spec.rb | 13 +++ .../boards/lists/list_service_spec.rb | 22 ++++ 73 files changed, 430 insertions(+), 230 deletions(-) create mode 100644 app/assets/javascripts/boards/components/config_toggle.vue create mode 100644 changelogs/unreleased/btn-default-admin-edit.yml delete mode 100644 doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png delete mode 100644 doc/topics/autodevops/img/kai_autodevops_min_v13_8.png delete mode 100644 doc/user/group/img/groups.png create mode 100644 spec/graphql/mutations/boards/update_spec.rb diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index fe38662db7c..39fefde6b60 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -4e5fe176e6b36866ba305e5af1ca494b031cadc8 +ec5dd7b3c441c744e4b74a083deec1f41435cb71 diff --git a/app/assets/javascripts/boards/components/config_toggle.vue b/app/assets/javascripts/boards/components/config_toggle.vue new file mode 100644 index 00000000000..7ec99e51f5b --- /dev/null +++ b/app/assets/javascripts/boards/components/config_toggle.vue @@ -0,0 +1,64 @@ + + + diff --git a/app/assets/javascripts/boards/config_toggle.js b/app/assets/javascripts/boards/config_toggle.js index 2d1ec238274..7f327c5764d 100644 --- a/app/assets/javascripts/boards/config_toggle.js +++ b/app/assets/javascripts/boards/config_toggle.js @@ -1 +1,24 @@ -export default () => {}; +import Vue from 'vue'; +import { parseBoolean } from '~/lib/utils/common_utils'; +import ConfigToggle from './components/config_toggle.vue'; + +export default (boardsStore) => { + const el = document.querySelector('.js-board-config'); + + if (!el) { + return; + } + + gl.boardConfigToggle = new Vue({ + el, + render(h) { + return h(ConfigToggle, { + props: { + boardsStore, + canAdminList: parseBoolean(el.dataset.canAdminList), + hasScope: parseBoolean(el.dataset.hasScope), + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js index 859295318ed..f9dfa60a59b 100644 --- a/app/assets/javascripts/boards/index.js +++ b/app/assets/javascripts/boards/index.js @@ -6,7 +6,6 @@ import 'ee_else_ce/boards/models/issue'; import 'ee_else_ce/boards/models/list'; import BoardSidebar from 'ee_else_ce/boards/components/board_sidebar'; import initNewListDropdown from 'ee_else_ce/boards/components/new_list_dropdown'; -import boardConfigToggle from 'ee_else_ce/boards/config_toggle'; import { setWeightFetchingState, setEpicFetchingState, @@ -40,6 +39,7 @@ import { } from '~/lib/utils/common_utils'; import { __ } from '~/locale'; import sidebarEventHub from '~/sidebar/event_hub'; +import boardConfigToggle from './config_toggle'; import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher'; Vue.use(VueApollo); diff --git a/app/assets/javascripts/pages/projects/tags/new/index.js b/app/assets/javascripts/pages/projects/tags/new/index.js index 11a19a673b1..b071e7a45fc 100644 --- a/app/assets/javascripts/pages/projects/tags/new/index.js +++ b/app/assets/javascripts/pages/projects/tags/new/index.js @@ -3,8 +3,6 @@ import GLForm from '../../../../gl_form'; import RefSelectDropdown from '../../../../ref_select_dropdown'; import ZenMode from '../../../../zen_mode'; -document.addEventListener('DOMContentLoaded', () => { - new ZenMode(); // eslint-disable-line no-new - new GLForm($('.tag-form')); // eslint-disable-line no-new - new RefSelectDropdown($('.js-branch-select')); // eslint-disable-line no-new -}); +new ZenMode(); // eslint-disable-line no-new +new GLForm($('.tag-form')); // eslint-disable-line no-new +new RefSelectDropdown($('.js-branch-select')); // eslint-disable-line no-new diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb index 166f5617da2..cf583131ed0 100644 --- a/app/graphql/types/mutation_type.rb +++ b/app/graphql/types/mutation_type.rb @@ -24,6 +24,7 @@ module Types mount_mutation Mutations::AwardEmojis::Toggle mount_mutation Mutations::Boards::Create mount_mutation Mutations::Boards::Destroy + mount_mutation Mutations::Boards::Update mount_mutation Mutations::Boards::Issues::IssueMoveList mount_mutation Mutations::Boards::Lists::Create mount_mutation Mutations::Boards::Lists::Update diff --git a/app/models/list.rb b/app/models/list.rb index 49834af3dfb..5bd00a1d7ef 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -14,6 +14,7 @@ class List < ApplicationRecord validates :label_id, uniqueness: { scope: :board_id }, if: :label? scope :preload_associated_models, -> { preload(:board, label: :priorities) } + scope :without_types, ->(list_types) { where.not(list_type: list_types) } alias_method :preferences, :list_user_preferences diff --git a/app/serializers/current_board_entity.rb b/app/serializers/current_board_entity.rb index f9d6691dc84..08f31bc698f 100644 --- a/app/serializers/current_board_entity.rb +++ b/app/serializers/current_board_entity.rb @@ -3,6 +3,8 @@ class CurrentBoardEntity < Grape::Entity expose :id expose :name + expose :hide_backlog_list + expose :hide_closed_list end CurrentBoardEntity.prepend_if_ee('EE::CurrentBoardEntity') diff --git a/app/services/boards/lists/list_service.rb b/app/services/boards/lists/list_service.rb index e4c789c4597..3c296cde51e 100644 --- a/app/services/boards/lists/list_service.rb +++ b/app/services/boards/lists/list_service.rb @@ -9,7 +9,26 @@ module Boards end lists = board.lists.preload_associated_models - params[:list_id].present? ? lists.where(id: params[:list_id]) : lists # rubocop: disable CodeReuse/ActiveRecord + + return lists.id_in(params[:list_id]) if params[:list_id].present? + + list_types = unavailable_list_types_for(board) + lists.without_types(list_types) + end + + private + + def unavailable_list_types_for(board) + hidden_lists_for(board) + end + + def hidden_lists_for(board) + hidden = [] + + hidden << ::List.list_types[:backlog] if board.hide_backlog_list + hidden << ::List.list_types[:closed] if board.hide_closed_list + + hidden end end end diff --git a/app/views/admin/groups/_group.html.haml b/app/views/admin/groups/_group.html.haml index dc122d74e90..df7af86e089 100644 --- a/app/views/admin/groups/_group.html.haml +++ b/app/views/admin/groups/_group.html.haml @@ -33,5 +33,5 @@ = visibility_level_icon(group.visibility_level) .controls.gl-flex-shrink-0.gl-ml-5 - = link_to _('Edit'), admin_group_edit_path(group), id: "edit_#{dom_id(group)}", class: 'gl-button btn' + = link_to _('Edit'), admin_group_edit_path(group), id: "edit_#{dom_id(group)}", class: 'btn gl-button btn-default' = link_to _('Delete'), [:admin, group], data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name } }, method: :delete, class: 'gl-button btn btn-danger' diff --git a/app/views/admin/projects/_projects.html.haml b/app/views/admin/projects/_projects.html.haml index 4131c8b7edd..c2e40413a14 100644 --- a/app/views/admin/projects/_projects.html.haml +++ b/app/views/admin/projects/_projects.html.haml @@ -4,7 +4,7 @@ - @projects.each_with_index do |project| %li.project-row{ class: ('no-description' if project.description.blank?) } .controls - = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "gl-button btn" + = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button btn-default" %button.delete-project-button.gl-button.btn.btn-danger{ data: { delete_project_url: admin_project_path(project), project_name: project.name } } = s_('AdminProjects|Delete') diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml index d1e74cc771e..b82cfc86e26 100644 --- a/app/views/shared/issuable/_search_bar.html.haml +++ b/app/views/shared/issuable/_search_bar.html.haml @@ -195,7 +195,7 @@ #js-board-labels-toggle - if current_user #js-board-epics-swimlanes-toggle - .js-board-config{ data: { can_admin_list: user_can_admin_list, has_scope: board.scoped? } } + .js-board-config{ data: { can_admin_list: user_can_admin_list.to_s, has_scope: board.scoped?.to_s } } - if user_can_admin_list - if Feature.enabled?(:board_new_list, board.resource_parent, default_enabled: :yaml) .js-create-column-trigger{ data: board_list_data } diff --git a/changelogs/unreleased/btn-default-admin-edit.yml b/changelogs/unreleased/btn-default-admin-edit.yml new file mode 100644 index 00000000000..cc6e7c8898f --- /dev/null +++ b/changelogs/unreleased/btn-default-admin-edit.yml @@ -0,0 +1,5 @@ +--- +title: Add btn-default class for edit buttons in admin projects and groups +merge_request: 53453 +author: +type: other diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt index bd26699d92b..76037d9aa86 100644 --- a/doc/.vale/gitlab/spelling-exceptions.txt +++ b/doc/.vale/gitlab/spelling-exceptions.txt @@ -41,6 +41,7 @@ autoscales autoscaling awardable awardables +Ayoa Axios Azure B-tree @@ -111,6 +112,8 @@ Contentful Corosync Coursier cron +cronjob +cronjobs crons crontab crontabs @@ -280,6 +283,7 @@ kaniko Karma Kerberos keyset +keyspace keytab keytabs Kibana @@ -350,6 +354,7 @@ mixins mockup mockups ModSecurity +Monokai monorepo monorepos multiline @@ -408,6 +413,7 @@ pooler postgres.ai PostgreSQL precompile +precompiled preconfigure preconfigured preconfigures @@ -445,6 +451,7 @@ queryable Quicktime Rackspace Raspbian +rbtrace Rdoc reachability Realplayer @@ -479,6 +486,7 @@ reinitialize reinitializing relicensing remediations +replicables repmgr repmgrd repurposing @@ -521,6 +529,7 @@ Salesforce sandboxing sanitization sbt +scalers scatterplot scatterplots Schemastore @@ -546,6 +555,7 @@ Slackbot Slony smartcard smartcards +snapshotting Sobelow Solarized Sourcegraph @@ -564,6 +574,7 @@ strace strikethrough strikethroughs stunnel +stylelint subfolder subfolders subgraph @@ -629,6 +640,7 @@ toolkit toolkits tooltip tooltips +transactionally transpile transpiled transpiles @@ -637,6 +649,7 @@ Trello triaged triages triaging +Trivy truthy Truststore Twilio diff --git a/doc/README.md b/doc/README.md index 4c4b0cd3a15..8dd6354b388 100644 --- a/doc/README.md +++ b/doc/README.md @@ -67,7 +67,7 @@ We have the following documentation to rapidly uplift your GitLab knowledge: | Topic | Description | |:--------------------------------------------------------------------------------------------------|:------------| | [GitLab basics guides](gitlab-basics/index.md) | Start working on the command line and with GitLab. | -| [GitLab workflow overview](https://about.gitlab.com/blog/2016/10/25/gitlab-workflow-an-overview/) | Enhance your workflow with the best of GitLab Workflow. | +| [GitLab workflow overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/) | Enhance your workflow with the best of GitLab Workflow. | | [Get started with GitLab CI/CD](ci/quick_start/index.md) | Quickly implement GitLab CI/CD. | | [Auto DevOps](topics/autodevops/index.md) | Learn more about Auto DevOps in GitLab. | | [GitLab Markdown](user/markdown.md) | Advanced formatting system (GitLab Flavored Markdown). | diff --git a/doc/administration/consul.md b/doc/administration/consul.md index dfc859e30c2..926267a414a 100644 --- a/doc/administration/consul.md +++ b/doc/administration/consul.md @@ -146,7 +146,7 @@ sudo gitlab-ctl restart consul ### Consul nodes unable to communicate By default, Consul will attempt to -[bind](https://www.consul.io/docs/agent/options.html#_bind) to `0.0.0.0`, but +[bind](https://www.consul.io/docs/agent/options#_bind) to `0.0.0.0`, but it will advertise the first private IP address on the node for other Consul nodes to communicate with it. If the other nodes cannot communicate with a node on this address, then the cluster will have a failed status. diff --git a/doc/administration/raketasks/github_import.md b/doc/administration/raketasks/github_import.md index c29865be56c..0338732e886 100644 --- a/doc/administration/raketasks/github_import.md +++ b/doc/administration/raketasks/github_import.md @@ -19,8 +19,8 @@ before/after the brackets. Also, some shells (for example, `zsh`) can interpret ## Caveats -If the GitHub [rate limit](https://docs.github.com/v3/#rate-limiting) is reached while importing, -the importing process waits (`sleep()`) until it can continue importing. +If the GitHub [rate limit](https://docs.github.com/en/rest/reference/rate-limit) is reached while +importing, the importing process waits (`sleep()`) until it can continue importing. ## Importing multiple projects diff --git a/doc/ci/ci_cd_for_external_repos/github_integration.md b/doc/ci/ci_cd_for_external_repos/github_integration.md index 2a8b050b224..deadc4458a2 100644 --- a/doc/ci/ci_cd_for_external_repos/github_integration.md +++ b/doc/ci/ci_cd_for_external_repos/github_integration.md @@ -22,7 +22,7 @@ cannot be used to authenticate with GitHub as an external CI/CD repository. ## Connect with Personal Access Token Personal access tokens can only be used to connect GitHub.com -repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/access-permissions-on-github). +repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/github/getting-started-with-github/access-permissions-on-github). To perform a one-off authorization with GitHub to grant GitLab access your repositories: diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md index ccacb3c61d3..cb1345a18e4 100644 --- a/doc/ci/cloud_deployment/index.md +++ b/doc/ci/cloud_deployment/index.md @@ -319,4 +319,4 @@ For a video walkthrough of this configuration process, see [Auto Deploy to EC2]( ## Deploy to Google Cloud -- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/solutions/google-cloud-platform/) +- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/partners/technology-partners/google-cloud-platform/) diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md index 121bfca38c4..01a58fa73f6 100644 --- a/doc/ci/docker/using_docker_build.md +++ b/doc/ci/docker/using_docker_build.md @@ -872,4 +872,4 @@ If: - This is the first time setting it up, carefully read [using Docker in Docker workflow](#use-the-docker-executor-with-the-docker-image-docker-in-docker). - You are upgrading from v18.09 or earlier, read our - [upgrade guide](https://about.gitlab.com/releases/2019/07/31/docker-in-docker-with-docker-19-dot-03/). + [upgrade guide](https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03/). diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md index b49fcd72172..c11643c2405 100644 --- a/doc/ci/environments/index.md +++ b/doc/ci/environments/index.md @@ -1069,7 +1069,7 @@ Re-using variables defined inside `script` as part of the environment name doesn Below are some links you may find interesting: - [The `.gitlab-ci.yml` definition of environments](../yaml/README.md#environment) -- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/) +- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/) - [Review Apps - Use dynamic environments to deploy your code for every branch](../review_apps/index.md) - [Deploy Boards for your applications running on Kubernetes](../../user/project/deploy_boards.md) diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md index 2636e59723a..b52c2701daf 100644 --- a/doc/ci/environments/protected_environments.md +++ b/doc/ci/environments/protected_environments.md @@ -70,7 +70,7 @@ Alternatively, you can use the API to protect an environment: name: ${CI_JOB_NAME} ``` -1. Use the UI to [create a new group](../../user/group/index.md#create-a-new-group). +1. Use the UI to [create a new group](../../user/group/index.md#create-a-group). For example, this group is called `protected-access-group` and has the group ID `9899826`. Note that the rest of the examples in these steps use this group. diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md index c1868d4df3a..a5024e8a65f 100644 --- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md +++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md @@ -7,8 +7,6 @@ type: tutorial # Authenticating and Reading Secrets With HashiCorp Vault -> HashiCorp Vault JWT token support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294440) in GitLab 13.9. - This tutorial demonstrates how to authenticate, configure, and read secrets with HashiCorp's Vault from GitLab CI/CD. NOTE: @@ -56,8 +54,8 @@ The JWT's payload looks like this: "ref": "auto-deploy-2020-04-01", # Git ref for this job "ref_type": "branch", # Git ref type, branch or tag "ref_protected": "true", # true if this git ref is protected, false otherwise - "environment": "production", # Environment this job deploys to, if present - "environment_protected": "true" # true if deployed environment is protected, false otherwise + "environment": "production", # Environment this job deploys to, if present (GitLab 13.9 and later) + "environment_protected": "true" # true if deployed environment is protected, false otherwise (GitLab 13.9 and later) } ``` diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/index.md index e20e86e8936..1b375a3cac8 100644 --- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md +++ b/doc/ci/examples/end_to_end_testing_webdriverio/index.md @@ -10,6 +10,7 @@ description: 'Confidence checking your entire app every time a new feature is ad --- + # End-to-end testing with GitLab CI/CD and WebdriverIO @@ -83,7 +84,7 @@ multiple tests, such as making sure you are logged in. The function `it` defines an individual test. [The `browser` object](https://webdriver.io/guide/testrunner/browserobject.html) is WebdriverIO's -special sauce. It provides most of [the WebdriverIO API methods](https://webdriver.io/api.html) that are the key to +special sauce. It provides most of [the WebdriverIO API methods](https://webdriver.io/docs/api/) that are the key to steering the browser. In this case, we can use [`browser.url`](https://webdriver.io/api/protocol/url.html) to visit `/page-that-does-not-exist` to hit our 404 page. We can then use [`browser.getUrl`](https://webdriver.io/api/property/getUrl.html) diff --git a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md index de79de16242..2acd7315630 100644 --- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md +++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md @@ -619,7 +619,7 @@ deploy_production: - master ``` -You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/), to final test your application before deploying to production. +You may also want to add another job for [staging environment](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/), to final test your application before deploying to production. ### Turn on GitLab CI/CD diff --git a/doc/development/agent/user_stories.md b/doc/development/agent/user_stories.md index 609be47a3cb..ab135cad9d3 100644 --- a/doc/development/agent/user_stories.md +++ b/doc/development/agent/user_stories.md @@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w # Kubernetes Agent user stories **(PREMIUM SELF)** -The [personas in action](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#user-personas) +The [personas in action](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#user-personas) for the Kubernetes Agent are: - [Sasha, the Software Developer](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#sasha-software-developer). diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md index 85098689392..f32aaf6ffa8 100644 --- a/doc/development/api_graphql_styleguide.md +++ b/doc/development/api_graphql_styleguide.md @@ -13,7 +13,7 @@ This document outlines the style guide for the GitLab [GraphQL API](../api/graph We use the [GraphQL Ruby gem](https://graphql-ruby.org/) written by [Robert Mosolgo](https://github.com/rmosolgo/). -In addition, we have a subscription to [GraphQL Pro](https://www.graphql.pro). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md). +In addition, we have a subscription to [GraphQL Pro](https://graphql.pro/). For details see [GraphQL Pro subscription](graphql_guide/graphql_pro.md). All GraphQL queries are directed to a single endpoint ([`app/controllers/graphql_controller.rb#execute`](https://gitlab.com/gitlab-org/gitlab/blob/master/app%2Fcontrollers%2Fgraphql_controller.rb)), diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md index 94b03634e25..df32c310899 100644 --- a/doc/development/cicd/templates.md +++ b/doc/development/cicd/templates.md @@ -88,7 +88,7 @@ for example `Jobs/Deploy.gitlab-ci.yml`. You can make a new stable template by copying [the latest template](#latest-version) available in a major milestone release of GitLab like `13.0`. All breaking changes must be announced in a blog post before the official release, for example -[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/releases/2020/05/06/gitlab-com-13-0-breaking-changes/) +[GitLab.com is moving to 13.0, with narrow breaking changes](https://about.gitlab.com/blog/2020/05/06/gitlab-com-13-0-breaking-changes/) You can change a stable template version in a minor GitLab release like `13.1` if: diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md index da38d1e73b4..25ab931e236 100644 --- a/doc/development/contributing/issue_workflow.md +++ b/doc/development/contributing/issue_workflow.md @@ -181,7 +181,7 @@ For instance, the "DevOps Report" category is represented by the `devops_reports.name` value is "DevOps Reports". If a category's label doesn't respect this naming convention, it should be specified -with [the `label` attribute](https://about.gitlab.com/handbook/marketing/website/#category-attributes) +with [the `label` attribute](https://about.gitlab.com/handbook/marketing/inbound-marketing/digital-experience/website/#category-attributes) in . ### Feature labels diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md index eb20e721e46..17967c5f63c 100644 --- a/doc/development/distributed_tracing.md +++ b/doc/development/distributed_tracing.md @@ -206,7 +206,7 @@ If `GITLAB_TRACING` is not configured correctly, this issue is logged: By default, GitLab ships with the Jaeger tracer, but other tracers can be included at compile time. Details of how this can be done are included in the [LabKit tracing -documentation](https://godoc.org/gitlab.com/gitlab-org/labkit/tracing). +documentation](https://pkg.go.dev/gitlab.com/gitlab-org/labkit/tracing). If no log messages about tracing are emitted, the `GITLAB_TRACING` environment variable is likely not set. diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md index f3d6e0a5c71..eed544911cb 100644 --- a/doc/development/documentation/testing.md +++ b/doc/development/documentation/testing.md @@ -272,7 +272,11 @@ To configure Vale in your editor, install one of the following as appropriate: In the extension's settings: - Select the **Use CLI** checkbox. - - In the **Config** setting, enter an absolute path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini) in one of the cloned GitLab repositories on your computer. + - In the **Config** setting, enter an absolute + path to [`.vale.ini`](https://gitlab.com/gitlab-org/gitlab/blob/master/.vale.ini) + in one of the cloned GitLab repositories on your computer. + + - In the **Path** setting, enter the absolute path to the Vale binary. In most cases, `vale` should work. To find the location, run `which vale` in a terminal. diff --git a/doc/development/go_guide/index.md b/doc/development/go_guide/index.md index f352db918ed..a6d9ba861b0 100644 --- a/doc/development/go_guide/index.md +++ b/doc/development/go_guide/index.md @@ -202,9 +202,9 @@ code readability and test output. ### Better output in tests When comparing expected and actual values in tests, use -[`testify/require.Equal`](https://godoc.org/github.com/stretchr/testify/require#Equal), -[`testify/require.EqualError`](https://godoc.org/github.com/stretchr/testify/require#EqualError), -[`testify/require.EqualValues`](https://godoc.org/github.com/stretchr/testify/require#EqualValues), +[`testify/require.Equal`](https://pkg.go.dev/github.com/stretchr/testify/require#Equal), +[`testify/require.EqualError`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualError), +[`testify/require.EqualValues`](https://pkg.go.dev/github.com/stretchr/testify/require#EqualValues), and others to improve readability when comparing structs, errors, large portions of text, or JSON documents: @@ -363,12 +363,12 @@ There are a few guidelines one should follow when using the [Logrus](https://github.com/sirupsen/logrus) package: - When printing an error use - [WithError](https://godoc.org/github.com/sirupsen/logrus#WithError). For + [WithError](https://pkg.go.dev/github.com/sirupsen/logrus#WithError). For example, `logrus.WithError(err).Error("Failed to do something")`. - Since we use [structured logging](#structured-json-logging) we can log fields in the context of that code path, such as the URI of the request using - [`WithField`](https://godoc.org/github.com/sirupsen/logrus#WithField) or - [`WithFields`](https://godoc.org/github.com/sirupsen/logrus#WithFields). For + [`WithField`](https://pkg.go.dev/github.com/sirupsen/logrus#WithField) or + [`WithFields`](https://pkg.go.dev/github.com/sirupsen/logrus#WithFields). For example, `logrus.WithField("file", "/app/go").Info("Opening dir")`. If you have to log multiple keys, always use `WithFields` instead of calling `WithField` more than once. @@ -488,7 +488,7 @@ The following are some style guidelines that are specific to the Secure Team. ### Code style and format Use `goimports -local gitlab.com/gitlab-org` before committing. -[`goimports`](https://godoc.org/golang.org/x/tools/cmd/goimports) +[`goimports`](https://pkg.go.dev/golang.org/x/tools/cmd/goimports) is a tool that automatically formats Go source code using [`Gofmt`](https://golang.org/cmd/gofmt/), in addition to formatting import lines, adding missing ones and removing unreferenced ones. diff --git a/doc/development/image_scaling.md b/doc/development/image_scaling.md index d447b6baf57..79687b66711 100644 --- a/doc/development/image_scaling.md +++ b/doc/development/image_scaling.md @@ -73,7 +73,7 @@ we simply follow the path we take to serve any ordinary upload. ### Workhorse Assuming Rails decided the request to be valid, Workhorse will take over. Upon receiving the `send-scaled-image` -instruction through the Rails response, a [special response injecter](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go) +instruction through the Rails response, a [special response injector](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go) will be invoked that knows how to rescale images. The only inputs it requires are the location of the image (a path if the image resides in block storage, or a URL to remote storage otherwise) and the desired width. Workhorse will handle the location transparently so Rails does not need to be concerned with where the image diff --git a/doc/development/integrations/secure_partner_integration.md b/doc/development/integrations/secure_partner_integration.md index 364e18ad015..9c7dc752e4f 100644 --- a/doc/development/integrations/secure_partner_integration.md +++ b/doc/development/integrations/secure_partner_integration.md @@ -13,7 +13,7 @@ guidelines so you can build an integration that fits with the workflow GitLab users are already familiar with. This page also provides resources for the technical work associated -with [onboarding as a partner](https://about.gitlab.com/partners/integrate/). +with [onboarding as a partner](https://about.gitlab.com/partners/technology-partners/integrate/). The steps below are a high-level view of what needs to be done to complete an integration as well as linking to more detailed resources for how to do so. diff --git a/doc/development/namespaces_storage_statistics.md b/doc/development/namespaces_storage_statistics.md index 373b1e38dfc..587e1091e77 100644 --- a/doc/development/namespaces_storage_statistics.md +++ b/doc/development/namespaces_storage_statistics.md @@ -140,7 +140,7 @@ Even though this approach would make aggregating much easier, it has some major - We'd have to migrate **all namespaces** by adding and filling a new column. Because of the size of the table, dealing with time/cost would be significant. The background migration would take approximately `153h`, see . - Background migration has to be shipped one release before, delaying the functionality by another milestone. -### Attempt E (final): Update the namespace storage statistics in async way +### Attempt E (final): Update the namespace storage statistics asynchronously This approach consists of continuing to use the incremental statistics updates we already have, but we refresh them through Sidekiq jobs and in different transactions: @@ -149,7 +149,7 @@ but we refresh them through Sidekiq jobs and in different transactions: 1. Whenever the statistics of a project changes, insert a row into `namespace_aggregation_schedules` - We don't insert a new row if there's already one related to the root namespace. - Keeping in mind the length of the transaction that involves updating `project_statistics`(), the insertion should be done in a different transaction and through a Sidekiq Job. -1. After inserting the row, we schedule another worker to be executed async at two different moments: +1. After inserting the row, we schedule another worker to be executed asynchronously at two different moments: - One enqueued for immediate execution and another one scheduled in `1.5h` hours. - We only schedule the jobs, if we can obtain a `1.5h` lease on Redis on a key based on the root namespace ID. - If we can't obtain the lease, it indicates there's another aggregation already in progress, or scheduled in no more than `1.5h`. @@ -161,7 +161,7 @@ but we refresh them through Sidekiq jobs and in different transactions: This implementation has the following benefits: -- All the updates are done async, so we're not increasing the length of the transactions for `project_statistics`. +- All the updates are done asynchronously, so we're not increasing the length of the transactions for `project_statistics`. - We're doing the update in a single SQL query. - It is compatible with PostgreSQL and MySQL. - No background migration required. diff --git a/doc/development/new_fe_guide/development/components.md b/doc/development/new_fe_guide/development/components.md index 1d56419028e..ec714c9c26f 100644 --- a/doc/development/new_fe_guide/development/components.md +++ b/doc/development/new_fe_guide/development/components.md @@ -19,7 +19,7 @@ D3 is very popular across many projects outside of GitLab: - [The New York Times](https://archive.nytimes.com/www.nytimes.com/interactive/2012/02/13/us/politics/2013-budget-proposal-graphic.html) - [plot.ly](https://plotly.com/) -- [Droptask](https://www.ayoa.com/previously-droptask/) +- [Ayoa](https://www.ayoa.com/previously-droptask/) Within GitLab, D3 has been used for the following notable features diff --git a/doc/development/performance.md b/doc/development/performance.md index 3b4525dc8ee..f2e3bcf2877 100644 --- a/doc/development/performance.md +++ b/doc/development/performance.md @@ -256,7 +256,7 @@ The following configuration options can be configured: - `STACKPROF_MODE`: See [sampling modes](https://github.com/tmm1/stackprof#sampling). Defaults to `cpu`. - `STACKPROF_INTERVAL`: Sampling interval. Unit semantics depend on `STACKPROF_MODE`. - For `object` mode this is a per-event interval (every `n`th event is sampled) + For `object` mode this is a per-event interval (every `nth` event is sampled) and defaults to `1000`. For other modes such as `cpu` this is a frequency and defaults to `10000` μs (100hz). - `STACKPROF_FILE_PREFIX`: File path prefix where profiles are stored. Defaults @@ -293,7 +293,7 @@ worker processes), selecting the latter. For Sidekiq, the signal can be sent to the `sidekiq-cluster` process via `pkill -USR2 bin/sidekiq-cluster`, which forwards the signal to all Sidekiq -children. Alternatively, you can also select a specific pid of interest. +children. Alternatively, you can also select a specific PID of interest. Production profiles can be especially noisy. It can be helpful to visualize them as a [flame graph](https://github.com/brendangregg/FlameGraph). This can be done @@ -306,7 +306,7 @@ bundle exec stackprof --stackcollapse /tmp/stackprof.55769.c6c3906452.profile | ## RSpec profiling The GitLab development environment also includes the -[rspec_profiling](https://github.com/foraker/rspec_profiling) gem, which is used +[`rspec_profiling`](https://github.com/foraker/rspec_profiling) gem, which is used to collect data on spec execution times. This is useful for analyzing the performance of the test suite itself, or seeing how the performance of a spec may have changed over time. @@ -409,7 +409,7 @@ Fragmented Ruby heap snapshot could look like this: ![Ruby heap fragmentation](img/memory_ruby_heap_fragmentation.png) -Memory fragmentation could be reduced by tuning GC parameters as described in [this post by Nate Berkopec](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles. +Memory fragmentation could be reduced by tuning GC parameters [as described in this post](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html). This should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles. ## Importance of Changes diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md index 4d931899da6..789a9762c88 100644 --- a/doc/development/pipelines.md +++ b/doc/development/pipelines.md @@ -426,7 +426,7 @@ We are using a custom mapping between source file to test files, maintained in t ### PostgreSQL versions testing -Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.md), +Even though [Omnibus defaults to PG12 for new installs and upgrades](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.html), our test suite is currently running against PG11, since GitLab.com still runs on PG11. We do run our test suite against PG12 on nightly scheduled pipelines as well as upon specific diff --git a/doc/development/query_performance.md b/doc/development/query_performance.md index 3cb1b10c417..80c4d8c1fd0 100644 --- a/doc/development/query_performance.md +++ b/doc/development/query_performance.md @@ -25,7 +25,7 @@ When you are optimizing your SQL queries, there are two dimensions to pay attent - When analyzing your query's performance, pay attention to if the time you are seeing is on a [cold or warm cache](#cold-and-warm-cache). These guidelines apply for both cache types. - When working with batched queries, change the range and batch size to see how it effects the query timing and caching. -- If an existing query is already underperforming, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance. +- If an existing query is not performing well, make an effort to improve it. If it is too complex or would stall development, create a follow-up so it can be addressed in a timely manner. You can always ask the database reviewer or maintainer for help and guidance. ## Cold and warm cache diff --git a/doc/development/redis.md b/doc/development/redis.md index 9f90c5ee760..c7111db0cdc 100644 --- a/doc/development/redis.md +++ b/doc/development/redis.md @@ -120,14 +120,13 @@ This shows commands that have taken a long time and may be a performance concern. The -[fluent-plugin-redis-slowlog](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog) -project is responsible for taking the slowlog entries from Redis and -passing to fluentd (and ultimately Elasticsearch). +[`fluent-plugin-redis-slowlog`](https://gitlab.com/gitlab-org/fluent-plugin-redis-slowlog) +project is responsible for taking the `slowlog` entries from Redis and +passing to Fluentd (and ultimately Elasticsearch). ## Analyzing the entire keyspace -The [Redis Keyspace -Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer) +The [Redis Keyspace Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer) project contains tools for dumping the full key list and memory usage of a Redis instance, and then analyzing those lists while eliminating potentially sensitive data from the results. It can be used to find the most frequent key patterns, or diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md index 41a7defbc26..e9c95a14236 100644 --- a/doc/development/secure_coding_guidelines.md +++ b/doc/development/secure_coding_guidelines.md @@ -195,7 +195,7 @@ Go's [`regexp`](https://golang.org/pkg/regexp/) package uses `re2` and isn't vul - [Rubular](https://rubular.com/) is a nice online tool to fiddle with Ruby Regexps. - [Runaway Regular Expressions](https://www.regular-expressions.info/catastrophic.html) - [The impact of regular expression denial of service (ReDoS) in practice: an empirical study at the ecosystem scale](https://people.cs.vt.edu/~davisjam/downloads/publications/DavisCoghlanServantLee-EcosystemREDOS-ESECFSE18.pdf). This research paper discusses approaches to automatically detect ReDoS vulnerabilities. -- [Freezing the web: A study of redos vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities. +- [Freezing the web: A study of ReDoS vulnerabilities in JavaScript-based web servers](https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf). Another research paper about detecting ReDoS vulnerabilities. ## Server Side Request Forgery (SSRF) diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md index ce00934b35c..cff199c8b1d 100644 --- a/doc/development/sidekiq_style_guide.md +++ b/doc/development/sidekiq_style_guide.md @@ -588,7 +588,7 @@ the `.with_route` scope defined on all `Routable`s. ### Cron workers -The context is automatically cleared for workers in the Cronjob queue +The context is automatically cleared for workers in the cronjob queue (`include CronjobQueue`), even when scheduling them from requests. We do this to avoid incorrect metadata when other jobs are scheduled from the cron worker. diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md index da8db98e244..b2f15c22429 100644 --- a/doc/development/testing_guide/best_practices.md +++ b/doc/development/testing_guide/best_practices.md @@ -800,10 +800,11 @@ end ``` WARNING: -Only use simple values as input in the `where` block. Using procs, stateful +Only use simple values as input in the `where` block. Using + procs, stateful objects, FactoryBot-created objects, and similar items can lead to [unexpected results](https://github.com/tomykaira/rspec-parameterized/issues/8). - + ### Prometheus tests Prometheus metrics may be preserved from one test run to another. To ensure that metrics are diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md index 73fce3a38d7..65c4275d0fd 100644 --- a/doc/development/testing_guide/frontend_testing.md +++ b/doc/development/testing_guide/frontend_testing.md @@ -193,7 +193,7 @@ When it comes to querying DOM elements in your tests, it is best to uniquely and the element. Preferentially, this is done by targeting what the user actually sees using [DOM Testing Library](https://testing-library.com/docs/dom-testing-library/intro/). -When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/dom-testing-library/api-queries/#byrole) +When selecting by text it is best to use [`getByRole` or `findByRole`](https://testing-library.com/docs/queries/byrole) as these enforce accessibility best practices as well. The examples below demonstrate the order of preference. When writing Vue component unit tests, it can be wise to query children by component, so that the unit test can focus on comprehensive value coverage @@ -687,7 +687,7 @@ Similarly, if you really need to use the real `Date` class, then you can import ```javascript import { useRealDate } from 'helpers/fake_date'; -// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.). +// NOTE: `useRealDate` cannot be called during test execution (i.e. inside `it`, `beforeEach`, `beforeAll`, etc.). describe('with real date', () => { useRealDate(); }); @@ -1034,7 +1034,7 @@ describe "Admin::AbuseReports", :js do end ``` -### Jest test timeout due to async imports +### Jest test timeout due to asynchronous imports If a module asynchronously imports some other modules at runtime, these modules must be transpiled by the Jest loaders at runtime. It's possible that this can cause [Jest to timeout](https://gitlab.com/gitlab-org/gitlab/-/issues/280809). diff --git a/doc/development/usage_ping.md b/doc/development/usage_ping.md index 9b78b687428..f75db08597e 100644 --- a/doc/development/usage_ping.md +++ b/doc/development/usage_ping.md @@ -840,7 +840,9 @@ We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/ ### 5. Add the metric definition -When adding, changing, or updating metrics, please update the [Event Dictionary's **Usage Ping** table](https://about.gitlab.com/handbook/product/product-intelligence-guide/#event-dictionary). +[Check Metrics Dictionary Guide](usage_ping/metrics_dictionary.md) + +When adding, updating, or removing metrics, please update the [Metrics Dictionary](usage_ping/dictionary.md). ### 6. Add new metric to Versions Application diff --git a/doc/gitlab-basics/index.md b/doc/gitlab-basics/index.md index 8052fd27bb3..001806c0a59 100644 --- a/doc/gitlab-basics/index.md +++ b/doc/gitlab-basics/index.md @@ -23,7 +23,7 @@ The following are guides to basic GitLab functionality: - [Create and add your SSH public key](../ssh/README.md), for enabling Git over SSH. - [Create a project](../user/project/working_with_projects.md#create-a-project), to start using GitLab. -- [Create a group](../user/group/index.md#create-a-new-group), to combine and administer +- [Create a group](../user/group/index.md#create-a-group), to combine and administer projects together. - [Create a branch](create-branch.md), to make changes to files stored in a project's repository. - [Feature branch workflow](feature_branch_workflow.md). diff --git a/doc/integration/saml.md b/doc/integration/saml.md index 9b6ad3f2755..d68cf8e2f34 100644 --- a/doc/integration/saml.md +++ b/doc/integration/saml.md @@ -13,15 +13,15 @@ You should also reference the [OmniAuth documentation](omniauth.md) for general ## Common SAML Terms -| Term | Description | -|------|-------------| -| Identity Provider (IdP) | The service which manages your user identities such as ADFS, Okta, Onelogin, or Ping Identity. | -| Service Provider (SP) | SAML considers GitLab to be a service provider. | -| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. | -| SSO | Single Sign-On. | +| Term | Description | +|--------------------------------|-------------| +| Identity Provider (IdP) | The service which manages your user identities, such as ADFS, Okta, OneLogin, or Ping Identity. | +| Service Provider (SP) | SAML considers GitLab to be a service provider. | +| Assertion | A piece of information about a user's identity, such as their name or role. Also known as claims or attributes. | +| SSO | Single Sign-On. | | Assertion consumer service URL | The callback on GitLab where users will be redirected after successfully authenticating with the identity provider. | -| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". | -| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. | +| Issuer | How GitLab identifies itself to the identity provider. Also known as a "Relying party trust identifier". | +| Certificate fingerprint | Used to confirm that communications over SAML are secure by checking that the server is signing communications with the correct certificate. Also known as a certificate thumbprint. | ## General Setup @@ -265,7 +265,7 @@ considered admin users. ### Auditor groups **(PREMIUM SELF)** -> Introduced in [GitLab Starter](https://about.gitlab.com/pricing/) 11.4. +> Introduced in GitLab 11.4. The requirements are the same as the previous settings, your IdP needs to pass Group information to GitLab, you need to tell GitLab where to look for the groups in the SAML response, and which group(s) should be @@ -454,8 +454,6 @@ args: { ### `uid_attribute` -> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17734) in GitLab 10.7. - By default, the `uid` is set as the `name_id` in the SAML response. If you'd like to designate a unique attribute for the `uid`, you can set the `uid_attribute`. In the example below, the value of `uid` attribute in the SAML response is set as the `uid_attribute`. ```yaml diff --git a/doc/intro/index.md b/doc/intro/index.md index 1ab7553d3a8..a40293955a9 100644 --- a/doc/intro/index.md +++ b/doc/intro/index.md @@ -12,7 +12,7 @@ comments: false Create projects and groups. - [Create a new project](../user/project/working_with_projects.md#create-a-project) -- [Create a new group](../user/group/index.md#create-a-new-group) +- [Create a new group](../user/group/index.md#create-a-group) ## Prioritize diff --git a/doc/ssh/README.md b/doc/ssh/README.md index 8d1a5d9242c..35bc3223659 100644 --- a/doc/ssh/README.md +++ b/doc/ssh/README.md @@ -77,7 +77,7 @@ If you do not have an existing SSH key pair, generate a new one. 1. Type `ssh-keygen -t` followed by the key type and an optional comment. This comment is included in the `.pub` file that's created. You may want to use an email address for the comment. - + For example, for ED25519: ```shell @@ -111,7 +111,7 @@ If you do not have an existing SSH key pair, generate a new one. 1. A confirmation is displayed, including information about where your files are stored. -A public and private key are generated. +A public and private key are generated. [Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep the private key secure. @@ -278,7 +278,7 @@ Instead, you can assign aliases to hosts in the `~.ssh/config` file. - For the `Host`, use an alias like `user_1.gitlab.com` and `user_2.gitlab.com`. Advanced configurations are more difficult to maintain, and these strings are easier to - understand when you use tools like `git remote`. + understand when you use tools like `git remote`. - For the `IdentityFile`, use the path the private key. ```conf diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md index b7f2a0768ef..56d84657534 100644 --- a/doc/topics/autodevops/customize.md +++ b/doc/topics/autodevops/customize.md @@ -17,7 +17,7 @@ staging and canary deployments, ## Custom buildpacks If the automatic buildpack detection fails for your project, or if you want to -use a custom buildpack, you can override the buildpack using a project variable +use a custom buildpack, you can override the buildpack using a project CI/CD variable or a `.buildpacks` file in your project: - **Project variable** - Create a project variable `BUILDPACK_URL` with the URL @@ -43,7 +43,7 @@ can't use the `.buildpacks` file. The buildpack in the backend to parse the `.buildpacks` file, does not provide the necessary commands `bin/test-compile` and `bin/test`. -If your goal is to use only a single custom buildpack, you should provide the project variable +If your goal is to use only a single custom buildpack, you should provide the project CI/CD variable `BUILDPACK_URL` instead. ## Custom `Dockerfile` @@ -55,13 +55,13 @@ builds a Docker image based on the Dockerfile, rather than using buildpacks. This can be much faster and result in smaller images, especially if your Dockerfile is based on [Alpine](https://hub.docker.com/_/alpine/). -If you set the `DOCKERFILE_PATH` CI variable, Auto Build looks for a Dockerfile there +If you set the `DOCKERFILE_PATH` CI/CD variable, Auto Build looks for a Dockerfile there instead. ## Passing arguments to `docker build` Arguments can be passed to the `docker build` command using the -`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project variable. For example, to build a +`AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` project CI/CD variable. For example, to build a Docker image based on based on the `ruby:alpine` instead of the default `ruby:latest`: 1. Set `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` to `--build-arg=RUBY_VERSION=alpine`. @@ -93,12 +93,12 @@ You can extend and manage your Auto DevOps configuration with GitLab APIs: - [Editing groups](../../api/groups.md#update-group). - [Editing projects](../../api/projects.md#edit-project). -## Forward CI variables to the build environment +## Forward CI/CD variables to the build environment > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25514) in GitLab 12.3, but available in versions 11.9 and above. -CI variables can be forwarded into the build environment using the -`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI variable. +CI/CD variables can be forwarded into the build environment using the +`AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` CI/CD variable. The forwarded variables should be specified by name in a comma-separated list. For example, to forward the variables `CI_COMMIT_SHA` and `CI_ENVIRONMENT_NAME`, set `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` @@ -130,7 +130,7 @@ feature to use the `--secret` flag. Auto DevOps uses [Helm](https://helm.sh/) to deploy your application to Kubernetes. You can override the Helm chart used by bundling up a chart into your project -repository or by specifying a project variable: +repository or by specifying a project CI/CD variable: - **Bundled chart** - If your project has a `./chart` directory with a `Chart.yaml` file in it, Auto DevOps detects the chart and uses it instead of the @@ -151,17 +151,17 @@ You can override the default values in the `values.yaml` file in the - Adding a file named `.gitlab/auto-deploy-values.yaml` to your repository, which is automatically used, if found. - Adding a file with a different name or path to the repository, and setting the - `HELM_UPGRADE_VALUES_FILE` [environment variable](#environment-variables) with + `HELM_UPGRADE_VALUES_FILE` [CI/CD variable](#cicd-variables) with the path and name. NOTE: -For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` environment variable +For GitLab 12.5 and earlier, use the `HELM_UPGRADE_EXTRA_ARGS` variable to override the default chart values by setting `HELM_UPGRADE_EXTRA_ARGS` to `--values `. ## Customize the `helm upgrade` command You can customize the `helm upgrade` command used in the [auto-deploy-image](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image) -by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` variable. +by passing options to the command with the `HELM_UPGRADE_EXTRA_ARGS` CI/CD variable. For example, set the value of `HELM_UPGRADE_EXTRA_ARGS` to `--no-hooks` to disable pre-upgrade and post-upgrade hooks when the command is executed. @@ -170,7 +170,7 @@ list of options. ## Custom Helm chart per environment -You can specify the use of a custom Helm chart per environment by scoping the environment variable +You can specify the use of a custom Helm chart per environment by scoping the CI/CD variable to the desired environment. See [Limiting environment scopes of variables](../../ci/variables/README.md#limit-the-environment-scopes-of-cicd-variables). ## Customizing `.gitlab-ci.yml` @@ -260,7 +260,7 @@ the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12 To support applications requiring a database, [PostgreSQL](https://www.postgresql.org/) is provisioned by default. The credentials to access the database are preconfigured, but can be customized by setting the associated -[variables](#environment-variables). You can use these credentials to define a `DATABASE_URL`: +[CI/CD variables](#cicd-variables). You can use these credentials to define a `DATABASE_URL`: ```yaml postgres://user:password@postgres-host:postgres-port/postgres-database @@ -269,7 +269,7 @@ postgres://user:password@postgres-host:postgres-port/postgres-database ### Upgrading PostgresSQL WARNING: -The variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned +The CI/CD variable `AUTO_DEVOPS_POSTGRES_CHANNEL` that controls default provisioned PostgreSQL was changed to `2` in [GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/210499). To keep using the old PostgreSQL, set the `AUTO_DEVOPS_POSTGRES_CHANNEL` variable to `1`. @@ -290,17 +290,17 @@ production environments, for some use cases, it may not be sufficiently secure o resilient, and you may want to use an external managed provider (such as AWS Relational Database Service) for PostgreSQL. -You must define environment-scoped variables for `POSTGRES_ENABLED` and +You must define environment-scoped CI/CD variables for `POSTGRES_ENABLED` and `DATABASE_URL` in your project's CI/CD settings: 1. Disable the built-in PostgreSQL installation for the required environments using - scoped [environment variables](../../ci/environments/index.md#scoping-environments-with-specs). + environment-scoped [CI/CD variables](../../ci/environments/index.md#scoping-environments-with-specs). For this use case, it's likely that only `production` must be added to this list. The built-in PostgreSQL setup for Review Apps and staging is sufficient. ![Auto Metrics](img/disable_postgres.png) -1. Define the `DATABASE_URL` CI variable as a scoped environment variable that is +1. Define the `DATABASE_URL` variable as an environment-scoped variable that is available to your application. This should be a URL in the following format: ```yaml @@ -310,7 +310,7 @@ You must define environment-scoped variables for `POSTGRES_ENABLED` and You must ensure that your Kubernetes cluster has network access to wherever PostgreSQL is hosted. -## Environment variables +## CI/CD variables The following variables can be used for setting up the Auto DevOps domain, providing a custom Helm chart, or scaling your application. PostgreSQL can @@ -318,10 +318,10 @@ also be customized, and you can use a [custom buildpack](#custom-buildpacks). ### Build and deployment -The following table lists variables related to building and deploying +The following table lists CI/CD variables related to building and deploying applications. -| **Variable** | **Description** | +| **CI/CD Variable** | **Description** | |-----------------------------------------|------------------------------------| | `ADDITIONAL_HOSTS` | Fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. | | `_ADDITIONAL_HOSTS` | For a specific environment, the fully qualified domain names specified as a comma-separated list that are added to the Ingress hosts. This takes precedence over `ADDITIONAL_HOSTS`. | @@ -329,7 +329,7 @@ applications. | `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` | When set to a non-empty value and no `Dockerfile` is present, Auto Build builds your application using Cloud Native Buildpacks instead of Herokuish. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). | | `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER` | The builder used when building with Cloud Native Buildpacks. The default builder is `heroku/buildpacks:18`. [More details](stages.md#auto-build-using-cloud-native-buildpacks-beta). | | `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` | Extra arguments to be passed to the `docker build` command. Note that using quotes doesn't prevent word splitting. [More details](#passing-arguments-to-docker-build). | -| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI variable names](#forward-ci-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). | +| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI/CD variable names](#forward-cicd-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). | | `AUTO_DEVOPS_CHART` | Helm Chart used to deploy your apps. Defaults to the one [provided by GitLab](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app). | | `AUTO_DEVOPS_CHART_REPOSITORY` | Helm Chart repository used to search for charts. Defaults to `https://charts.gitlab.io`. | | `AUTO_DEVOPS_CHART_REPOSITORY_NAME` | From GitLab 11.11, used to set the name of the Helm repository. Defaults to `gitlab`. | @@ -367,9 +367,9 @@ Auto DevOps can undo your changes. ### Database -The following table lists variables related to the database. +The following table lists CI/CD variables related to the database. -| **Variable** | **Description** | +| **CI/CD Variable** | **Description** | |-----------------------------------------|------------------------------------| | `DB_INITIALIZE` | From GitLab 11.4, used to specify the command to run to initialize the application's PostgreSQL database. Runs inside the application pod. | | `DB_MIGRATE` | From GitLab 11.4, used to specify the command to run to migrate the application's PostgreSQL database. Runs inside the application pod. | @@ -383,7 +383,7 @@ The following table lists variables related to the database. The following table lists variables used to disable jobs. -| **Job Name** | **Variable** | **GitLab version** | **Description** | +| **Job Name** | **CI/CDVariable** | **GitLab version** | **Description** | |----------------------------------------|---------------------------------|-----------------------|-----------------| | `.fuzz_base` | `COVFUZZ_DISABLED` | [From GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34984) | [Read more](../../user/application_security/coverage_fuzzing/) about how `.fuzz_base` provide capability for your own jobs. If the variable is present, your jobs aren't created. | | `apifuzzer_fuzz` | `API_FUZZING_DISABLED` | [From GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39135) | If the variable is present, the job isn't created. | @@ -433,7 +433,7 @@ The following table lists variables used to disable jobs. > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49056) in GitLab 11.7. Some applications need to define secret variables that are accessible by the deployed -application. Auto DevOps detects variables starting with `K8S_SECRET_`, and makes +application. Auto DevOps detects CI/CD variables starting with `K8S_SECRET_`, and makes these prefixed variables available to the deployed application as environment variables. To configure your application variables: @@ -545,7 +545,7 @@ The normal behavior of Auto DevOps is to use continuous deployment, pushing automatically to the `production` environment every time a new pipeline is run on the default branch. However, there are cases where you might want to use a staging environment, and deploy to production manually. For this scenario, the -`STAGING_ENABLED` environment variable was introduced. +`STAGING_ENABLED` CI/CD variable was introduced. If you define `STAGING_ENABLED` with a non-empty value, then GitLab automatically deploys the application to a `staging` environment, and creates a `production_manual` job for @@ -584,7 +584,7 @@ are created: 1. `rollout 50%` 1. `rollout 100%` -The percentage is based on the `REPLICAS` variable, and defines the number of +The percentage is based on the `REPLICAS` CI/CD variable, and defines the number of pods you want to have for your deployment. If the value is `10`, and you run the `10%` rollout job, there is `1` new pod and `9` old ones. @@ -616,8 +616,8 @@ With `INCREMENTAL_ROLLOUT_MODE` set to `manual` and with `STAGING_ENABLED` ![Rollout and staging enabled](img/rollout_staging_enabled.png) WARNING: -Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` environment -variable enabled this feature. This configuration is deprecated, and is scheduled to be +Before GitLab 11.4, the presence of the `INCREMENTAL_ROLLOUT_ENABLED` CI/CD variable +enabled this feature. This configuration is deprecated, and is scheduled to be removed in the future. ### Timed incremental rollout to production **(PREMIUM)** @@ -632,7 +632,7 @@ This configuration is based on Everything behaves the same way, except: -- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` variable to `timed`. +- To enable it, set the `INCREMENTAL_ROLLOUT_MODE` CI/CD variable to `timed`. - Instead of the standard `production` job, the following jobs are created with a 5 minute delay between each: diff --git a/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png b/doc/topics/autodevops/img/alexj_autodevops_min_v13_8.png deleted file mode 100644 index 7dc3773783527bd21a7302ecfed953eacf750f96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20836 zcmbTcb95z5_coklVoq$EC$=%MlZiR8ofF%(J+ZA5+nSgYV`BTA`+0u)Ui|abTHRe; zd+)2Ry{o!w6(W=rB$43p;K9Jakff!=RlvX?K!5WKuwVY()wGzG|2`niMdU@m!0O`= z-i)CBzJoifNQ#2hOcR{^)vmNu({$04m*f3mZ_8w4VsC891hjSds|5ze59IxuwKa7y zA_3ak*g5k81<3xT!TUG=PceXu^O;o;!{FtY+!SsDLoFgknKxflT%?VQQ~ z4f3Bj;-=0&oGcw&EbZ+`{=qdews&l7E~1%ddY|$Nvu)uaYIu)J99(($>_@`7bp=E*4Jye^v8;NdBAX zzb)0BO`XK-ZT}j&{14Q>*#8Qfh|T|2`kw+D%YVYjYhz?*E+^ZvW<{EP12&LarV5BRT+CMSlCYZ^Ai9X*q*| zA)x&N7ZfR+Gd}3mKW8>xZb!X>y zXjpiBLSklCcK^V@{=vcDu-DZ$P|(oRF)?%S@cH=pe|&y^la$HH&6%2>>FDeX2nu!w zdVspRY;5i2&AoN?4R?3<8k?Gb{aS2mZ?~|t^6>Jpa1Jgk`Uw`gDPinUQ(KpulIj+k z=nSMaCFwN4barqZSNf}Eh__y+A?qn$t!Ch zCZ{&B_g`3EKRP+v+}RtOUYMR=ZtUo*s;YJfNWdi`Q`gW?P*R3Q!7?=dQC?9gEG7ZQ zW5}rP@c#aRicLtSWD^{h(7k*sBd?I3lhoYOs%PZ`CTe2l8QD;g?iZ6)TvA$5oVl{T zU0l;TG(Nk#e+2dgB`PH)qp&(OF&Qj=dur#ts;N_>`VvCQA~Y$_#>EFbc}Gy+H6b%S zDYtxk_kdH&Y4h|cHluj&;>E!;2rOVj-ojEs$C6u05Le#%^W)t!BK7|H-7h-+^!7C) zGtnzFN-}RxSyeq2bo#R}(=jm8L7u+7CTsEFQQAl!3=CGz&|VUNrDfvAz{jRy>y$fm zZYoXz3<$e=c=Og~=T}t$nUPEBD1DW+Y?;3{wQ;Tfndn-3q{Kr?pZ=S@;24ZvQ?KMe zQeN1y@=%uxBOxx71q%W!X1ikIGPUo#Tpf>J&A2*1E7x7V025KV=9ZTREv)^txiDPM z$z5B9Bf?xbG!TfHy1SI7X{99sG?kU2gy{r|WG4p)ds>W#$ON{Wz%Vh#JIaHSO?{h= zD^h)Pf*s3^nEn!XwKE*|;sWzte=mbtZ}f^)r5>&bCYDf6MTN2xM=G}y{Tx>=WZ|AJ zvNq0HlTH}h80!11=ijZg0<&NJ9EpfE2>Dp7af%&!-TxKGpaJZ-=JcwXDlQImFRrgD zd42<97JkMD10w;G78g+iuKmeEkwe!a8Ziji%KAM6j~O{MucG!*ZHyTrn%p38RmUW9 zYO8zp33;Lo7nU0u`iC>|*T#9G4VDU@xrOswrmWW#Wu;}fJ0p*?k|v~rILqAeA?I-@ zI#gHH+2_8meTo0^mN91dhJI+2Z9!b`NBVV9+K#bAiE1YRk|gD9OA0e5j{7m{?;R?AH_KJe6i^IK&yHzS z*XJo1hSIF;D)FA)cIxa>x*Mh~T$Z5t>^u2=d^%^|%5OAPs)RW)7j>IA+kSWofNPXi zE^utO0iVx$<9ig(*_ZSzk|PRYv*^PzF)=YE6mb?^P`+rld8Fu@|2lC|Fw|J~zTG|G zbBFL%7_=g*7�BEzD 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 WqBH;}@$OFi@AzCpPaUOd8T>yv%E5*J diff --git a/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png b/doc/topics/autodevops/img/kai_autodevops_min_v13_8.png deleted file mode 100644 index fa3ab4c18200332a1b3252638aeb79620e686f8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39770 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%0DC+OXstB=>Mx@E4!Un*82ooh<1FK#p0(~ziC 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 -For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4). +For an introduction to Auto DevOps, watch [AutoDevOps in GitLab 11.0](https://youtu.be/0Tc0YYBxqi4) or see this [overview](https://about.gitlab.com/stages-devops-lifecycle/auto-devops/). For requirements, read [Requirements for Auto DevOps](requirements.md) for more information. For a developer's guide, read [Auto DevOps development guide](../../development/auto_devops.md). -### Share your feedback - -As Auto DevOps continues to gain popularity, and lowers the barrier to entry for -getting started with DevOps and CI/CD, see what our wider community is saying: - -From [AlexJonesax](https://twitter.com/AlexJonesax) and [KaiPMDH](https://twitter.com/KaiPMDH) on Twitter: - -![Alex on Twitter: Auto DevOps in GitLab doesn't just lower the bar to entry, it removes the bar and holds your hand.](img/alexj_autodevops_min_v13_8.png) - -![Kai on Twitter: When I saw this on the Auto DevOps stuff, my mind was blown...](img/kai_autodevops_min_v13_8.png) - -We welcome everyone to [share your experience by tagging GitLab on Twitter](https://twitter.com/gitlab). - ## Enabled by default > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41729) in GitLab 11.3. diff --git a/doc/topics/autodevops/quick_start_guide.md b/doc/topics/autodevops/quick_start_guide.md index cd951e53bd1..541f4ab57ab 100644 --- a/doc/topics/autodevops/quick_start_guide.md +++ b/doc/topics/autodevops/quick_start_guide.md @@ -234,8 +234,8 @@ takes you to the pod's logs page. NOTE: The example shows only one pod hosting the application at the moment, but you can add -more pods by defining the [`REPLICAS` variable](customize.md#environment-variables) -in **Settings > CI/CD > Environment variables**. +more pods by defining the [`REPLICAS` CI/CD variable](customize.md#cicd-variables) +in **Settings > CI / CD > Variables**. ### Work with branches @@ -307,7 +307,7 @@ and customized to fit your workflow. Here are some helpful resources for further 1. [Auto DevOps](index.md) 1. [Multiple Kubernetes clusters](index.md#using-multiple-kubernetes-clusters) 1. [Incremental rollout to production](customize.md#incremental-rollout-to-production) **(PREMIUM)** -1. [Disable jobs you don't need with environment variables](customize.md#environment-variables) +1. [Disable jobs you don't need with CI/CD variables](customize.md#cicd-variables) 1. [Use a static IP for your cluster](../../user/clusters/applications.md#using-a-static-ip) 1. [Use your own buildpacks to build your application](customize.md#custom-buildpacks) 1. [Prometheus monitoring](../../user/project/integrations/prometheus.md) diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md index 930938b7571..e27686ec239 100644 --- a/doc/topics/autodevops/requirements.md +++ b/doc/topics/autodevops/requirements.md @@ -109,8 +109,8 @@ After all requirements are met, you can [enable Auto DevOps](index.md#enablingdi You can choose to target [AWS ECS](../../ci/cloud_deployment/index.md) as a deployment platform instead of using Kubernetes. -To get started on Auto DevOps to AWS ECS, you must add a specific Environment -Variable. To do so, follow these steps: +To get started on Auto DevOps to AWS ECS, you must add a specific CI/CD variable. +To do so, follow these steps: 1. In your project, go to **Settings > CI / CD** and expand the **Variables** section. @@ -121,7 +121,7 @@ Variable. To do so, follow these steps: - `ECS` if you're not enforcing any launch type check when deploying to ECS. When you trigger a pipeline, if you have Auto DevOps enabled and if you have correctly -[entered AWS credentials as environment variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs), +[entered AWS credentials as variables](../../ci/cloud_deployment/index.md#deploy-your-application-to-the-aws-elastic-container-service-ecs), your application is deployed to AWS ECS. [GitLab Managed Apps](../../user/clusters/applications.md) are not available when deploying to AWS ECS. @@ -145,7 +145,7 @@ own pipeline, as the override stops working when the name changes. You can target [AWS EC2](../../ci/cloud_deployment/index.md) as a deployment platform instead of Kubernetes. To use Auto DevOps with AWS EC2, you must add a -specific environment variable. +specific CI/CD variable. For more details, see [Custom build job for Auto DevOps](../../ci/cloud_deployment/index.md#custom-build-job-for-auto-devops) for deployments to AWS EC2. diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md index f1244a1ad1b..9051f6926bf 100644 --- a/doc/topics/autodevops/stages.md +++ b/doc/topics/autodevops/stages.md @@ -53,7 +53,7 @@ For the requirements of other languages and frameworks, read the NOTE: If Auto Build fails despite the project meeting the buildpack requirements, set -a project variable `TRACE=true` to enable verbose logging, which may help you +a project CI/CD variable `TRACE=true` to enable verbose logging, which may help you troubleshoot. ### Auto Build using Cloud Native Buildpacks (beta) @@ -62,9 +62,9 @@ troubleshoot. Auto Build supports building your application using [Cloud Native Buildpacks](https://buildpacks.io) through the [`pack` command](https://github.com/buildpacks/pack). To use Cloud Native Buildpacks, -set the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty +set the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_ENABLED` to a non-empty value. The default builder is `heroku/buildpacks:18` but a different builder -can be selected using the CI variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`. +can be selected using the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`. Cloud Native Buildpacks (CNBs) are an evolution of Heroku buildpacks, and GitLab expects them to eventually supersede Herokuish-based builds within Auto DevOps. For more @@ -103,7 +103,9 @@ NOTE: Not all buildpacks supported by [Auto Build](#auto-build) are supported by Auto Test. Auto Test uses [Herokuish](https://gitlab.com/gitlab-org/gitlab/-/issues/212689), *not* Cloud Native Buildpacks, and only buildpacks that implement the + [Testpack API](https://devcenter.heroku.com/articles/testpack-api) are supported. + ### Currently supported languages @@ -284,7 +286,7 @@ see the documentation. ### Overriding the DAST target To use a custom target instead of the auto-deployed review apps, -set a `DAST_WEBSITE` environment variable to the URL for DAST to scan. +set a `DAST_WEBSITE` CI/CD variable to the URL for DAST to scan. WARNING: If [DAST Full Scan](../../user/application_security/dast/index.md#full-scan) is @@ -297,10 +299,10 @@ data loss or corruption. You can disable DAST: -- On all branches by setting the `DAST_DISABLED` environment variable to `"true"`. +- On all branches by setting the `DAST_DISABLED` CI/CD variable to `"true"`. - Only on the default branch by setting the `DAST_DISABLED_FOR_DEFAULT_BRANCH` - environment variable to `"true"`. -- Only on feature branches by setting `REVIEW_DISABLED` environment variable to + variable to `"true"`. +- Only on feature branches by setting `REVIEW_DISABLED` variable to `"true"`. This also disables the Review App. ## Auto Browser Performance Testing **(PREMIUM)** @@ -336,7 +338,7 @@ uploads the report as an artifact. Some initial setup is required. A [k6](https://k6.io/) test needs to be written that's tailored to your specific application. The test also needs to be -configured so it can pick up the environment's dynamic URL via an environment variable. +configured so it can pick up the environment's dynamic URL via a CI/CD variable. Any load performance test result differences between the source and target branches are also [shown in the merge request widget](../../user/project/merge_requests/load_performance_testing.md). @@ -356,7 +358,7 @@ default, but the [Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml) contains job definitions for these tasks if you want to enable them. -You can use [environment variables](customize.md#environment-variables) to automatically +You can use [CI/CD variables](customize.md#cicd-variables) to automatically scale your pod replicas, and to apply custom arguments to the Auto DevOps `helm upgrade` commands. This is an easy way to [customize the Auto Deploy Helm chart](customize.md#custom-helm-chart). @@ -440,7 +442,7 @@ On GitLab 12.9 and 12.10, opting into `AUTO_DEVOPS_POSTGRES_CHANNEL` version `2` deletes the version `1` PostgreSQL database. Follow the [guide to upgrading PostgreSQL](upgrading_postgresql.md) to back up and restore your database before opting into version `2` (On -GitLab 13.0, an additional variable is required to trigger the database +GitLab 13.0, an additional CI/CD variable is required to trigger the database deletion). ### Migrations @@ -448,7 +450,7 @@ deletion). > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21955) in GitLab 11.4 You can configure database initialization and migrations for PostgreSQL to run -within the application pod by setting the project variables `DB_INITIALIZE` and +within the application pod by setting the project CI/CD variables `DB_INITIALIZE` and `DB_MIGRATE` respectively. If present, `DB_INITIALIZE` is run as a shell command within an application pod @@ -500,7 +502,7 @@ access to a Redis instance. Auto DevOps doesn't deploy this instance for you, so you must: - Maintain your own Redis instance. -- Set a CI variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance, +- Set a CI/CD variable `K8S_SECRET_REDIS_URL`, which is the URL of this instance, to ensure it's passed into your deployments. After configuring your worker to respond to health checks, run a Sidekiq @@ -686,5 +688,5 @@ You can follow the [code intelligence epic](https://gitlab.com/groups/gitlab-org for updates. This stage is enabled by default. You can disable it by adding the -`CODE_INTELLIGENCE_DISABLED` environment variable. Read more about +`CODE_INTELLIGENCE_DISABLED` CI/CD variable. Read more about [disabling Auto DevOps jobs](../../topics/autodevops/customize.md#disable-jobs). diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md index 5f8dfcdfc05..1fff935880c 100644 --- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md +++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md @@ -114,7 +114,7 @@ If your Auto DevOps project has an active environment that was deployed with the job saves a backup for 1 week in a job artifact called `helm-2-release-backups`. The backup is in a Kubernetes manifest file that can be restored using `kubectl apply -f $backup`. -1. Remove the `MIGRATE_HELM_2TO3` variable. +1. Remove the `MIGRATE_HELM_2TO3` CI/CD variable. #### In-Cluster PostgreSQL Channel 2 @@ -145,11 +145,11 @@ steps to upgrade to v2: them to `production` first to delete the unstable tracks. 1. Verify your project is [using the v2 `auto-deploy-image`](#verify-dependency-versions). If not, [specify the version](#use-a-specific-version-of-auto-deploy-dependencies). -1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable with a value of `true` +1. Add an `AUTO_DEVOPS_FORCE_DEPLOY_V2` CI/CD variable with a value of `true` in the GitLab CI/CD settings. 1. Create a new pipeline and run the `production` job to renew the resource architecture with the v2 `auto-deploy-app chart`. -1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` environment variable. +1. Remove the `AUTO_DEVOPS_FORCE_DEPLOY_V2` variable. ### Use a specific version of Auto Deploy dependencies @@ -167,7 +167,7 @@ include: ### Ignore warnings and continue deploying If you are certain that the new chart version is safe to be deployed, you can add -the `AUTO_DEVOPS_FORCE_DEPLOY_V` [environment variable](customize.md#build-and-deployment) +the `AUTO_DEVOPS_FORCE_DEPLOY_V` [CI/CD variable](customize.md#build-and-deployment) to force the deployment to continue. For example, if you want to deploy the `v2.0.0` chart on a deployment that previously diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md index 46345d1440f..14a193322a5 100644 --- a/doc/user/admin_area/index.md +++ b/doc/user/admin_area/index.md @@ -203,7 +203,7 @@ sort order is by **Last created**. To search for groups by name, enter your criteria in the search field. The group search is case insensitive, and applies partial matching. -To [Create a new group](../group/index.md#create-a-new-group) click **New group**. +To [Create a new group](../group/index.md#create-a-group) click **New group**. ### Administering Jobs diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md index b08c19bee47..64b386d7828 100644 --- a/doc/user/application_security/security_dashboard/index.md +++ b/doc/user/application_security/security_dashboard/index.md @@ -175,7 +175,7 @@ lock files. Python projects can have lock files, but GitLab Secure tools don't s ## Security scans using Auto DevOps When using [Auto DevOps](../../../topics/autodevops/index.md), use -[special environment variables](../../../topics/autodevops/customize.md#environment-variables) +[special environment variables](../../../topics/autodevops/customize.md#cicd-variables) to configure daily security scans.