Commit 862d225c authored by GitLab Bot's avatar GitLab Bot

Add latest changes from gitlab-org/gitlab@master

parent d10a462f
...@@ -30,6 +30,7 @@ after_script: ...@@ -30,6 +30,7 @@ after_script:
- date - date
include: include:
- local: .gitlab/ci/cache-repo.gitlab-ci.yml
- local: .gitlab/ci/cng.gitlab-ci.yml - local: .gitlab/ci/cng.gitlab-ci.yml
- local: .gitlab/ci/docs.gitlab-ci.yml - local: .gitlab/ci/docs.gitlab-ci.yml
- local: .gitlab/ci/frontend.gitlab-ci.yml - local: .gitlab/ci/frontend.gitlab-ci.yml
......
# Builds a cached .tar.gz of the master branch with full history and
# uploads it to Google Cloud Storage. This archive is downloaded by a
# script defined by a CI/CD variable named CI_PRE_CLONE_SCRIPT. This has
# two benefits:
#
# 1. It speeds up builds. A 800 MB download only takes seconds.
# 2. It significantly reduces load on the file server. Smaller deltas
# means less time spent in git pack-objects.
#
# Since the destination directory of the archive depends on the project
# ID, this is only run on GitLab.com.
#
# CI_REPO_CACHE_CREDENTIALS contains the Google Cloud service account
# JSON for uploading to the gitlab-ci-git-repo-cache bucket. These
# credentials are stored in the Production vault.
#
# Note that this bucket should be located in the same continent as the
# runner, or network egress charges will apply:
# https://cloud.google.com/storage/pricing
cache-repo:
extends:
- .only:variables_refs-canonical-dot-com-schedules
image: gcr.io/google.com/cloudsdktool/cloud-sdk:alpine
stage: sync
allow_failure: true
variables:
GIT_DEPTH: 0
TAR_FILENAME: /tmp/gitlab-master.tar
script:
- gcloud auth activate-service-account --key-file=$CI_REPO_CACHE_CREDENTIALS
- tar cf $TAR_FILENAME .
- gzip $TAR_FILENAME
- gsutil cp $TAR_FILENAME.gz gs://gitlab-ci-git-repo-cache/project-$CI_PROJECT_ID/gitlab-master.tar.gz
...@@ -37,6 +37,8 @@ code_quality: ...@@ -37,6 +37,8 @@ code_quality:
artifacts: artifacts:
reports: reports:
codequality: gl-code-quality-report.json codequality: gl-code-quality-report.json
paths:
- gl-code-quality-report.json
expire_in: 1 week expire_in: 1 week
dependencies: [] dependencies: []
except: except:
......
...@@ -38,6 +38,10 @@ class ProjectSnippetPolicy < BasePolicy ...@@ -38,6 +38,10 @@ class ProjectSnippetPolicy < BasePolicy
rule { public_snippet }.enable :read_project_snippet rule { public_snippet }.enable :read_project_snippet
rule { is_author & ~project.reporter & ~admin }.policy do
prevent :admin_project_snippet
end
rule { is_author | admin }.policy do rule { is_author | admin }.policy do
enable :read_project_snippet enable :read_project_snippet
enable :update_project_snippet enable :update_project_snippet
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
- if can?(current_user, :update_project_snippet, @snippet) - if can?(current_user, :update_project_snippet, @snippet)
= link_to edit_project_snippet_path(@project, @snippet), class: "btn btn-grouped" do = link_to edit_project_snippet_path(@project, @snippet), class: "btn btn-grouped" do
= _('Edit') = _('Edit')
- if can?(current_user, :update_project_snippet, @snippet) - if can?(current_user, :admin_project_snippet, @snippet)
= link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do = link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do
= _('Delete') = _('Delete')
- if can?(current_user, :create_project_snippet, @project) - if can?(current_user, :create_project_snippet, @project)
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
%li %li
= link_to new_project_snippet_path(@project), title: _("New snippet") do = link_to new_project_snippet_path(@project), title: _("New snippet") do
= _('New snippet') = _('New snippet')
- if can?(current_user, :update_project_snippet, @snippet) - if can?(current_user, :admin_project_snippet, @snippet)
%li %li
= link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do = link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do
= _('Delete') = _('Delete')
......
---
title: Add Pipeline Metadata to Packages
merge_request: 19796
author:
type: added
---
title: Do not clean the prometheus metrics directory for sidekiq
merge_request: 21671
author:
type: fixed
---
title: Guest users should not delete project snippets they created
merge_request: 20477
author:
type: fixed
...@@ -32,15 +32,8 @@ end ...@@ -32,15 +32,8 @@ end
Sidekiq.configure_server do |config| Sidekiq.configure_server do |config|
config.on(:startup) do config.on(:startup) do
# webserver metrics are cleaned up in config.ru: `warmup` block # Do not clean the metrics directory here - the supervisor script should
Prometheus::CleanupMultiprocDirService.new.execute # have already taken care of that
# In production, sidekiq is run in a multi-process setup where processes might interfere
# with each other cleaning up and reinitializing prometheus database files, which is why
# we're re-doing the work every time here.
# A cleaner solution would be to run the cleanup pre-fork, and the initialization once
# after all workers have forked, but I don't know how at this point.
::Prometheus::Client.reinitialize_on_pid_change(force: true)
Gitlab::Metrics::Exporter::SidekiqExporter.instance.start Gitlab::Metrics::Exporter::SidekiqExporter.instance.start
end end
end end
......
...@@ -22,6 +22,8 @@ end ...@@ -22,6 +22,8 @@ end
# This initializer can be removed as soon as https://github.com/plataformatec/devise/pull/5166 # This initializer can be removed as soon as https://github.com/plataformatec/devise/pull/5166
# is merged into Devise. # is merged into Devise.
# TODO: Update Devise. Issue: https://gitlab.com/gitlab-org/gitlab/issues/118450
if length_validator_supports_dynamic_length_checks?(password_length_validator) if length_validator_supports_dynamic_length_checks?(password_length_validator)
raise "Devise now supports dynamic length checks, please remove the monkey patch in #{__FILE__}" raise "Devise now supports dynamic length checks, please remove the monkey patch in #{__FILE__}"
else else
......
# frozen_string_literal: true
class CreatePackageBuildInfo < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
create_table :packages_build_infos do |t|
t.references :package, null: false, foreign_key: { to_table: :packages_packages, on_delete: :cascade }, type: :integer, index: { unique: true }
t.references :pipeline, index: true, null: true, foreign_key: { to_table: :ci_pipelines, on_delete: :nullify }, type: :integer
end
end
end
...@@ -2846,6 +2846,13 @@ ActiveRecord::Schema.define(version: 2019_12_08_071112) do ...@@ -2846,6 +2846,13 @@ ActiveRecord::Schema.define(version: 2019_12_08_071112) do
t.index ["project_id", "token_encrypted"], name: "index_feature_flags_clients_on_project_id_and_token_encrypted", unique: true t.index ["project_id", "token_encrypted"], name: "index_feature_flags_clients_on_project_id_and_token_encrypted", unique: true
end end
create_table "packages_build_infos", force: :cascade do |t|
t.integer "package_id", null: false
t.integer "pipeline_id"
t.index ["package_id"], name: "index_packages_build_infos_on_package_id", unique: true
t.index ["pipeline_id"], name: "index_packages_build_infos_on_pipeline_id"
end
create_table "packages_conan_file_metadata", force: :cascade do |t| create_table "packages_conan_file_metadata", force: :cascade do |t|
t.bigint "package_file_id", null: false t.bigint "package_file_id", null: false
t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "created_at", null: false
...@@ -4644,6 +4651,8 @@ ActiveRecord::Schema.define(version: 2019_12_08_071112) do ...@@ -4644,6 +4651,8 @@ ActiveRecord::Schema.define(version: 2019_12_08_071112) do
add_foreign_key "operations_feature_flag_scopes", "operations_feature_flags", column: "feature_flag_id", on_delete: :cascade add_foreign_key "operations_feature_flag_scopes", "operations_feature_flags", column: "feature_flag_id", on_delete: :cascade
add_foreign_key "operations_feature_flags", "projects", on_delete: :cascade add_foreign_key "operations_feature_flags", "projects", on_delete: :cascade
add_foreign_key "operations_feature_flags_clients", "projects", on_delete: :cascade add_foreign_key "operations_feature_flags_clients", "projects", on_delete: :cascade
add_foreign_key "packages_build_infos", "ci_pipelines", column: "pipeline_id", on_delete: :nullify
add_foreign_key "packages_build_infos", "packages_packages", column: "package_id", on_delete: :cascade
add_foreign_key "packages_conan_file_metadata", "packages_package_files", column: "package_file_id", on_delete: :cascade add_foreign_key "packages_conan_file_metadata", "packages_package_files", column: "package_file_id", on_delete: :cascade
add_foreign_key "packages_conan_metadata", "packages_packages", column: "package_id", on_delete: :cascade add_foreign_key "packages_conan_metadata", "packages_packages", column: "package_id", on_delete: :cascade
add_foreign_key "packages_dependency_links", "packages_dependencies", column: "dependency_id", on_delete: :cascade add_foreign_key "packages_dependency_links", "packages_dependencies", column: "dependency_id", on_delete: :cascade
......
...@@ -305,7 +305,7 @@ Pages access control is disabled by default. To enable it: ...@@ -305,7 +305,7 @@ Pages access control is disabled by default. To enable it:
``` ```
1. [Reconfigure GitLab][reconfigure]. 1. [Reconfigure GitLab][reconfigure].
1. Users can now configure it in their [projects' settings](../../user/project/pages/introduction.md#gitlab-pages-access-control-core). 1. Users can now configure it in their [projects' settings](../../user/project/pages/pages_access_control.md).
### Running behind a proxy ### Running behind a proxy
...@@ -500,6 +500,7 @@ then you must use the following procedure to configure [access control](#access- ...@@ -500,6 +500,7 @@ then you must use the following procedure to configure [access control](#access-
```ruby ```ruby
gitlab_pages['gitlab_server'] = "https://<your-gitlab-server-URL>" gitlab_pages['gitlab_server'] = "https://<your-gitlab-server-URL>"
gitlab_pages['access_control'] = true
``` ```
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect. 1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
......
...@@ -83,7 +83,7 @@ gitlab-runner register \ ...@@ -83,7 +83,7 @@ gitlab-runner register \
--description "python-3.5" \ --description "python-3.5" \
--executor "docker" \ --executor "docker" \
--docker-image python:3.5 \ --docker-image python:3.5 \
--docker-postgres latest --docker-services postgres:latest
``` ```
With the command above, you create a runner that uses the [`python:3.5`](https://hub.docker.com/_/python) image and uses a [PostgreSQL](https://hub.docker.com/_/postgres) database. With the command above, you create a runner that uses the [`python:3.5`](https://hub.docker.com/_/python) image and uses a [PostgreSQL](https://hub.docker.com/_/postgres) database.
......
...@@ -33,7 +33,8 @@ the `author` field. GitLab team members **should not**. ...@@ -33,7 +33,8 @@ the `author` field. GitLab team members **should not**.
## What warrants a changelog entry? ## What warrants a changelog entry?
- Any change that introduces a database migration **must** have a changelog entry. - Any change that introduces a database migration, whether it's regular, post,
or data migration, **must** have a changelog entry.
- Any user-facing change **should** have a changelog entry. Example: "GitLab now - Any user-facing change **should** have a changelog entry. Example: "GitLab now
uses system fonts for all text." uses system fonts for all text."
- Performance improvements **should** have a changelog entry. - Performance improvements **should** have a changelog entry.
...@@ -43,8 +44,8 @@ the `author` field. GitLab team members **should not**. ...@@ -43,8 +44,8 @@ the `author` field. GitLab team members **should not**.
- Any docs-only changes **should not** have a changelog entry. - Any docs-only changes **should not** have a changelog entry.
- Any change behind a feature flag **should not** have a changelog entry. The - Any change behind a feature flag **should not** have a changelog entry. The
entry should be added [in the merge request removing the feature flags](feature_flags/development.md). entry should be added [in the merge request removing the feature flags](feature_flags/development.md).
If the change includes a database migration, there should be a changelog entry If the change includes a database migration (regular, post, or data migration),
for the migration change. there should be a changelog entry for the migration change.
- A fix for a regression introduced and then fixed in the same release (i.e., - A fix for a regression introduced and then fixed in the same release (i.e.,
fixing a bug introduced during a monthly release candidate) **should not** fixing a bug introduced during a monthly release candidate) **should not**
have a changelog entry. have a changelog entry.
......
...@@ -11,7 +11,7 @@ You can enable Pages access control on your project, so that only ...@@ -11,7 +11,7 @@ You can enable Pages access control on your project, so that only
[members of your project](../../permissions.md#project-members-permissions) [members of your project](../../permissions.md#project-members-permissions)
(at least Guest) can access your website: (at least Guest) can access your website:
1. Navigate to your project's **Settings > General > Permissions**. 1. Navigate to your project's **Settings > General** and expand **Visibility, project features, permissions**.
1. Toggle the **Pages** button to enable the access control. 1. Toggle the **Pages** button to enable the access control.
NOTE: **Note:** NOTE: **Note:**
......
...@@ -64,16 +64,25 @@ class GitlabProjectImport ...@@ -64,16 +64,25 @@ class GitlabProjectImport
private private
def with_request_store
RequestStore.begin!
yield
ensure
RequestStore.end!
RequestStore.clear!
end
# We want to ensure that all Sidekiq jobs are executed # We want to ensure that all Sidekiq jobs are executed
# synchronously as part of that process. # synchronously as part of that process.
# This ensures that all expensive operations do not escape # This ensures that all expensive operations do not escape
# to general Sidekiq clusters/nodes. # to general Sidekiq clusters/nodes.
def run_isolated_sidekiq_job def run_isolated_sidekiq_job
Sidekiq::Testing.fake! do Sidekiq::Testing.fake! do
@project = create_project with_request_store do
@project = create_project
execute_sidekiq_job
execute_sidekiq_job
end
true true
end end
end end
......
...@@ -3226,6 +3226,18 @@ msgstr "" ...@@ -3226,6 +3226,18 @@ msgstr ""
msgid "Checkout" msgid "Checkout"
msgstr "" msgstr ""
msgid "Checkout|1. Your profile"
msgstr ""
msgid "Checkout|2. Checkout"
msgstr ""
msgid "Checkout|3. Your GitLab group"
msgstr ""
msgid "Checkout|Checkout"
msgstr ""
msgid "Cherry-pick this commit" msgid "Cherry-pick this commit"
msgstr "" msgstr ""
......
...@@ -4,10 +4,12 @@ require 'spec_helper' ...@@ -4,10 +4,12 @@ require 'spec_helper'
# Snippet visibility scenarios are included in more details in spec/support/snippet_visibility.rb # Snippet visibility scenarios are included in more details in spec/support/snippet_visibility.rb
describe ProjectSnippetPolicy do describe ProjectSnippetPolicy do
let(:regular_user) { create(:user) } let_it_be(:regular_user) { create(:user) }
let(:external_user) { create(:user, :external) } let_it_be(:other_user) { create(:user) }
let(:project) { create(:project, :public) } let_it_be(:external_user) { create(:user, :external) }
let(:snippet) { create(:project_snippet, snippet_visibility, project: project) } let_it_be(:project) { create(:project, :public) }
let(:snippet) { create(:project_snippet, snippet_visibility, project: project, author: author) }
let(:author) { other_user }
let(:author_permissions) do let(:author_permissions) do
[ [
:update_project_snippet, :update_project_snippet,
...@@ -17,6 +19,65 @@ describe ProjectSnippetPolicy do ...@@ -17,6 +19,65 @@ describe ProjectSnippetPolicy do
subject { described_class.new(current_user, snippet) } subject { described_class.new(current_user, snippet) }
shared_examples 'regular user access rights' do
context 'project team member (non guest)' do
before do
project.add_developer(current_user)
end
it do
expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(*author_permissions)
end
end
context 'project team member (guest)' do
before do
project.add_guest(current_user)
end
context 'not snippet author' do
it do
expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(:admin_project_snippet)
end
end
end
context 'snippet author' do
let(:author) { current_user }
context 'project member (non guest)' do
before do
project.add_developer(current_user)
end
it do
expect_allowed(:read_project_snippet, :create_note)
expect_allowed(*author_permissions)
end
end
context 'project member (guest)' do
before do
project.add_guest(current_user)
end
it do
expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(:admin_project_snippet)
end
end
context 'not a project member' do
it do
expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(:admin_project_snippet)
end
end
end
end
context 'public snippet' do context 'public snippet' do
let(:snippet_visibility) { :public } let(:snippet_visibility) { :public }
...@@ -36,6 +97,8 @@ describe ProjectSnippetPolicy do ...@@ -36,6 +97,8 @@ describe ProjectSnippetPolicy do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
it_behaves_like 'regular user access rights'
end end
context 'external user' do context 'external user' do
...@@ -45,6 +108,17 @@ describe ProjectSnippetPolicy do ...@@ -45,6 +108,17 @@ describe ProjectSnippetPolicy do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
context 'project team member' do
before do
project.add_developer(external_user)
end
it do
expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(*author_permissions)
end
end
end end
end end
...@@ -67,6 +141,8 @@ describe ProjectSnippetPolicy do ...@@ -67,6 +141,8 @@ describe ProjectSnippetPolicy do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_project_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
it_behaves_like 'regular user access rights'
end end
context 'external user' do context 'external user' do
...@@ -110,33 +186,20 @@ describe ProjectSnippetPolicy do ...@@ -110,33 +186,20 @@ describe ProjectSnippetPolicy do
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
context 'snippet author' do it_behaves_like 'regular user access rights'
let(:snippet) { create(:project_snippet, :private, author: regular_user, project: project) } end
it do
expect_allowed(:read_project_snippet, :create_note)
expect_allowed(*author_permissions)
end
end
context 'project team member normal user' do context 'external user' do
before do let(:current_user) { external_user }
project.add_developer(regular_user)
end
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_disallowed(:read_project_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end
end end
end
context 'external user' do
context 'project team member' do context 'project team member' do
let(:current_user) { external_user }
before do before do
project.add_developer(external_user) project.add_developer(current_user)
end end
it do it do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment