BigW Consortium Gitlab

Commit 0f953ac4 by Filipa Lacerda

Merge branch '10-8-stable-prepare-rc8' into '10-8-stable'

Prepare 10.8 RC8 release See merge request gitlab-org/gitlab-ce!18883
parents d66ae2d5 abd24d1c
...@@ -110,8 +110,8 @@ export default { ...@@ -110,8 +110,8 @@ export default {
Welcome to the GitLab IDE Welcome to the GitLab IDE
</h4> </h4>
<p> <p>
You can select a file in the left sidebar to begin Select a file from the left sidebar to begin editing.
editing and use the right sidebar to commit your changes. Afterwards, you'll be able to commit your changes.
</p> </p>
</div> </div>
</div> </div>
......
...@@ -140,7 +140,7 @@ export default { ...@@ -140,7 +140,7 @@ export default {
this.file.staged && this.file.key.indexOf('unstaged-') === 0 ? head : null, this.file.staged && this.file.key.indexOf('unstaged-') === 0 ? head : null,
); );
if (this.viewer === viewerTypes.mr) { if (this.viewer === viewerTypes.mr && this.file.mrChange) {
this.editor.attachMergeRequestModel(this.model); this.editor.attachMergeRequestModel(this.model);
} else { } else {
this.editor.attachModel(this.model); this.editor.attachModel(this.model);
......
...@@ -44,6 +44,7 @@ export const dataStructure = () => ({ ...@@ -44,6 +44,7 @@ export const dataStructure = () => ({
size: 0, size: 0,
parentPath: null, parentPath: null,
lastOpenedAt: 0, lastOpenedAt: 0,
mrChange: null,
}); });
export const decorateData = entity => { export const decorateData = entity => {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
line-height: $line-height-base;
.title { .title {
display: flex; display: flex;
...@@ -33,10 +34,14 @@ ...@@ -33,10 +34,14 @@
.navbar-collapse { .navbar-collapse {
padding-right: 0; padding-right: 0;
.navbar-nav {
margin: 0;
}
} }
.nav li a { .nav li {
color: $theme-gray-700; float: none;
} }
} }
......
...@@ -3,6 +3,10 @@ module Users ...@@ -3,6 +3,10 @@ module Users
include InternalRedirect include InternalRedirect
skip_before_action :enforce_terms! skip_before_action :enforce_terms!
skip_before_action :check_password_expiration
skip_before_action :check_two_factor_requirement
skip_before_action :require_email
before_action :terms before_action :terms
layout 'terms' layout 'terms'
......
...@@ -107,7 +107,13 @@ module Ci ...@@ -107,7 +107,13 @@ module Ci
end end
def assign_to(project, current_user = nil) def assign_to(project, current_user = nil)
self.is_shared = false if shared? if shared?
self.is_shared = false if shared?
self.runner_type = :project_type
elsif group_type?
raise ArgumentError, 'Transitioning a group runner to a project runner is not supported'
end
self.save self.save
project.runner_projects.create(runner_id: self.id) project.runner_projects.create(runner_id: self.id)
end end
......
...@@ -22,7 +22,8 @@ module ShaAttribute ...@@ -22,7 +22,8 @@ module ShaAttribute
column = columns.find { |c| c.name == name.to_s } column = columns.find { |c| c.name == name.to_s }
unless column unless column
raise ArgumentError.new("sha_attribute #{name.inspect} is invalid since the column doesn't exist") warn "WARNING: sha_attribute #{name.inspect} is invalid since the column doesn't exist - you may need to run database migrations"
return
end end
unless column.type == :binary unless column.type == :binary
......
...@@ -20,10 +20,10 @@ ...@@ -20,10 +20,10 @@
= brand_header_logo = brand_header_logo
- logo_text = brand_header_logo_type - logo_text = brand_header_logo_type
- if logo_text.present? - if logo_text.present?
%span.logo-text.hidden-xs.prepend-left-8 %span.logo-text.prepend-left-8
= logo_text = logo_text
- if header_link?(:user_dropdown) - if header_link?(:user_dropdown)
.navbar-collapse.collapse .navbar-collapse
%ul.nav.navbar-nav %ul.nav.navbar-nav
%li.header-user.dropdown %li.header-user.dropdown
= link_to current_user, class: user_dropdown_class, data: { toggle: "dropdown" } do = link_to current_user, class: user_dropdown_class, data: { toggle: "dropdown" } do
......
...@@ -9,85 +9,6 @@ module ObjectStorage ...@@ -9,85 +9,6 @@ module ObjectStorage
SanityCheckError = Class.new(StandardError) SanityCheckError = Class.new(StandardError)
class Upload < ActiveRecord::Base
# Upper limit for foreground checksum processing
CHECKSUM_THRESHOLD = 100.megabytes
belongs_to :model, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
validates :size, presence: true
validates :path, presence: true
validates :model, presence: true
validates :uploader, presence: true
before_save :calculate_checksum!, if: :foreground_checksummable?
after_commit :schedule_checksum, if: :checksummable?
scope :stored_locally, -> { where(store: [nil, ObjectStorage::Store::LOCAL]) }
scope :stored_remotely, -> { where(store: ObjectStorage::Store::REMOTE) }
def self.hexdigest(path)
Digest::SHA256.file(path).hexdigest
end
def absolute_path
raise ObjectStorage::RemoteStoreError, "Remote object has no absolute path." unless local?
return path unless relative_path?
uploader_class.absolute_path(self)
end
def calculate_checksum!
self.checksum = nil
return unless checksummable?
self.checksum = self.class.hexdigest(absolute_path)
end
def build_uploader(mounted_as = nil)
uploader_class.new(model, mounted_as).tap do |uploader|
uploader.upload = self
uploader.retrieve_from_store!(identifier)
end
end
def exist?
File.exist?(absolute_path)
end
def local?
return true if store.nil?
store == ObjectStorage::Store::LOCAL
end
private
def checksummable?
checksum.nil? && local? && exist?
end
def foreground_checksummable?
checksummable? && size <= CHECKSUM_THRESHOLD
end
def schedule_checksum
UploadChecksumWorker.perform_async(id)
end
def relative_path?
!path.start_with?('/')
end
def identifier
File.basename(path)
end
def uploader_class
Object.const_get(uploader)
end
end
class MigrationResult class MigrationResult
attr_reader :upload attr_reader :upload
attr_accessor :error attr_accessor :error
......
---
title: 46210 Display logo and user dropdown on mobile for terms page and fix styling
merge_request:
author:
type: fixed
---
title: Fixes database inconsistencies between Community and Enterprise Edition on
import state
merge_request: 18811
author:
type: fixed
---
title: Fix finding wiki pages when they have invalidly-encoded content
merge_request: 18856
author:
type: fixed
---
title: Fix outdated Web IDE welcome copy
merge_request: 18861
author:
type: fixed
...@@ -7,6 +7,20 @@ module Gollum ...@@ -7,6 +7,20 @@ module Gollum
end end
require "gollum-lib" require "gollum-lib"
module Gollum
class Page
def text_data(encoding = nil)
data = if raw_data.respond_to?(:encoding)
raw_data.force_encoding(encoding || Encoding::UTF_8)
else
raw_data
end
Gitlab::EncodingHelper.encode!(data)
end
end
end
Rails.application.configure do Rails.application.configure do
config.after_initialize do config.after_initialize do
Gollum::Page.per_page = Kaminari.config.default_per_page Gollum::Page.per_page = Kaminari.config.default_per_page
......
class AddNotNullConstraintToProjectMirrorDataForeignKey < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
class ProjectImportState < ActiveRecord::Base
include EachBatch
self.table_name = 'project_mirror_data'
end
def up
ProjectImportState.where(project_id: nil).delete_all
change_column_null :project_mirror_data, :project_id, false
end
def down
change_column_null :project_mirror_data, :project_id, true
end
end
class AddUniqueConstraintToProjectMirrorDataProjectIdIndex < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
add_concurrent_index(:project_mirror_data,
:project_id,
unique: true,
name: 'index_project_mirror_data_on_project_id_unique')
remove_concurrent_index_by_name(:project_mirror_data, 'index_project_mirror_data_on_project_id')
rename_index(:project_mirror_data,
'index_project_mirror_data_on_project_id_unique',
'index_project_mirror_data_on_project_id')
end
def down
rename_index(:project_mirror_data,
'index_project_mirror_data_on_project_id',
'index_project_mirror_data_on_project_id_old')
add_concurrent_index(:project_mirror_data, :project_id)
remove_concurrent_index_by_name(:project_mirror_data,
'index_project_mirror_data_on_project_id_old')
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20180508055821) do ActiveRecord::Schema.define(version: 20180508102840) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
...@@ -1529,14 +1529,14 @@ ActiveRecord::Schema.define(version: 20180508055821) do ...@@ -1529,14 +1529,14 @@ ActiveRecord::Schema.define(version: 20180508055821) do
add_index "project_import_data", ["project_id"], name: "index_project_import_data_on_project_id", using: :btree add_index "project_import_data", ["project_id"], name: "index_project_import_data_on_project_id", using: :btree
create_table "project_mirror_data", force: :cascade do |t| create_table "project_mirror_data", force: :cascade do |t|
t.integer "project_id" t.integer "project_id", null: false
t.string "status" t.string "status"
t.string "jid" t.string "jid"
t.text "last_error" t.text "last_error"
end end
add_index "project_mirror_data", ["jid"], name: "index_project_mirror_data_on_jid", using: :btree add_index "project_mirror_data", ["jid"], name: "index_project_mirror_data_on_jid", using: :btree
add_index "project_mirror_data", ["project_id"], name: "index_project_mirror_data_on_project_id", using: :btree add_index "project_mirror_data", ["project_id"], name: "index_project_mirror_data_on_project_id", unique: true, using: :btree
add_index "project_mirror_data", ["status"], name: "index_project_mirror_data_on_status", using: :btree add_index "project_mirror_data", ["status"], name: "index_project_mirror_data_on_status", using: :btree
create_table "project_statistics", force: :cascade do |t| create_table "project_statistics", force: :cascade do |t|
......
...@@ -437,5 +437,107 @@ feature 'Login' do ...@@ -437,5 +437,107 @@ feature 'Login' do
expect(current_path).to eq(root_path) expect(current_path).to eq(root_path)
end end
context 'when 2FA is required for the user' do
before do
group = create(:group, require_two_factor_authentication: true)
group.add_developer(user)
end
context 'when the user did not enable 2FA' do
it 'asks to set 2FA before asking to accept the terms' do
visit new_user_session_path
fill_in 'user_login', with: user.email
fill_in 'user_password', with: '12345678'
click_button 'Sign in'
expect_to_be_on_terms_page
click_button 'Accept terms'
expect(current_path).to eq(profile_two_factor_auth_path)
fill_in 'pin_code', with: user.reload.current_otp
click_button 'Register with two-factor app'
click_link 'Proceed'
expect(current_path).to eq(profile_account_path)
end
end
context 'when the user already enabled 2FA' do
before do
user.update!(otp_required_for_login: true,
otp_secret: User.generate_otp_secret(32))
end
it 'asks the user to accept the terms' do
visit new_user_session_path
fill_in 'user_login', with: user.email
fill_in 'user_password', with: '12345678'
click_button 'Sign in'
fill_in 'user_otp_attempt', with: user.reload.current_otp
click_button 'Verify code'
expect_to_be_on_terms_page
click_button 'Accept terms'
expect(current_path).to eq(root_path)
end
end
end
context 'when the users password is expired' do
before do
user.update!(password_expires_at: Time.parse('2018-05-08 11:29:46 UTC'))
end
it 'asks the user to accept the terms before setting a new password' do
visit new_user_session_path
fill_in 'user_login', with: user.email
fill_in 'user_password', with: '12345678'
click_button 'Sign in'
expect_to_be_on_terms_page
click_button 'Accept terms'
expect(current_path).to eq(new_profile_password_path)
fill_in 'user_current_password', with: '12345678'
fill_in 'user_password', with: 'new password'
fill_in 'user_password_confirmation', with: 'new password'
click_button 'Set new password'
expect(page).to have_content('Password successfully changed')
end
end
context 'when the user does not have an email configured' do
let(:user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'saml', email: 'temp-email-for-oauth-user@gitlab.localhost') }
before do
stub_omniauth_saml_config(enabled: true, auto_link_saml_user: true, allow_single_sign_on: ['saml'], providers: [mock_saml_config])
end
it 'asks the user to accept the terms before setting an email' do
gitlab_sign_in_via('saml', user, 'my-uid')
expect_to_be_on_terms_page
click_button 'Accept terms'
expect(current_path).to eq(profile_path)
fill_in 'Email', with: 'hello@world.com'
click_button 'Update profile settings'
expect(page).to have_content('Profile was successfully updated')
end
end
end end
end end
...@@ -24,7 +24,7 @@ describe('RepoEditor', () => { ...@@ -24,7 +24,7 @@ describe('RepoEditor', () => {
f.active = true; f.active = true;
f.tempFile = true; f.tempFile = true;
vm.$store.state.openFiles.push(f); vm.$store.state.openFiles.push(f);
vm.$store.state.entries[f.path] = f; Vue.set(vm.$store.state.entries, f.path, f);
vm.monaco = true; vm.monaco = true;
vm.$mount(); vm.$mount();
...@@ -215,6 +215,30 @@ describe('RepoEditor', () => { ...@@ -215,6 +215,30 @@ describe('RepoEditor', () => {
expect(vm.editor.attachModel).toHaveBeenCalledWith(vm.model); expect(vm.editor.attachModel).toHaveBeenCalledWith(vm.model);
}); });
it('attaches model to merge request editor', () => {
vm.$store.state.viewer = 'mrdiff';
vm.file.mrChange = true;
spyOn(vm.editor, 'attachMergeRequestModel');
Editor.editorInstance.modelManager.dispose();
vm.setupEditor();
expect(vm.editor.attachMergeRequestModel).toHaveBeenCalledWith(vm.model);
});
it('does not attach model to merge request editor when not a MR change', () => {
vm.$store.state.viewer = 'mrdiff';
vm.file.mrChange = false;
spyOn(vm.editor, 'attachMergeRequestModel');
Editor.editorInstance.modelManager.dispose();
vm.setupEditor();
expect(vm.editor.attachMergeRequestModel).not.toHaveBeenCalledWith(vm.model);
});
it('adds callback methods', () => { it('adds callback methods', () => {
spyOn(vm.editor, 'onPositionChange').and.callThrough(); spyOn(vm.editor, 'onPositionChange').and.callThrough();
......
require 'spec_helper'
require Rails.root.join('db', 'migrate', '20180508100222_add_not_null_constraint_to_project_mirror_data_foreign_key.rb')
describe AddNotNullConstraintToProjectMirrorDataForeignKey, :migration do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:import_state) { table(:project_mirror_data) }
before do
import_state.create!(id: 1, project_id: nil, status: :started)
end
it 'removes every import state without an associated project_id' do
expect do
subject.up
end.to change { import_state.count }.from(1).to(0)
end
end
...@@ -198,16 +198,30 @@ describe Ci::Runner do ...@@ -198,16 +198,30 @@ describe Ci::Runner do
end end
describe '#assign_to' do describe '#assign_to' do
let!(:project) { FactoryBot.create :project } let!(:project) { FactoryBot.create(:project) }
let!(:shared_runner) { FactoryBot.create(:ci_runner, :shared) }
before do subject { runner.assign_to(project) }
shared_runner.assign_to(project)
context 'with shared runner' do
let!(:runner) { FactoryBot.create(:ci_runner, :shared) }
it 'transitions shared runner to project runner and assigns project' do
subject
expect(runner).to be_specific
expect(runner).to be_project_type
expect(runner.projects).to eq([project])
expect(runner.only_for?(project)).to be_truthy
end
end end
it { expect(shared_runner).to be_specific } context 'with group runner' do
it { expect(shared_runner.projects).to eq([project]) } let!(:runner) { FactoryBot.create(:ci_runner, runner_type: :group_type) }
it { expect(shared_runner.only_for?(project)).to be_truthy }
it 'raises an error' do
expect { subject }
.to raise_error(ArgumentError, 'Transitioning a group runner to a project runner is not supported')
end
end
end end
describe '.online' do describe '.online' do
......
...@@ -36,24 +36,26 @@ describe ShaAttribute do ...@@ -36,24 +36,26 @@ describe ShaAttribute do
end end
context 'when the table does not exist' do context 'when the table does not exist' do
it 'allows the attribute to be added' do it 'allows the attribute to be added and issues a warning' do
allow(model).to receive(:table_exists?).and_return(false) allow(model).to receive(:table_exists?).and_return(false)
expect(model).not_to receive(:columns) expect(model).not_to receive(:columns)
expect(model).to receive(:attribute) expect(model).to receive(:attribute)
expect(model).to receive(:warn)
model.sha_attribute(:name) model.sha_attribute(:name)
end end
end end
context 'when the column does not exist' do context 'when the column does not exist' do
it 'raises ArgumentError' do it 'allows the attribute to be added and issues a warning' do
allow(model).to receive(:table_exists?).and_return(true) allow(model).to receive(:table_exists?).and_return(true)
expect(model).to receive(:columns) expect(model).to receive(:columns)
expect(model).not_to receive(:attribute) expect(model).to receive(:attribute)
expect(model).to receive(:warn)
expect { model.sha_attribute(:no_name) }.to raise_error(ArgumentError) model.sha_attribute(:no_name)
end end
end end
......
...@@ -159,6 +159,17 @@ describe ProjectWiki do ...@@ -159,6 +159,17 @@ describe ProjectWiki do
expect(page.title).to eq("autre pagé") expect(page.title).to eq("autre pagé")
end end
end end
context 'pages with invalidly-encoded content' do
before do
create_page("encoding is fun", "f\xFCr".b)
end
it "can find the page" do
page = subject.find_page("encoding is fun")
expect(page.content).to eq("fr")
end
end
end end
context 'when Gitaly wiki_find_page is enabled' do context 'when Gitaly wiki_find_page is enabled' do
......
...@@ -7,113 +7,138 @@ describe ObjectStorage::MigrateUploadsWorker, :sidekiq do ...@@ -7,113 +7,138 @@ describe ObjectStorage::MigrateUploadsWorker, :sidekiq do
end end
end end
let!(:projects) { create_list(:project, 10, :with_avatar) }
let(:uploads) { Upload.all }
let(:model_class) { Project } let(:model_class) { Project }
let(:mounted_as) { :avatar } let(:uploads) { Upload.all }
let(:to_store) { ObjectStorage::Store::REMOTE } let(:to_store) { ObjectStorage::Store::REMOTE }
before do shared_examples "uploads migration worker" do
stub_uploads_object_storage(AvatarUploader) describe '.enqueue!' do
end def enqueue!
described_class.enqueue!(uploads, Project, mounted_as, to_store)
describe '.enqueue!' do end
def enqueue!
described_class.enqueue!(uploads, Project, mounted_as, to_store)
end
it 'is guarded by .sanity_check!' do it 'is guarded by .sanity_check!' do
expect(described_class).to receive(:perform_async) expect(described_class).to receive(:perform_async)
expect(described_class).to receive(:sanity_check!) expect(described_class).to receive(:sanity_check!)
enqueue! enqueue!
end end
context 'sanity_check! fails' do context 'sanity_check! fails' do
include_context 'sanity_check! fails' include_context 'sanity_check! fails'
it 'does not enqueue a job' do it 'does not enqueue a job' do
expect(described_class).not_to receive(:perform_async) expect(described_class).not_to receive(:perform_async)
expect { enqueue! }.to raise_error(described_class::SanityCheckError) expect { enqueue! }.to raise_error(described_class::SanityCheckError)
end
end end
end end
end
describe '.sanity_check!' do describe '.sanity_check!' do
shared_examples 'raises a SanityCheckError' do shared_examples 'raises a SanityCheckError' do
let(:mount_point) { nil } let(:mount_point) { nil }
it do it do
expect { described_class.sanity_check!(uploads, model_class, mount_point) } expect { described_class.sanity_check!(uploads, model_class, mount_point) }
.to raise_error(described_class::SanityCheckError) .to raise_error(described_class::SanityCheckError)
end
end end
end
context 'uploader types mismatch' do before do
let!(:outlier) { create(:upload, uploader: 'FileUploader') } stub_const("WrongModel", Class.new)
end
include_examples 'raises a SanityCheckError' context 'uploader types mismatch' do
end let!(:outlier) { create(:upload, uploader: 'GitlabUploader') }
context 'model types mismatch' do include_examples 'raises a SanityCheckError'
let!(:outlier) { create(:upload, model_type: 'Potato') } end
include_examples 'raises a SanityCheckError' context 'model types mismatch' do
end let!(:outlier) { create(:upload, model_type: 'WrongModel') }
context 'mount point not found' do include_examples 'raises a SanityCheckError'
include_examples 'raises a SanityCheckError' do
let(:mount_point) { :potato }
end end
end
end
describe '#perform' do context 'mount point not found' do
def perform include_examples 'raises a SanityCheckError' do
described_class.new.perform(uploads.ids, model_class.to_s, mounted_as, to_store) let(:mount_point) { :potato }
rescue ObjectStorage::MigrateUploadsWorker::Report::MigrationFailures end
# swallow end
end end
shared_examples 'outputs correctly' do |success: 0, failures: 0| describe '#perform' do
total = success + failures def perform
described_class.new.perform(uploads.ids, model_class.to_s, mounted_as, to_store)
rescue ObjectStorage::MigrateUploadsWorker::Report::MigrationFailures
# swallow
end
shared_examples 'outputs correctly' do |success: 0, failures: 0|
total = success + failures
if success > 0 if success > 0
it 'outputs the reports' do it 'outputs the reports' do
expect(Rails.logger).to receive(:info).with(%r{Migrated #{success}/#{total} files}) expect(Rails.logger).to receive(:info).with(%r{Migrated #{success}/#{total} files})
perform perform
end
end end
end
if failures > 0 if failures > 0
it 'outputs upload failures' do it 'outputs upload failures' do
expect(Rails.logger).to receive(:warn).with(/Error .* I am a teapot/) expect(Rails.logger).to receive(:warn).with(/Error .* I am a teapot/)
perform perform
end
end end
end end
end
it_behaves_like 'outputs correctly', success: 10 it_behaves_like 'outputs correctly', success: 10
it 'migrates files' do
perform
it 'migrates files' do expect(Upload.where(store: ObjectStorage::Store::LOCAL).count).to eq(0)
perform end
aggregate_failures do context 'migration is unsuccessful' do
projects.each do |project| before do
expect(project.reload.avatar.upload.local?).to be_falsey allow_any_instance_of(ObjectStorage::Concern)
.to receive(:migrate!).and_raise(CarrierWave::UploadError, "I am a teapot.")
end end
it_behaves_like 'outputs correctly', failures: 10
end end
end end
end
context 'migration is unsuccessful' do context "for AvatarUploader" do
before do let!(:projects) { create_list(:project, 10, :with_avatar) }
allow_any_instance_of(ObjectStorage::Concern).to receive(:migrate!).and_raise(CarrierWave::UploadError, "I am a teapot.") let(:mounted_as) { :avatar }
end
it_behaves_like 'outputs correctly', failures: 10 before do
stub_uploads_object_storage(AvatarUploader)
end
it_behaves_like "uploads migration worker"
end
context "for FileUploader" do
let!(:projects) { create_list(:project, 10) }
let(:secret) { SecureRandom.hex }
let(:mounted_as) { nil }
before do
stub_uploads_object_storage(FileUploader)
projects.map do |project|
uploader = FileUploader.new(project)
uploader.store!(fixture_file_upload('spec/fixtures/doc_sample.txt'))
end
end end
it_behaves_like "uploads migration worker"
end end
end end
...@@ -12,8 +12,10 @@ ...@@ -12,8 +12,10 @@
# AUTO_DEVOPS_DOMAIN must also be set as a variable at the group or project # AUTO_DEVOPS_DOMAIN must also be set as a variable at the group or project
# level, or manually added below. # level, or manually added below.
# #
# If you want to deploy to staging first, or enable canary deploys, # Continuous deployment to production is enabled by default.
# uncomment the relevant jobs in the pipeline below. # If you want to deploy to staging first, or enable incremental rollouts,
# set STAGING_ENABLED or INCREMENTAL_ROLLOUT_ENABLED environment variables.
# If you want to use canary deployments, uncomment the canary job.
# #
# If Auto DevOps fails to detect the proper buildpack, or if you want to # If Auto DevOps fails to detect the proper buildpack, or if you want to
# specify a custom buildpack, set a project variable `BUILDPACK_URL` to the # specify a custom buildpack, set a project variable `BUILDPACK_URL` to the
...@@ -88,14 +90,6 @@ codequality: ...@@ -88,14 +90,6 @@ codequality:
artifacts: artifacts:
paths: [codeclimate.json] paths: [codeclimate.json]
license_management:
image: registry.gitlab.com/gitlab-org/security-products/license-management:latest
allow_failure: true
script:
- license_management
artifacts:
paths: [gl-license-report.json]
performance: performance:
stage: performance stage: performance
image: docker:stable image: docker:stable
...@@ -223,8 +217,8 @@ stop_review: ...@@ -223,8 +217,8 @@ stop_review:
# Staging deploys are disabled by default since # Staging deploys are disabled by default since
# continuous deployment to production is enabled by default # continuous deployment to production is enabled by default
# If you prefer to automatically deploy to staging and # If you prefer to automatically deploy to staging and
# only manually promote to production, enable this job by removing the dot (.), # only manually promote to production, enable this job by setting
# and uncomment the `when: manual` line in the `production` job. # STAGING_ENABLED.
staging: staging:
stage: staging stage: staging
...@@ -245,13 +239,9 @@ staging: ...@@ -245,13 +239,9 @@ staging:
kubernetes: active kubernetes: active
variables: variables:
- $STAGING_ENABLED - $STAGING_ENABLED
except:
variables:
- $INCREMENTAL_ROLLOUT_ENABLED
# Canaries are disabled by default, but if you want them, # Canaries are disabled by default, but if you want them,
# and know what the downsides are, enable this job by removing the dot (.), # and know what the downsides are, enable this job by removing the dot (.).
# and uncomment the `when: manual` line in the `production` job.
.canary: .canary:
stage: canary stage: canary
...@@ -272,11 +262,6 @@ staging: ...@@ -272,11 +262,6 @@ staging:
- master - master
kubernetes: active kubernetes: active
# This job continuously deploys to production on every push to `master`.
# To make this a manual process, either because you're enabling `staging`
# or `canary` deploys, or you simply want more control over when you deploy
# to production, uncomment the `when: manual` line in the `production` job.
.production: &production_template .production: &production_template
stage: production stage: production
script: script:
...@@ -310,6 +295,7 @@ production: ...@@ -310,6 +295,7 @@ production:
production_manual: production_manual:
<<: *production_template <<: *production_template
when: manual when: manual
allow_failure: false
only: only:
refs: refs:
- master - master
...@@ -345,6 +331,7 @@ rollout 10%: ...@@ -345,6 +331,7 @@ rollout 10%:
<<: *rollout_template <<: *rollout_template
variables: variables:
ROLLOUT_PERCENTAGE: 10 ROLLOUT_PERCENTAGE: 10
when: manual
only: only:
refs: refs:
- master - master
...@@ -379,6 +366,7 @@ rollout 50%: ...@@ -379,6 +366,7 @@ rollout 50%:
rollout 100%: rollout 100%:
<<: *production_template <<: *production_template
when: manual when: manual
allow_failure: false
only: only:
refs: refs:
- master - master
...@@ -428,14 +416,6 @@ rollout 100%: ...@@ -428,14 +416,6 @@ rollout 100%:
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
} }
function license_management() {
if echo $GITLAB_FEATURES |grep license_management > /dev/null ; then
/run.sh .
else
echo "License management is not available in your subscription"
fi
}
function sast() { function sast() {
case "$CI_SERVER_VERSION" in case "$CI_SERVER_VERSION" in
*-ee) *-ee)
...@@ -562,12 +542,14 @@ rollout 100%: ...@@ -562,12 +542,14 @@ rollout 100%:
replicas=$(get_replicas "$track" "$percentage") replicas=$(get_replicas "$track" "$percentage")
helm upgrade --reuse-values \ if [[ -n "$(helm ls -q "^$name$")" ]]; then
--wait \ helm upgrade --reuse-values \
--set replicaCount="$replicas" \ --wait \
--namespace="$KUBE_NAMESPACE" \ --set replicaCount="$replicas" \
"$name" \ --namespace="$KUBE_NAMESPACE" \
chart/ "$name" \
chart/
fi
} }
function install_dependencies() { function install_dependencies() {
......
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