Skip to content
Snippets Groups Projects
Commit aa542224 authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent 2494b608
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -357,7 +357,12 @@ Group-level variables can be added by:
1. Inputing variable types, keys, and values in the **Variables** section.
Any variables of [subgroups](../../user/group/subgroups/index.md) will be inherited recursively.
 
Once you set them, they will be available for all subsequent pipelines.
Once you set them, they will be available for all subsequent pipelines. Any group-level user defined variables can be viewed in projects by:
1. Navigating to the project's **Settings > CI/CD** page.
1. Expanding the **Variables** section.
![CI/CD settings - inherited variables](img/inherited_group_variables_v12_5.png)
 
## Priority of environment variables
 
Loading
Loading
doc/ci/variables/img/inherited_group_variables_v12_5.png

72.2 KiB

Loading
Loading
@@ -23,7 +23,7 @@ module API
end
get ':id/registry/repositories' do
repositories = ContainerRepositoriesFinder.new(
id: user_group.id, container_type: :group
user: current_user, subject: user_group
).execute
 
present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags]
Loading
Loading
Loading
Loading
@@ -24,7 +24,7 @@ module API
end
get ':id/registry/repositories' do
repositories = ContainerRepositoriesFinder.new(
id: user_project.id, container_type: :project
user: current_user, subject: user_project
).execute
 
present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags]
Loading
Loading
Loading
Loading
@@ -210,6 +210,11 @@ msgstr ""
msgid "%{count} more assignees"
msgstr ""
 
msgid "%{count} more release"
msgid_plural "%{count} more releases"
msgstr[0] ""
msgstr[1] ""
msgid "%{count} of %{required} approvals from %{name}"
msgstr ""
 
Loading
Loading
@@ -8336,6 +8341,9 @@ msgstr ""
msgid "Group pipeline minutes were successfully reset."
msgstr ""
 
msgid "Group variables (inherited)"
msgstr ""
msgid "Group was successfully updated."
msgstr ""
 
Loading
Loading
@@ -9537,6 +9545,9 @@ msgstr ""
msgid "June"
msgstr ""
 
msgid "Key"
msgstr ""
msgid "Key (PEM)"
msgstr ""
 
Loading
Loading
@@ -11601,6 +11612,9 @@ msgstr ""
msgid "Or you can choose one of the suggested colors below"
msgstr ""
 
msgid "Origin"
msgstr ""
msgid "Other Labels"
msgstr ""
 
Loading
Loading
@@ -13794,7 +13808,9 @@ msgid "Related merge requests"
msgstr ""
 
msgid "Release"
msgstr ""
msgid_plural "Releases"
msgstr[0] ""
msgstr[1] ""
 
msgid "Release notes"
msgstr ""
Loading
Loading
@@ -16933,6 +16949,9 @@ msgstr ""
msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
msgstr ""
 
msgid "These variables are configured in the parent group settings, and will be active in the current project in addition to the project variables."
msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
 
Loading
Loading
Loading
Loading
@@ -34,4 +34,31 @@ describe "User views milestones" do
.and have_content(closed_issue.title)
end
end
context "with associated releases" do
set(:first_release) { create(:release, project: project, name: "The first release", milestones: [milestone], released_at: Time.zone.parse('2019-10-07')) }
context "with a single associated release" do
it "shows the associated release" do
expect(page).to have_content("Release #{first_release.name}")
expect(page).to have_link(first_release.name, href: project_releases_path(project, anchor: first_release.tag))
end
end
context "with lots of associated releases" do
set(:second_release) { create(:release, project: project, name: "The second release", milestones: [milestone], released_at: first_release.released_at + 1.day) }
set(:third_release) { create(:release, project: project, name: "The third release", milestones: [milestone], released_at: second_release.released_at + 1.day) }
set(:fourth_release) { create(:release, project: project, name: "The fourth release", milestones: [milestone], released_at: third_release.released_at + 1.day) }
set(:fifth_release) { create(:release, project: project, name: "The fifth release", milestones: [milestone], released_at: fourth_release.released_at + 1.day) }
it "shows the associated releases and the truncation text" do
expect(page).to have_content("Releases #{fifth_release.name}#{fourth_release.name}#{third_release.name} • 2 more releases")
expect(page).to have_link(fifth_release.name, href: project_releases_path(project, anchor: fifth_release.tag))
expect(page).to have_link(fourth_release.name, href: project_releases_path(project, anchor: fourth_release.tag))
expect(page).to have_link(third_release.name, href: project_releases_path(project, anchor: third_release.tag))
expect(page).to have_link("2 more releases", href: project_releases_path(project))
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
describe 'Project group variables', :js do
let(:user) { create(:user) }
let(:group) { create(:group) }
let(:subgroup) { create(:group, parent: group) }
let(:subgroup_nested) { create(:group, parent: subgroup) }
let(:project) { create(:project, group: group) }
let(:project2) { create(:project, group: subgroup) }
let(:project3) { create(:project, group: subgroup_nested) }
let(:key1) { 'test_key' }
let(:key2) { 'test_key2' }
let(:key3) { 'test_key3' }
let!(:ci_variable) { create(:ci_group_variable, group: group, key: key1) }
let!(:ci_variable2) { create(:ci_group_variable, group: subgroup, key: key2) }
let!(:ci_variable3) { create(:ci_group_variable, group: subgroup_nested, key: key3) }
let(:project_path) { project_settings_ci_cd_path(project) }
let(:project2_path) { project_settings_ci_cd_path(project2) }
let(:project3_path) { project_settings_ci_cd_path(project3) }
before do
sign_in(user)
project.add_maintainer(user)
group.add_owner(user)
end
it 'project in group shows inherited vars from ancestor group' do
visit project_path
expect(page).to have_content(key1)
expect(page).to have_content(group.name)
end
it 'project in subgroup shows inherited vars from all ancestor groups' do
visit project2_path
expect(page).to have_content(key1)
expect(page).to have_content(key2)
expect(page).to have_content(group.name)
expect(page).to have_content(subgroup.name)
end
it 'project in nested subgroup shows inherited vars from all ancestor groups' do
visit project3_path
expect(page).to have_content(key1)
expect(page).to have_content(key2)
expect(page).to have_content(key3)
expect(page).to have_content(group.name)
expect(page).to have_content(subgroup.name)
expect(page).to have_content(subgroup_nested.name)
end
it 'project origin keys link to ancestor groups ci_cd settings' do
visit project_path
find('.group-origin-link').click
page.within('.js-ci-variable-list-section .js-row:nth-child(2)') do
expect(find('.js-ci-variable-input-key').value).to eq(key1)
end
end
end
Loading
Loading
@@ -3,42 +3,50 @@
require 'spec_helper'
 
