From b806264d29b8d52ccb78a41dcc3d67f2b040700c Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 16 Jan 2020 09:08:46 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../error_tracking/sentry_detailed_error_type.rb | 3 + app/helpers/application_settings_helper.rb | 1 - .../project_error_tracking_setting.rb | 2 + app/policies/user_policy.rb | 9 +- .../error_tracking/detailed_error_entity.rb | 1 + app/services/users/update_service.rb | 9 -- .../_account_and_limit.html.haml | 7 +- app/views/profiles/_name.html.haml | 5 +- .../unreleased/38223-add-gitlab-commit-path.yml | 5 + config/application.rb | 6 +- doc/api/graphql/reference/gitlab_schema.graphql | 5 + doc/api/graphql/reference/gitlab_schema.json | 14 +++ doc/api/graphql/reference/index.md | 1 + .../img/select-template.png | Bin 12345 -> 0 bytes .../img/select_template_v12_6.png | Bin 0 -> 51825 bytes .../img/set_up_ci_v12_6.png | Bin 0 -> 93168 bytes .../img/setup-ci.png | Bin 19183 -> 0 bytes .../test_phoenix_app_with_gitlab_ci_cd/index.md | 115 +++++++++------------ .../settings/account_and_limit_settings.md | 2 +- lib/api/settings.rb | 1 - lib/gitlab/error_tracking/detailed_error.rb | 1 + lib/gitlab/experimentation.rb | 6 ++ locale/gitlab.pot | 9 ++ .../admin/application_settings_controller_spec.rb | 7 -- spec/controllers/admin/users_controller_spec.rb | 22 ---- spec/controllers/profiles_controller_spec.rb | 48 --------- .../projects/error_tracking_controller_spec.rb | 7 +- spec/factories/error_tracking/detailed_error.rb | 2 +- .../api/schemas/error_tracking/error_detailed.json | 3 +- .../sentry_detailed_error_type_spec.rb | 1 + .../project_error_tracking_setting_spec.rb | 6 +- spec/policies/user_policy_spec.rb | 32 ------ spec/requests/api/settings_spec.rb | 8 -- spec/requests/api/users_spec.rb | 15 --- spec/services/users/update_service_spec.rb | 40 ------- 35 files changed, 118 insertions(+), 275 deletions(-) create mode 100644 changelogs/unreleased/38223-add-gitlab-commit-path.yml delete mode 100644 doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select-template.png create mode 100644 doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select_template_v12_6.png create mode 100644 doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/set_up_ci_v12_6.png delete mode 100644 doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/setup-ci.png diff --git a/app/graphql/types/error_tracking/sentry_detailed_error_type.rb b/app/graphql/types/error_tracking/sentry_detailed_error_type.rb index 81d97a08a7e..af6d8818d90 100644 --- a/app/graphql/types/error_tracking/sentry_detailed_error_type.rb +++ b/app/graphql/types/error_tracking/sentry_detailed_error_type.rb @@ -79,6 +79,9 @@ module Types field :gitlab_commit, GraphQL::STRING_TYPE, null: true, description: "GitLab commit SHA attributed to the Error based on the release version" + field :gitlab_commit_path, GraphQL::STRING_TYPE, + null: true, + description: "Path to the GitLab page for the GitLab commit attributed to the error" def first_seen DateTime.parse(object.first_seen) diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 66cb5d2bedb..0e14db6ddbf 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -284,7 +284,6 @@ module ApplicationSettingsHelper :unique_ips_limit_enabled, :unique_ips_limit_per_user, :unique_ips_limit_time_window, - :updating_name_disabled_for_users, :usage_ping_enabled, :instance_statistics_visibility_private, :user_default_external, diff --git a/app/models/error_tracking/project_error_tracking_setting.rb b/app/models/error_tracking/project_error_tracking_setting.rb index bf7e0e9580a..4b61eb02914 100644 --- a/app/models/error_tracking/project_error_tracking_setting.rb +++ b/app/models/error_tracking/project_error_tracking_setting.rb @@ -4,6 +4,7 @@ module ErrorTracking class ProjectErrorTrackingSetting < ApplicationRecord include Gitlab::Utils::StrongMemoize include ReactiveCaching + include Gitlab::Routing SENTRY_API_ERROR_TYPE_BAD_REQUEST = 'bad_request_for_sentry_api' SENTRY_API_ERROR_TYPE_MISSING_KEYS = 'missing_keys_in_sentry_response' @@ -141,6 +142,7 @@ module ErrorTracking def add_gitlab_issue_details(issue) issue.gitlab_commit = match_gitlab_commit(issue.first_release_version) + issue.gitlab_commit_path = project_commit_path(project, issue.gitlab_commit) if issue.gitlab_commit issue end diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index fd5708f742f..43f472b4c1d 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -13,11 +13,6 @@ class UserPolicy < BasePolicy desc "The user is blocked" condition(:blocked_user, scope: :subject, score: 0) { @subject.blocked? } - condition(:updating_name_disabled_for_users) do - ::Gitlab::CurrentSettings.current_application_settings - .updating_name_disabled_for_users - end - rule { ~restricted_public_level }.enable :read_user rule { ~anonymous }.enable :read_user @@ -27,8 +22,8 @@ class UserPolicy < BasePolicy enable :update_user_status end - rule { can?(:update_user) & ( admin | ~updating_name_disabled_for_users ) }.enable :update_name - rule { default }.enable :read_user_profile rule { (private_profile | blocked_user) & ~(user_is_self | admin) }.prevent :read_user_profile end + +UserPolicy.prepend_if_ee('EE::UserPolicy') diff --git a/app/serializers/error_tracking/detailed_error_entity.rb b/app/serializers/error_tracking/detailed_error_entity.rb index 7bc2b3ce576..d3b38a24316 100644 --- a/app/serializers/error_tracking/detailed_error_entity.rb +++ b/app/serializers/error_tracking/detailed_error_entity.rb @@ -9,6 +9,7 @@ module ErrorTracking :first_release_last_commit, :first_release_short_version, :gitlab_commit, + :gitlab_commit_path, :first_seen, :frequency, :gitlab_issue, diff --git a/app/services/users/update_service.rb b/app/services/users/update_service.rb index dfbb65b7fcf..e7667b0ca18 100644 --- a/app/services/users/update_service.rb +++ b/app/services/users/update_service.rb @@ -54,7 +54,6 @@ module Users def discard_read_only_attributes discard_synced_attributes - discard_name unless name_updatable? end def discard_synced_attributes @@ -65,14 +64,6 @@ module Users end end - def discard_name - params.delete(:name) - end - - def name_updatable? - can?(current_user, :update_name, @user) - end - def assign_attributes @user.assign_attributes(params.except(*identity_attributes)) unless params.empty? end diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml index 60130f9b5ef..80a53dba2aa 100644 --- a/app/views/admin/application_settings/_account_and_limit.html.haml +++ b/app/views/admin/application_settings/_account_and_limit.html.haml @@ -51,13 +51,8 @@ = f.check_box :user_show_add_ssh_key_message, class: 'form-check-input' = f.label :user_show_add_ssh_key_message, class: 'form-check-label' do = _("Inform users without uploaded SSH keys that they can't push over SSH until one is added") - .form-group - = f.label :updating_name_disabled_for_users, _('User restrictions'), class: 'label-bold' - .form-check - = f.check_box :updating_name_disabled_for_users, class: 'form-check-input' - = f.label :updating_name_disabled_for_users, class: 'form-check-label' do - = _("Prevent users from changing their profile name") + = render_if_exists 'admin/application_settings/updating_name_disabled_for_users', form: f = render_if_exists 'admin/application_settings/availability_on_namespace_setting', form: f = f.submit _('Save changes'), class: 'btn btn-success qa-save-changes-button' diff --git a/app/views/profiles/_name.html.haml b/app/views/profiles/_name.html.haml index 8711be5cd29..87f1634b4f3 100644 --- a/app/views/profiles/_name.html.haml +++ b/app/views/profiles/_name.html.haml @@ -1,8 +1,5 @@ - if user.read_only_attribute?(:name) = form.text_field :name, required: true, readonly: true, wrapper: { class: 'col-md-9 qa-full-name rspec-full-name' }, help: s_("Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you") % { provider_label: attribute_provider_label(:name) } -- elsif can?(current_user, :update_name, user) - = form.text_field :name, label: s_('Profiles|Full name'), required: true, title: s_("Profiles|Using emojis in names seems fun, but please try to set a status message instead"), wrapper: { class: 'col-md-9 qa-full-name rspec-full-name' }, help: s_("Profiles|Enter your name, so people you know can recognize you") - else - = form.text_field :name, required: true, readonly: true, wrapper: { class: 'col-md-9 qa-full-name rspec-full-name' }, - help: s_("Profiles|The ability to update your name has been disabled by your administrator.") + = form.text_field :name, label: s_('Profiles|Full name'), required: true, title: s_("Profiles|Using emojis in names seems fun, but please try to set a status message instead"), wrapper: { class: 'col-md-9 qa-full-name rspec-full-name' }, help: s_("Profiles|Enter your name, so people you know can recognize you") diff --git a/changelogs/unreleased/38223-add-gitlab-commit-path.yml b/changelogs/unreleased/38223-add-gitlab-commit-path.yml new file mode 100644 index 00000000000..34373efc001 --- /dev/null +++ b/changelogs/unreleased/38223-add-gitlab-commit-path.yml @@ -0,0 +1,5 @@ +--- +title: Add gitlab_commit_path to Sentry Error Details Response +merge_request: 22803 +author: +type: added diff --git a/config/application.rb b/config/application.rb index f9cc1cb543a..3ebd4a3bc36 100644 --- a/config/application.rb +++ b/config/application.rb @@ -229,13 +229,15 @@ module Gitlab # Allow access to GitLab API from other domains config.middleware.insert_before Warden::Manager, Rack::Cors do + headers_to_expose = %w[Link X-Total X-Total-Pages X-Per-Page X-Page X-Next-Page X-Prev-Page X-Gitlab-Blob-Id X-Gitlab-Commit-Id X-Gitlab-Content-Sha256 X-Gitlab-Encoding X-Gitlab-File-Name X-Gitlab-File-Path X-Gitlab-Last-Commit-Id X-Gitlab-Ref X-Gitlab-Size] + allow do origins Gitlab.config.gitlab.url resource '/api/*', credentials: true, headers: :any, methods: :any, - expose: %w[Link X-Total X-Total-Pages X-Per-Page X-Page X-Next-Page X-Prev-Page] + expose: headers_to_expose end # Cross-origin requests must not have the session cookie available @@ -245,7 +247,7 @@ module Gitlab credentials: false, headers: :any, methods: :any, - expose: %w[Link X-Total X-Total-Pages X-Per-Page X-Page X-Next-Page X-Prev-Page] + expose: headers_to_expose end end diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 4c037a00857..5d534e6a075 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -5721,6 +5721,11 @@ type SentryDetailedError { """ gitlabCommit: String + """ + Path to the GitLab page for the GitLab commit attributed to the error + """ + gitlabCommitPath: String + """ ID (global ID) of the error """ diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index eb6e3f8ef16..f7ab02e9e9a 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -15576,6 +15576,20 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "gitlabCommitPath", + "description": "Path to the GitLab page for the GitLab commit attributed to the error", + "args": [ + + ], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "id", "description": "ID (global ID) of the error", diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 2b8719f725d..ef6d316e7d6 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -895,6 +895,7 @@ Autogenerated return type of RemoveAwardEmoji | `firstReleaseShortVersion` | String | Release version the error was first seen | | `lastReleaseShortVersion` | String | Release version the error was last seen | | `gitlabCommit` | String | GitLab commit SHA attributed to the Error based on the release version | +| `gitlabCommitPath` | String | Path to the GitLab page for the GitLab commit attributed to the error | ## SentryErrorFrequency diff --git a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select-template.png b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select-template.png deleted file mode 100644 index 727995f463c..00000000000 Binary files a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select-template.png and /dev/null differ diff --git a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select_template_v12_6.png b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select_template_v12_6.png new file mode 100644 index 00000000000..97887db4486 Binary files /dev/null and b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/select_template_v12_6.png differ diff --git a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/set_up_ci_v12_6.png b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/set_up_ci_v12_6.png new file mode 100644 index 00000000000..85fb58d4458 Binary files /dev/null and b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/set_up_ci_v12_6.png differ diff --git a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/setup-ci.png b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/setup-ci.png deleted file mode 100644 index 50c6ca593c1..00000000000 Binary files a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/img/setup-ci.png and /dev/null differ diff --git a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/index.md b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/index.md index 541578db294..f91e89d3c4c 100644 --- a/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/index.md +++ b/doc/ci/examples/test_phoenix_app_with_gitlab_ci_cd/index.md @@ -10,7 +10,7 @@ last_updated: 2019-03-06 # Testing a Phoenix application with GitLab CI/CD -[Phoenix][phoenix-site] is a web development framework written in [Elixir][elixir-site], which is a +[Phoenix](https://phoenixframework.org) is a web development framework written in [Elixir](https://elixir-lang.org), which is a functional language designed for productivity and maintainability that runs on the [Erlang VM](https://www.erlang.org). Erlang VM is really really fast and can handle very large numbers of simultaneous users. @@ -27,8 +27,8 @@ and the GitLab UI. ### What is Phoenix? -[Phoenix][phoenix-site] is a web development framework written in [Elixir][elixir-site] very useful - to build fast, reliable, and high-performance applications, as it uses [Erlang VM](https://www.erlang.org). +[Phoenix](https://phoenixframework.org) is a web development framework written in [Elixir](https://elixir-lang.org) it's very useful + for building fast, reliable, and high-performance applications, as it uses [Erlang VM](https://www.erlang.org). Many components and concepts are similar to Ruby on Rails or Python's Django. High developer productivity and high application performance are only a few advantages on learning how to use it. @@ -45,27 +45,27 @@ Phoenix can run in any OS where Erlang is supported: - Fedora - Raspbian -Check the [Phoenix learning guide][phoenix-learning-guide] for more information. +Check the [Phoenix learning guide](https://hexdocs.pm/phoenix/learning.html) for more information. ### What is Elixir? -[Elixir][elixir-site] is a dynamic, functional language created to use all the maturity of Erlang +[Elixir](https://elixir-lang.org) is a dynamic, functional language created to use all the maturity of Erlang (30 years old!) in these days, in an easy way. It has similarities with Ruby, specially on syntax, so Ruby developers are quite excited with the rapid growing of Elixir. A full-stack Ruby developer can learn how to use Elixir and Phoenix in just a few weeks! In Elixir we have a command called `mix`, which is a helper to create projects, testing, run -migrations and [much more][elixir-mix]. We'll use it later on in this tutorial. +migrations and [much more](https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix). We'll use it later on in this tutorial. -Check the [Elixir documentation][elixir-docs] for more information. +Check the [Elixir documentation](https://elixir-lang.org/getting-started/introduction) for more information. ## Requirements To follow this tutorial, you'll need to have installed: -- Elixir [installation instructions][elixir-install] -- Phoenix Framework [installation instructions][phoenix-install] -- PostgreSQL (if you need to use MySQL server, check [Phoenix instructions][phoenix-mysql]) +- Elixir [installation instructions](https://elixir-lang.org/install) +- Phoenix Framework [installation instructions](https://hexdocs.pm/phoenix/installation.html) +- PostgreSQL (if you need to use MySQL server, check [Phoenix instructions](https://hexdocs.pm/phoenix/ecto.html#using-mysql)) ### Create a new Phoenix project @@ -100,7 +100,7 @@ this case, we'll only create an empty database. First, we need to navigate to our recently created project's directory, and then execute again `mix`. This time, `mix` will receive the parameter `ecto.create`, which is the task to create our -new database. [Ecto][ecto] is the database wrapper for Elixir. +new database. [Ecto](https://hexdocs.pm/ecto/Ecto.html) is the database wrapper for Elixir. When we do run `mix` the first time after creating our project, it will compile our files to bytecode, which will be interpreted by Erlang VM. In the next times, it will only compile our @@ -123,7 +123,7 @@ The database for HelloGitlabCi.Repo has been created > **Note:** Phoenix assumes that our PostgreSQL database will have a `postgres` user account with the correct permissions and a password of `postgres`. If it's not your case, check -[Ecto's instructions][ecto-repo]. +[Ecto's instructions](https://hexdocs.pm/ecto/Ecto.html#module-repositories). ### Start Phoenix server @@ -151,7 +151,7 @@ point `localhost` to `127.0.0.1`. Great, now we have a local Phoenix Server running our app. -Locally, our application is running in an `iex` session. [iex][iex] stands for Interactive Elixir. +Locally, our application is running in an `iex` session. [iex](https://elixir-lang.org/getting-started/introduction.html#interactive-mode) stands for Interactive Elixir. In this interactive mode, we can type any Elixir expression and get its result. To exit `iex`, we need to press `Ctrl+C` twice. So, when we need to stop the Phoenix server, we have to hit `Ctrl+C` twice. @@ -245,17 +245,16 @@ Our test was successful. It's time to push our files to GitLab. The first step is to create a new file called `.gitlab-ci.yml` in `hello_gitlab_ci` directory of our project. -- The fastest and easiest way to do this, is to click on **Set up CI** on project's main page: +- The easiest way to do this is to click on **Set up CI/CD** on project's main page: - ![Set up CI](img/setup-ci.png) + ![Set up CI](img/set_up_ci_v12_6.png) -- On next screen, we can select a template ready to go. Click on **Apply a GitLab CI/CD Yaml - template** and select **Elixir**: +- On the next screen, we can use a template with Elixir tests already included. Click on **Apply a template** and select **Elixir**: - ![Select template](img/select-template.png) + ![Select template](img/select_template_v12_6.png) This template file tells GitLab CI/CD about what we wish to do every time a new commit is made. - However, we have to adapt it to run a Phoenix app. + However, we have to adapt it slightly to run a Phoenix app. - The first line tells GitLab what Docker image will be used. @@ -263,21 +262,21 @@ project. our application? This virtual machine must have all dependencies to run our application. This is where a Docker image is needed. The correct image will provide the entire system for us. - As a suggestion, you can use [trenpixster's elixir image][docker-image], which already has all - dependencies for Phoenix installed, such as Elixir, Erlang, NodeJS and PostgreSQL: + As we are focusing on testing (not deploying), you can use the [elixir:latest](https://hub.docker.com/_/elixir) docker image, which already has the + dependencies for running Phoenix tests installed, such as Elixir and Erlang: ```yml - image: trenpixster/elixir:latest + image: elixir:latest ``` -- At `services` session, we'll only use `postgres`, so we'll delete `mysql` and `redis` lines: +- We'll only use `postgres`, so we can delete the `mysql` and `redis` lines from the `services` section: ```yml services: - postgres:latest ``` -- Now, we'll create a new entry called `variables`, before `before_script` session: +- Now, we'll create a new section called `variables`, before the `before_script` section: ```yml variables: @@ -288,54 +287,56 @@ project. MIX_ENV: "test" ``` - Here, we are setting up the values for GitLab CI/CD authenticate into PostgreSQL, as we did on - `config/test.exs` earlier. + Above, we set up the values for GitLab CI/CD to authenticate into PostgreSQL, like we did in + `config/test.exs` earlier. The `POSTGRES_USER` and `POSTGRES_PASSWORD` values + are used by the `postgres` service to create a user with those credentials. -- In `before_script` session, we'll add some commands to prepare everything to the test: +- In the `before_script` section, we'll add some commands to prepare everything for the test: ```yml before_script: - - apt-get update && apt-get -y install postgresql-client + - mix local.rebar --force - mix local.hex --force - mix deps.get --only test - mix ecto.create - mix ecto.migrate ``` - It's important to install `postgresql-client` to let GitLab CI/CD access PostgreSQL and create our - database with the login information provided earlier. More important is to respect the indentation, - to avoid syntax errors when running the build. + This ensures that [rebar3](https://www.rebar3.org) and [hex](https://hex.pm) are both installed + before attempting to fetch the dependencies that are required to run the tests. Next, the `postgres` db + is created and migrated with `ecto`, to ensure it's up-to-date. -- And finally, we'll let `mix` session intact. +- Finally, we'll leave the `mix` section unchanged. -Let's take a look at the completed file after the editions: +Let's take a look at the updated file after the changes: ```yml -image: trenpixster/elixir:latest +image: elixir:latest services: - postgres:latest variables: - POSTGRES_DB: test_test + POSTGRES_DB: hello_gitlab_ci_test POSTGRES_HOST: postgres POSTGRES_USER: postgres POSTGRES_PASSWORD: "postgres" MIX_ENV: "test" before_script: - - apt-get update && apt-get -y install postgresql-client - - mix deps.get + - mix local.rebar --force + - mix local.hex --force + - mix deps.get --only test - mix ecto.create - mix ecto.migrate mix: script: - - mix test + - mix test ``` For safety, we can check if we get any syntax errors before submitting this file to GitLab. Copy the -contents of `.gitlab-ci.yml` and paste it on [GitLab CI/CD Lint tool][ci-lint]. Please note that +contents of `.gitlab-ci.yml` and paste it on [GitLab CI/CD Lint tool](https://gitlab.com/ci/lint). Please note that this link will only work for logged in users. ## Watching the build @@ -374,7 +375,7 @@ see if our latest code is running without errors. When we finish this edition, GitLab will start another build and show a **build running** badge. It is expected, after all we just configured GitLab CI/CD to do this for every push! But you may think "Why run build and tests for simple things like editing README.md?" and it is a good question. -For changes that don't affect your application, you can add the keyword [`[ci skip]`][skipping-jobs] +For changes that don't affect your application, you can add the keyword [`[ci skip]`](../../yaml/README.md#skipping-jobs) to commit message and the build related to that commit will be skipped. In the end, we finally got our pretty green build succeeded badge! By outputting the result on the @@ -389,34 +390,12 @@ code permanently working. GitLab CI/CD is a time saving powerful tool to help us organized and working. As we could see in this post, GitLab CI/CD is really really easy to configure and use. We have [many -other reasons][ci-reasons] to keep using GitLab CI/CD. The benefits to our teams will be huge! +other reasons](https://about.gitlab.com/blog/2015/02/03/7-reasons-why-you-should-be-using-ci/) to keep +using GitLab CI/CD. The benefits to our teams will be huge! ## References -- [GitLab CI/CD introductory guide][ci-guide] -- [GitLab CI/CD full Documentation][ci-docs] -- [GitLab Runners documentation][gitlab-runners] -- [Using Docker images documentation][using-docker] -- [Example project: Hello GitLab CI/CD on GitLab][hello-gitlab] - -[phoenix-site]: https://phoenixframework.org/ "Phoenix Framework" -[phoenix-learning-guide]: https://hexdocs.pm/phoenix/learning.html "Phoenix Learning Guide" -[phoenix-install]: https://hexdocs.pm/phoenix/installation.html "Phoenix Installation" -[phoenix-mysql]: https://hexdocs.pm/phoenix/ecto.html#using-mysql "Phoenix with MySQL" -[elixir-site]: https://elixir-lang.org/ "Elixir" -[elixir-mix]: https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html "Introduction to mix" -[elixir-docs]: https://elixir-lang.org/getting-started/introduction.html "Elixir Documentation" -[elixir-install]: https://elixir-lang.org/install.html "Elixir Installation" -[ecto]: https://hexdocs.pm/ecto/Ecto.html "Ecto" -[ecto-repo]: https://hexdocs.pm/ecto/Ecto.html#module-repositories "Ecto Repositories" -[mix-ecto]: https://hexdocs.pm/ecto/Mix.Tasks.Ecto.Create.html "mix and Ecto" -[iex]: https://elixir-lang.org/getting-started/introduction.html#interactive-mode "Interactive Mode" -[ci-lint]: https://gitlab.com/ci/lint "CI Lint Tool" -[ci-reasons]: https://about.gitlab.com/blog/2015/02/03/7-reasons-why-you-should-be-using-ci/ "7 Reasons Why You Should Be Using CI" -[ci-guide]: https://about.gitlab.com/blog/2015/12/14/getting-started-with-gitlab-and-gitlab-ci/ "Getting Started With GitLab And GitLab CI/CD" -[ci-docs]: ../../README.md "GitLab CI/CD Documentation" -[skipping-jobs]: ../../yaml/README.md#skipping-jobs "Skipping Jobs" -[gitlab-runners]: ../../runners/README.md "GitLab Runners Documentation" -[docker-image]: https://hub.docker.com/r/trenpixster/elixir/ "Elixir Docker Image" -[using-docker]: ../../docker/using_docker_images.md "Using Docker Images" -[hello-gitlab]: https://gitlab.com/Hostert/hello_gitlab_ci "Hello GitLab CI/CD" +- [GitLab CI/CD introductory guide](https://about.gitlab.com/blog/2015/12/14/getting-started-with-gitlab-and-gitlab-ci) +- [GitLab CI/CD full Documentation](../../README.md) +- [GitLab Runners documentation](../../runners/README.md) +- [Using Docker images documentation](../../docker/using_docker_images.md) diff --git a/doc/user/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md index c2ad56351c0..131ff949cd1 100644 --- a/doc/user/admin_area/settings/account_and_limit_settings.md +++ b/doc/user/admin_area/settings/account_and_limit_settings.md @@ -117,7 +117,7 @@ Once a lifetime for personal access tokens is set, GitLab will: allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime, or remove it, before revocation takes place. -## Disabling user profile name changes **(CORE ONLY)** +## Disabling user profile name changes **(PREMIUM ONLY)** > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/24605) in GitLab 12.7. diff --git a/lib/api/settings.rb b/lib/api/settings.rb index f816a94801a..5362b3060c1 100644 --- a/lib/api/settings.rb +++ b/lib/api/settings.rb @@ -142,7 +142,6 @@ module API requires :sourcegraph_url, type: String, desc: 'The configured Sourcegraph instance URL' end optional :terminal_max_session_time, type: Integer, desc: 'Maximum time for web terminal websocket connection (in seconds). Set to 0 for unlimited time.' - optional :updating_name_disabled_for_users, type: Boolean, desc: 'Flag indicating if users are permitted to update their profile name' optional :usage_ping_enabled, type: Boolean, desc: 'Every week GitLab will report license usage back to GitLab, Inc.' optional :instance_statistics_visibility_private, type: Boolean, desc: 'When set to `true` Instance statistics will only be available to admins' optional :local_markdown_version, type: Integer, desc: 'Local markdown version, increase this value when any cached markdown should be invalidated' diff --git a/lib/gitlab/error_tracking/detailed_error.rb b/lib/gitlab/error_tracking/detailed_error.rb index 47ed88b2ab1..c240ec1fa4f 100644 --- a/lib/gitlab/error_tracking/detailed_error.rb +++ b/lib/gitlab/error_tracking/detailed_error.rb @@ -16,6 +16,7 @@ module Gitlab :first_seen, :frequency, :gitlab_commit, + :gitlab_commit_path, :gitlab_issue, :gitlab_project, :id, diff --git a/lib/gitlab/experimentation.rb b/lib/gitlab/experimentation.rb index 4fbf15d521a..9d14695c098 100644 --- a/lib/gitlab/experimentation.rb +++ b/lib/gitlab/experimentation.rb @@ -16,6 +16,12 @@ module Gitlab environment: ::Gitlab.dev_env_or_com?, enabled_ratio: 1, tracking_category: 'Growth::Acquisition::Experiment::SignUpFlow' + }, + paid_signup_flow: { + feature_toggle: :paid_signup_flow, + environment: ::Gitlab.dev_env_or_com?, + enabled_ratio: 0.1, + tracking_category: 'Growth::Acquisition::Experiment::PaidSignUpFlow' } }.freeze diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 6bd93a1a5bf..a64eb2c40c2 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -6576,6 +6576,9 @@ msgstr "" msgid "Edit Deploy Key" msgstr "" +msgid "Edit Geo Node" +msgstr "" + msgid "Edit Group Hook" msgstr "" @@ -8303,6 +8306,9 @@ msgstr "" msgid "Geo Designs" msgstr "" +msgid "Geo Node Form" +msgstr "" + msgid "Geo Nodes" msgstr "" @@ -11969,6 +11975,9 @@ msgstr "" msgid "New Environment" msgstr "" +msgid "New Geo Node" +msgstr "" + msgid "New Group" msgstr "" diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb index e2bded3f176..fa575ba2eae 100644 --- a/spec/controllers/admin/application_settings_controller_spec.rb +++ b/spec/controllers/admin/application_settings_controller_spec.rb @@ -102,13 +102,6 @@ describe Admin::ApplicationSettingsController do expect(ApplicationSetting.current.minimum_password_length).to eq(10) end - it 'updates updating_name_disabled_for_users setting' do - put :update, params: { application_setting: { updating_name_disabled_for_users: true } } - - expect(response).to redirect_to(admin_application_settings_path) - expect(ApplicationSetting.current.updating_name_disabled_for_users).to eq(true) - end - context 'external policy classification settings' do let(:settings) do { diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb index 54ba7a6fb6c..ebdfbe14dec 100644 --- a/spec/controllers/admin/users_controller_spec.rb +++ b/spec/controllers/admin/users_controller_spec.rb @@ -257,28 +257,6 @@ describe Admin::UsersController do end describe 'POST update' do - context 'updating name' do - context 'when the ability to update their name is disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: true) - end - - it 'updates the name' do - params = { - id: user.to_param, - user: { - name: 'New Name' - } - } - - put :update, params: params - - expect(response).to redirect_to(admin_user_path(user)) - expect(user.reload.name).to eq('New Name') - end - end - end - context 'when the password has changed' do def update_password(user, password, password_confirmation = nil) params = { diff --git a/spec/controllers/profiles_controller_spec.rb b/spec/controllers/profiles_controller_spec.rb index 85b3ba286a1..265f941e146 100644 --- a/spec/controllers/profiles_controller_spec.rb +++ b/spec/controllers/profiles_controller_spec.rb @@ -81,54 +81,6 @@ describe ProfilesController, :request_store do expect(ldap_user.location).to eq('City, Country') end - context 'updating name' do - subject { put :update, params: { user: { name: 'New Name' } } } - - context 'when the ability to update thier name is not disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: false) - sign_in(user) - end - - it 'updates the name' do - subject - - expect(response.status).to eq(302) - expect(user.reload.name).to eq('New Name') - end - end - - context 'when the ability to update their name is disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: true) - end - - context 'as a regular user' do - it 'does not update the name' do - sign_in(user) - - subject - - expect(response.status).to eq(302) - expect(user.reload.name).not_to eq('New Name') - end - end - - context 'as an admin user' do - it 'updates the name' do - admin = create(:admin) - - sign_in(admin) - - subject - - expect(response.status).to eq(302) - expect(admin.reload.name).to eq('New Name') - end - end - end - end - it 'allows setting a user status' do sign_in(user) diff --git a/spec/controllers/projects/error_tracking_controller_spec.rb b/spec/controllers/projects/error_tracking_controller_spec.rb index 65459b845f9..588c4b05528 100644 --- a/spec/controllers/projects/error_tracking_controller_spec.rb +++ b/spec/controllers/projects/error_tracking_controller_spec.rb @@ -224,7 +224,12 @@ describe Projects::ErrorTrackingController do let(:error) { build(:detailed_error_tracking_error) } it 'returns an error' do - expected_error = error.as_json.except('first_release_version').merge({ 'gitlab_commit' => nil }) + expected_error = error.as_json.except('first_release_version').merge( + { + 'gitlab_commit' => nil, + 'gitlab_commit_path' => nil + } + ) expect(response).to have_gitlab_http_status(:ok) expect(response).to match_response_schema('error_tracking/issue_detailed') diff --git a/spec/factories/error_tracking/detailed_error.rb b/spec/factories/error_tracking/detailed_error.rb index 7e217246f91..07b6c53e3cd 100644 --- a/spec/factories/error_tracking/detailed_error.rb +++ b/spec/factories/error_tracking/detailed_error.rb @@ -34,7 +34,7 @@ FactoryBot.define do last_release_last_commit { '9ad419c86' } first_release_short_version { 'abc123' } last_release_short_version { 'abc123' } - first_release_version { '123456' } + first_release_version { '12345678' } skip_create end diff --git a/spec/fixtures/api/schemas/error_tracking/error_detailed.json b/spec/fixtures/api/schemas/error_tracking/error_detailed.json index 57cf5e677d6..2b6580e39f7 100644 --- a/spec/fixtures/api/schemas/error_tracking/error_detailed.json +++ b/spec/fixtures/api/schemas/error_tracking/error_detailed.json @@ -56,7 +56,8 @@ "last_release_last_commit": { "type": ["string", "null"] }, "first_release_short_version": { "type": ["string", "null"] }, "last_release_short_version": { "type": ["string", "null"] }, - "gitlab_commit": { "type": ["string", "null"] } + "gitlab_commit": { "type": ["string", "null"] }, + "gitlab_commit_path": { "type": ["string", "null"] } }, "additionalProperties": false } diff --git a/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb b/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb index 15d53644884..30cede6f4cf 100644 --- a/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb +++ b/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb @@ -31,6 +31,7 @@ describe GitlabSchema.types['SentryDetailedError'] do firstReleaseShortVersion lastReleaseShortVersion gitlabCommit + gitlabCommitPath ] is_expected.to have_graphql_fields(*expected_fields) diff --git a/spec/models/error_tracking/project_error_tracking_setting_spec.rb b/spec/models/error_tracking/project_error_tracking_setting_spec.rb index 3dfdd9c1392..6babc39cdc3 100644 --- a/spec/models/error_tracking/project_error_tracking_setting_spec.rb +++ b/spec/models/error_tracking/project_error_tracking_setting_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' describe ErrorTracking::ProjectErrorTrackingSetting do include ReactiveCachingHelpers + include Gitlab::Routing let_it_be(:project) { create(:project) } @@ -213,7 +214,7 @@ describe ErrorTracking::ProjectErrorTrackingSetting do describe '#issue_details' do let(:issue) { build(:detailed_error_tracking_error) } let(:sentry_client) { double('sentry_client', issue_details: issue) } - let(:commit_id) { '123456' } + let(:commit_id) { issue.first_release_version } let(:result) do subject.issue_details @@ -230,6 +231,7 @@ describe ErrorTracking::ProjectErrorTrackingSetting do it { expect(result).to eq(issue: issue) } it { expect(result[:issue].first_release_version).to eq(commit_id) } it { expect(result[:issue].gitlab_commit).to eq(nil) } + it { expect(result[:issue].gitlab_commit_path).to eq(nil) } context 'when release version is nil' do before do @@ -237,6 +239,7 @@ describe ErrorTracking::ProjectErrorTrackingSetting do end it { expect(result[:issue].gitlab_commit).to eq(nil) } + it { expect(result[:issue].gitlab_commit_path).to eq(nil) } end context 'when repo commit matches first relase version' do @@ -248,6 +251,7 @@ describe ErrorTracking::ProjectErrorTrackingSetting do end it { expect(result[:issue].gitlab_commit).to eq(commit_id) } + it { expect(result[:issue].gitlab_commit_path).to eq("/#{project.namespace.path}/#{project.path}/commit/#{commit_id}") } end end diff --git a/spec/policies/user_policy_spec.rb b/spec/policies/user_policy_spec.rb index 0af58e96c5e..9da9d2ce49b 100644 --- a/spec/policies/user_policy_spec.rb +++ b/spec/policies/user_policy_spec.rb @@ -48,36 +48,4 @@ describe UserPolicy do describe "updating a user" do it_behaves_like 'changing a user', :update_user end - - describe "updating a user's name" do - context 'when the ability to update their name is not disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: false) - end - - it_behaves_like 'changing a user', :update_name - end - - context 'when the ability to update their name is disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: true) - end - - context 'for a regular user' do - it { is_expected.not_to be_allowed(:update_name) } - end - - context 'for a ghost user' do - let(:current_user) { create(:user, :ghost) } - - it { is_expected.not_to be_allowed(:update_name) } - end - - context 'for an admin user' do - let(:current_user) { create(:admin) } - - it { is_expected.to be_allowed(:update_name) } - end - end - end end diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb index ff443fdd27a..af86ba86303 100644 --- a/spec/requests/api/settings_spec.rb +++ b/spec/requests/api/settings_spec.rb @@ -136,14 +136,6 @@ describe API::Settings, 'Settings' do expect(json_response['performance_bar_allowed_group_id']).to eq(group.id) end - it "supports updating_name_disabled_for_users" do - put api("/application/settings", admin), - params: { updating_name_disabled_for_users: true } - - expect(response).to have_gitlab_http_status(200) - expect(json_response['updating_name_disabled_for_users']).to eq(true) - end - it "supports legacy performance_bar_enabled" do put api("/application/settings", admin), params: { diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb index 8b9aab33d67..0a22a09b8a6 100644 --- a/spec/requests/api/users_spec.rb +++ b/spec/requests/api/users_spec.rb @@ -645,21 +645,6 @@ describe API::Users do expect(response).to have_gitlab_http_status(200) end - context 'updating name' do - context 'when the ability to update their name is disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: true) - end - - it 'updates the user with new name' do - put api("/users/#{user.id}", admin), params: { name: 'New Name' } - - expect(response).to have_gitlab_http_status(200) - expect(json_response['name']).to eq('New Name') - end - end - end - it "updates user with new bio" do put api("/users/#{user.id}", admin), params: { bio: 'new test bio' } diff --git a/spec/services/users/update_service_spec.rb b/spec/services/users/update_service_spec.rb index f3c15011213..50bbb16e368 100644 --- a/spec/services/users/update_service_spec.rb +++ b/spec/services/users/update_service_spec.rb @@ -6,46 +6,6 @@ describe Users::UpdateService do let(:user) { create(:user) } describe '#execute' do - context 'updating name' do - context 'when the ability to update their name is not disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: false) - end - - it 'updates the name' do - result = update_user(user, name: 'New Name') - - expect(result).to eq(status: :success) - expect(user.name).to eq('New Name') - end - end - - context 'when the ability to update their name is disabled for users' do - before do - stub_application_setting(updating_name_disabled_for_users: true) - end - - context 'executing as a regular user' do - it 'does not update the name' do - result = update_user(user, name: 'New Name') - - expect(result).to eq(status: :success) - expect(user.name).not_to eq('New Name') - end - end - - context 'executing as an admin user' do - it 'updates the name' do - admin = create(:admin) - result = described_class.new(admin, { user: user, name: 'New Name' }).execute - - expect(result).to eq(status: :success) - expect(user.name).to eq('New Name') - end - end - end - end - it 'updates time preferences' do result = update_user(user, timezone: 'Europe/Warsaw', time_display_relative: true, time_format_in_24h: false) -- cgit v1.2.3