describe ContainerRepositoriesFinder do
let_it_be(:reporter) { create(:user) }
let_it_be(:guest) { create(:user) }
let(:group) { create(:group) }
let(:project) { create(:project, group: group) }
let(:project_repository) { create(:container_repository, project: project) }
 
before do
group.add_reporter(reporter)
project.add_reporter(reporter)
end
describe '#execute' do
let(:id) { nil }
context 'with authorized user' do
subject { described_class.new(user: reporter, subject: subject_object).execute }
 
subject { described_class.new(id: id, container_type: container_type).execute }
context 'when subject_type is group' do
let(:subject_object) { group }
let(:other_project) { create(:project, group: group) }
 
context 'when container_type is group' do
let(:other_project) { create(:project, group: group) }
let(:other_repository) do
create(:container_repository, name: 'test_repository2', project: other_project)
end
 
let(:other_repository) do
create(:container_repository, name: 'test_repository2', project: other_project)
it { is_expected.to match_array([project_repository, other_repository]) }
end
 
let(:container_type) { :group }
let(:id) { group.id }
context 'when subject_type is project' do
let(:subject_object) { project }
 
it { is_expected.to match_array([project_repository, other_repository]) }
end
it { is_expected.to match_array([project_repository]) }
end
 
context 'when container_type is project' do
let(:container_type) { :project }
let(:id) { project.id }
context 'with invalid subject_type' do
let(:subject_object) { "invalid type" }
 
it { is_expected.to match_array([project_repository]) }
it { expect { subject }.to raise_exception('invalid subject_type') }
end
end
 
context 'with invalid id' do
let(:container_type) { :project }
let(:id) { 123456789 }
context 'with unauthorized user' do
subject { described_class.new(user: guest, subject: group).execute }
 
it 'raises an error' do
expect { subject.execute }.to raise_error(ActiveRecord::RecordNotFound)
end
it { is_expected.to be nil }
end
end
end
Loading
Loading
@@ -235,4 +235,36 @@ describe ContainerRepository do
expect(repository).not_to be_persisted
end
end
describe '.for_group_and_its_subgroups' do
subject { described_class.for_group_and_its_subgroups(test_group) }
context 'in a group' do
let(:test_group) { group }
it { is_expected.to contain_exactly(repository) }
end
context 'with a subgroup' do
let(:test_group) { create(:group) }
let(:another_project) { create(:project, path: 'test', group: test_group) }
let(:another_repository) do
create(:container_repository, name: 'my_image', project: another_project)
end
before do
group.parent = test_group
group.save
end
it { is_expected.to contain_exactly(repository, another_repository) }
end
context 'group without container_repositories' do
let(:test_group) { create(:group) }
it { is_expected.to eq([]) }
end
end
end
Loading
Loading
@@ -3,10 +3,10 @@
require 'spec_helper'
 
describe API::GroupContainerRepositories do
set(:group) { create(:group, :private) }
set(:project) { create(:project, :private, group: group) }
let(:reporter) { create(:user) }
let(:guest) { create(:user) }
let_it_be(:group) { create(:group, :private) }
let_it_be(:project) { create(:project, :private, group: group) }
let_it_be(:reporter) { create(:user) }
let_it_be(:guest) { create(:user) }
 
let(:root_repository) { create(:container_repository, :root, project: project) }
let(:test_repository) { create(:container_repository, project: project) }
Loading
Loading
File mode changed from 100755 to 100644
File mode changed from 100755 to 100644
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment