Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
8bd8f7d169
commit
31a340adab
18
CHANGELOG.md
18
CHANGELOG.md
|
@ -2,17 +2,6 @@
|
|||
documentation](doc/development/changelog.md) for instructions on adding your own
|
||||
entry.
|
||||
|
||||
## 12.10.6 (2020-05-15)
|
||||
|
||||
### Fixed (5 changes)
|
||||
|
||||
- Fix duplicate index removal on ci_pipelines.project_id. !31043
|
||||
- Fix 500 on creating an invalid domains and verification. !31190
|
||||
- Fix incorrect number of errors returned when querying sentry errors. !31252
|
||||
- Add instance column to services table if it's missing. !31631
|
||||
- Fix incorrect regex used in FileUploader#extract_dynamic_path. !32271
|
||||
|
||||
|
||||
## 12.10.5 (2020-05-13)
|
||||
|
||||
### Added (1 change)
|
||||
|
@ -502,13 +491,6 @@ entry.
|
|||
- Remove store_mentions! in Snippets::CreateService. !29581 (Sashi Kumar)
|
||||
|
||||
|
||||
## 12.9.7 (2020-05-13)
|
||||
|
||||
### Added (1 change)
|
||||
|
||||
- Consider project group and group ancestors when processing CODEOWNERS entries. !31806
|
||||
|
||||
|
||||
## 12.9.6 (2020-05-05)
|
||||
|
||||
### Fixed (1 change)
|
||||
|
|
|
@ -13,6 +13,7 @@ import {
|
|||
} from '@gitlab/ui';
|
||||
import createFlash from '~/flash';
|
||||
import { s__ } from '~/locale';
|
||||
import { joinPaths } from '~/lib/utils/url_utility';
|
||||
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
|
||||
import getAlerts from '../graphql/queries/getAlerts.query.graphql';
|
||||
import { ALERTS_STATUS, ALERTS_STATUS_TABS, ALERTS_SEVERITY_LABELS } from '../constants';
|
||||
|
@ -21,8 +22,11 @@ import updateAlertStatus from '../graphql/mutations/update_alert_status.graphql'
|
|||
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
|
||||
|
||||
const tdClass = 'table-col d-flex d-md-table-cell align-items-center';
|
||||
const bodyTrClass =
|
||||
'gl-border-1 gl-border-t-solid gl-border-gray-100 hover-bg-blue-50 hover-gl-cursor-pointer hover-gl-border-b-solid hover-gl-border-blue-200';
|
||||
|
||||
export default {
|
||||
bodyTrClass,
|
||||
i18n: {
|
||||
noAlertsMsg: s__(
|
||||
"AlertManagement|No alerts available to display. If you think you're seeing this message in error, refresh the page.",
|
||||
|
@ -62,9 +66,8 @@ export default {
|
|||
{
|
||||
key: 'status',
|
||||
thClass: 'w-15p',
|
||||
trClass: 'w-15p',
|
||||
label: s__('AlertManagement|Status'),
|
||||
tdClass: `${tdClass} rounded-bottom text-capitalize`,
|
||||
tdClass: `${tdClass} rounded-bottom`,
|
||||
},
|
||||
],
|
||||
statuses: {
|
||||
|
@ -170,6 +173,9 @@ export default {
|
|||
);
|
||||
});
|
||||
},
|
||||
handleRowClick({ iid }) {
|
||||
window.location.assign(joinPaths(window.location.pathname, iid, 'details'));
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
@ -201,8 +207,9 @@ export default {
|
|||
:fields="$options.fields"
|
||||
:show-empty="true"
|
||||
:busy="loading"
|
||||
fixed
|
||||
stacked="md"
|
||||
:tbody-tr-class="$options.bodyTrClass"
|
||||
@row-clicked="handleRowClick"
|
||||
>
|
||||
<template #cell(severity)="{ item }">
|
||||
<div
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
<script>
|
||||
import { mapState, mapActions, mapGetters } from 'vuex';
|
||||
import { n__, __ } from '~/locale';
|
||||
import { GlModal } from '@gitlab/ui';
|
||||
import LoadingButton from '~/vue_shared/components/loading_button.vue';
|
||||
import CommitMessageField from './message_field.vue';
|
||||
import Actions from './actions.vue';
|
||||
import SuccessMessage from './success_message.vue';
|
||||
import { leftSidebarViews, MAX_WINDOW_HEIGHT_COMPACT } from '../../constants';
|
||||
import consts from '../../stores/modules/commit/constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
@ -13,6 +15,7 @@ export default {
|
|||
LoadingButton,
|
||||
CommitMessageField,
|
||||
SuccessMessage,
|
||||
GlModal,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -54,7 +57,20 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
...mapActions(['updateActivityBarView']),
|
||||
...mapActions('commit', ['updateCommitMessage', 'discardDraft', 'commitChanges']),
|
||||
...mapActions('commit', [
|
||||
'updateCommitMessage',
|
||||
'discardDraft',
|
||||
'commitChanges',
|
||||
'updateCommitAction',
|
||||
]),
|
||||
commit() {
|
||||
return this.commitChanges().catch(() => {
|
||||
this.$refs.createBranchModal.show();
|
||||
});
|
||||
},
|
||||
forceCreateNewBranch() {
|
||||
return this.updateCommitAction(consts.COMMIT_TO_NEW_BRANCH).then(() => this.commit());
|
||||
},
|
||||
toggleIsCompact() {
|
||||
if (this.currentViewIsCommitView) {
|
||||
this.isCompact = !this.isCompact;
|
||||
|
@ -119,13 +135,13 @@ export default {
|
|||
</button>
|
||||
<p class="text-center bold">{{ overviewText }}</p>
|
||||
</div>
|
||||
<form v-if="!isCompact" ref="formEl" @submit.prevent.stop="commitChanges">
|
||||
<form v-if="!isCompact" ref="formEl" @submit.prevent.stop="commit">
|
||||
<transition name="fade"> <success-message v-show="lastCommitMsg" /> </transition>
|
||||
<commit-message-field
|
||||
:text="commitMessage"
|
||||
:placeholder="preBuiltCommitMessage"
|
||||
@input="updateCommitMessage"
|
||||
@submit="commitChanges"
|
||||
@submit="commit"
|
||||
/>
|
||||
<div class="clearfix prepend-top-15">
|
||||
<actions />
|
||||
|
@ -133,7 +149,7 @@ export default {
|
|||
:loading="submitCommitLoading"
|
||||
:label="commitButtonText"
|
||||
container-class="btn btn-success btn-sm float-left qa-commit-button"
|
||||
@click="commitChanges"
|
||||
@click="commit"
|
||||
/>
|
||||
<button
|
||||
v-if="!discardDraftButtonDisabled"
|
||||
|
@ -152,6 +168,19 @@ export default {
|
|||
{{ __('Collapse') }}
|
||||
</button>
|
||||
</div>
|
||||
<gl-modal
|
||||
ref="createBranchModal"
|
||||
modal-id="ide-create-branch-modal"
|
||||
:ok-title="__('Create new branch')"
|
||||
:title="__('Branch has changed')"
|
||||
ok-variant="success"
|
||||
@ok="forceCreateNewBranch"
|
||||
>
|
||||
{{
|
||||
__(`This branch has changed since you started editing.
|
||||
Would you like to create a new branch?`)
|
||||
}}
|
||||
</gl-modal>
|
||||
</form>
|
||||
</transition>
|
||||
</div>
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
<script>
|
||||
import { mapState, mapActions, mapGetters } from 'vuex';
|
||||
import tooltip from '~/vue_shared/directives/tooltip';
|
||||
import DeprecatedModal from '~/vue_shared/components/deprecated_modal.vue';
|
||||
import CommitFilesList from './commit_sidebar/list.vue';
|
||||
import EmptyState from './commit_sidebar/empty_state.vue';
|
||||
import consts from '../stores/modules/commit/constants';
|
||||
import { leftSidebarViews, stageKeys } from '../constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
DeprecatedModal,
|
||||
CommitFilesList,
|
||||
EmptyState,
|
||||
},
|
||||
|
@ -53,10 +50,6 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
...mapActions(['openPendingTab', 'updateViewer', 'updateActivityBarView']),
|
||||
...mapActions('commit', ['commitChanges', 'updateCommitAction']),
|
||||
forceCreateNewBranch() {
|
||||
return this.updateCommitAction(consts.COMMIT_TO_NEW_BRANCH).then(() => this.commitChanges());
|
||||
},
|
||||
},
|
||||
stageKeys,
|
||||
};
|
||||
|
@ -64,20 +57,6 @@ export default {
|
|||
|
||||
<template>
|
||||
<div class="multi-file-commit-panel-section">
|
||||
<deprecated-modal
|
||||
id="ide-create-branch-modal"
|
||||
:primary-button-label="__('Create new branch')"
|
||||
:title="__('Branch has changed')"
|
||||
kind="success"
|
||||
@submit="forceCreateNewBranch"
|
||||
>
|
||||
<template slot="body">
|
||||
{{
|
||||
__(`This branch has changed since you started editing.
|
||||
Would you like to create a new branch?`)
|
||||
}}
|
||||
</template>
|
||||
</deprecated-modal>
|
||||
<template v-if="showStageUnstageArea">
|
||||
<commit-files-list
|
||||
:key-prefix="$options.stageKeys.staged"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import $ from 'jquery';
|
||||
import { sprintf, __ } from '~/locale';
|
||||
import flash from '~/flash';
|
||||
import httpStatusCodes from '~/lib/utils/http_status';
|
||||
import * as rootTypes from '../../mutation_types';
|
||||
import { createCommitPayload, createNewMergeRequestUrl } from '../../utils';
|
||||
import router from '../../../ide_router';
|
||||
|
@ -215,25 +215,23 @@ export const commitChanges = ({ commit, state, getters, dispatch, rootState, roo
|
|||
);
|
||||
})
|
||||
.catch(err => {
|
||||
if (err.response.status === 400) {
|
||||
$('#ide-create-branch-modal').modal('show');
|
||||
} else {
|
||||
dispatch(
|
||||
'setErrorMessage',
|
||||
{
|
||||
text: __('An error occurred while committing your changes.'),
|
||||
action: () =>
|
||||
dispatch('commitChanges').then(() =>
|
||||
dispatch('setErrorMessage', null, { root: true }),
|
||||
),
|
||||
actionText: __('Please try again'),
|
||||
},
|
||||
{ root: true },
|
||||
);
|
||||
window.dispatchEvent(new Event('resize'));
|
||||
}
|
||||
|
||||
commit(types.UPDATE_LOADING, false);
|
||||
|
||||
// don't catch bad request errors, let the view handle them
|
||||
if (err.response.status === httpStatusCodes.BAD_REQUEST) throw err;
|
||||
|
||||
dispatch(
|
||||
'setErrorMessage',
|
||||
{
|
||||
text: __('An error occurred while committing your changes.'),
|
||||
action: () =>
|
||||
dispatch('commitChanges').then(() => dispatch('setErrorMessage', null, { root: true })),
|
||||
actionText: __('Please try again'),
|
||||
},
|
||||
{ root: true },
|
||||
);
|
||||
|
||||
window.dispatchEvent(new Event('resize'));
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -146,11 +146,13 @@
|
|||
display: inline-block;
|
||||
position: relative;
|
||||
|
||||
/* Medium devices (desktops, 992px and up) */
|
||||
@include media-breakpoint-up(md) { width: 200px; }
|
||||
&:not[type='checkbox'] {
|
||||
/* Medium devices (desktops, 992px and up) */
|
||||
@include media-breakpoint-up(md) { width: 200px; }
|
||||
|
||||
/* Large devices (large desktops, 1200px and up) */
|
||||
@include media-breakpoint-up(lg) { width: 250px; }
|
||||
/* Large devices (large desktops, 1200px and up) */
|
||||
@include media-breakpoint-up(lg) { width: 250px; }
|
||||
}
|
||||
}
|
||||
|
||||
@include media-breakpoint-down(sm) {
|
||||
|
|
|
@ -24,14 +24,38 @@
|
|||
color: $gray-400;
|
||||
}
|
||||
|
||||
|
||||
// consider adding these stateful variants to @gitlab-ui
|
||||
// https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/1178
|
||||
.hover-bg-blue-50:hover {
|
||||
background-color: $blue-50;
|
||||
}
|
||||
|
||||
.hover-gl-cursor-pointer:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.hover-gl-border-b-solid:hover {
|
||||
@include gl-border-b-solid;
|
||||
}
|
||||
|
||||
.hover-gl-border-blue-200:hover {
|
||||
border-color: $blue-200;
|
||||
}
|
||||
|
||||
// these styles need to be deleted once GlTable component looks in GitLab same as in @gitlab/ui
|
||||
table {
|
||||
color: $gray-700;
|
||||
|
||||
tr {
|
||||
&:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
@include gl-p-5;
|
||||
border: 0; // Remove cell border styling so that we can set border styling per row
|
||||
|
||||
&.event-count {
|
||||
@include gl-pr-9;
|
||||
|
@ -42,9 +66,6 @@
|
|||
background-color: transparent;
|
||||
font-weight: $gl-font-weight-bold;
|
||||
color: $gl-gray-600;
|
||||
@include gl-border-b-1;
|
||||
@include gl-border-b-solid;
|
||||
border-color: $gray-100;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
|
|
|
@ -20,6 +20,7 @@ class ApplicationController < ActionController::Base
|
|||
include InitializesCurrentUserMode
|
||||
include Impersonation
|
||||
include Gitlab::Logging::CloudflareHelper
|
||||
include Gitlab::Utils::StrongMemoize
|
||||
|
||||
before_action :authenticate_user!, except: [:route_not_found]
|
||||
before_action :enforce_terms!, if: :should_enforce_terms?
|
||||
|
@ -37,6 +38,10 @@ class ApplicationController < ActionController::Base
|
|||
before_action :check_impersonation_availability
|
||||
before_action :required_signup_info
|
||||
|
||||
# Make sure the `auth_user` is memoized so it can be logged, we do this after
|
||||
# all other before filters that could have set the user.
|
||||
before_action :auth_user
|
||||
|
||||
prepend_around_action :set_current_context
|
||||
|
||||
around_action :sessionless_bypass_admin_mode!, if: :sessionless_user?
|
||||
|
@ -143,10 +148,11 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
payload[:ua] = request.env["HTTP_USER_AGENT"]
|
||||
payload[:remote_ip] = request.remote_ip
|
||||
|
||||
payload[Labkit::Correlation::CorrelationId::LOG_KEY] = Labkit::Correlation::CorrelationId.current_id
|
||||
payload[:metadata] = @current_context
|
||||
|
||||
logged_user = auth_user
|
||||
|
||||
if logged_user.present?
|
||||
payload[:user_id] = logged_user.try(:id)
|
||||
payload[:username] = logged_user.try(:username)
|
||||
|
@ -162,10 +168,12 @@ class ApplicationController < ActionController::Base
|
|||
# (e.g. tokens) to authenticate the user, whereas Devise sets current_user.
|
||||
#
|
||||
def auth_user
|
||||
if user_signed_in?
|
||||
current_user
|
||||
else
|
||||
try(:authenticated_user)
|
||||
strong_memoize(:auth_user) do
|
||||
if user_signed_in?
|
||||
current_user
|
||||
else
|
||||
try(:authenticated_user)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -457,11 +465,16 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
def set_current_context(&block)
|
||||
Gitlab::ApplicationContext.with_context(
|
||||
user: -> { auth_user },
|
||||
project: -> { @project },
|
||||
namespace: -> { @group },
|
||||
caller_id: full_action_name,
|
||||
&block)
|
||||
# Avoid loading the auth_user again after the request. Otherwise calling
|
||||
# `auth_user` again would also trigger the Warden callbacks again
|
||||
user: -> { auth_user if strong_memoized?(:auth_user) },
|
||||
project: -> { @project if @project&.persisted? },
|
||||
namespace: -> { @group if @group&.persisted? },
|
||||
caller_id: full_action_name) do
|
||||
yield
|
||||
ensure
|
||||
@current_context = Labkit::Context.current.to_h
|
||||
end
|
||||
end
|
||||
|
||||
def set_locale(&block)
|
||||
|
|
|
@ -4,7 +4,9 @@ class JwtController < ApplicationController
|
|||
skip_around_action :set_session_storage
|
||||
skip_before_action :authenticate_user!
|
||||
skip_before_action :verify_authenticity_token
|
||||
before_action :authenticate_project_or_user
|
||||
|
||||
# Add this before other actions, since we want to have the user or project
|
||||
prepend_before_action :auth_user, :authenticate_project_or_user
|
||||
|
||||
SERVICES = {
|
||||
Auth::ContainerRegistryAuthenticationService::AUDIENCE => Auth::ContainerRegistryAuthenticationService
|
||||
|
@ -77,7 +79,9 @@ class JwtController < ApplicationController
|
|||
end
|
||||
|
||||
def auth_user
|
||||
actor = @authentication_result&.actor
|
||||
actor.is_a?(User) ? actor : nil
|
||||
strong_memoize(:auth_user) do
|
||||
actor = @authentication_result&.actor
|
||||
actor.is_a?(User) ? actor : nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Projects::AlertManagementController < Projects::ApplicationController
|
||||
before_action :ensure_detail_feature_enabled, only: :details
|
||||
before_action :authorize_read_alert_management_alert!
|
||||
before_action do
|
||||
push_frontend_feature_flag(:alert_list_status_filtering_enabled)
|
||||
|
@ -14,10 +13,4 @@ class Projects::AlertManagementController < Projects::ApplicationController
|
|||
def details
|
||||
@alert_id = params[:id]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def ensure_detail_feature_enabled
|
||||
render_404 unless Feature.enabled?(:alert_management_detail, project)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -10,7 +10,7 @@ class Projects::ArtifactsController < Projects::ApplicationController
|
|||
before_action :authorize_update_build!, only: [:keep]
|
||||
before_action :authorize_destroy_artifacts!, only: [:destroy]
|
||||
before_action :extract_ref_name_and_path
|
||||
before_action :validate_artifacts!, except: [:index, :download, :destroy]
|
||||
before_action :validate_artifacts!, except: [:index, :download, :raw, :destroy]
|
||||
before_action :entry, only: [:file]
|
||||
|
||||
MAX_PER_PAGE = 20
|
||||
|
@ -73,9 +73,11 @@ class Projects::ArtifactsController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def raw
|
||||
return render_404 unless zip_artifact?
|
||||
|
||||
path = Gitlab::Ci::Build::Artifacts::Path.new(params[:path])
|
||||
|
||||
send_artifacts_entry(build, path)
|
||||
send_artifacts_entry(artifacts_file, path)
|
||||
end
|
||||
|
||||
def keep
|
||||
|
@ -138,6 +140,13 @@ class Projects::ArtifactsController < Projects::ApplicationController
|
|||
@artifacts_file ||= build&.artifacts_file_for_type(params[:file_type] || :archive)
|
||||
end
|
||||
|
||||
def zip_artifact?
|
||||
types = HashWithIndifferentAccess.new(Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS)
|
||||
file_type = params[:file_type] || :archive
|
||||
|
||||
types[file_type] == :zip
|
||||
end
|
||||
|
||||
def entry
|
||||
@entry = build.artifacts_metadata_entry(params[:path])
|
||||
|
||||
|
|
|
@ -36,8 +36,8 @@ module WorkhorseHelper
|
|||
end
|
||||
|
||||
# Send an entry from artifacts through Workhorse
|
||||
def send_artifacts_entry(build, entry)
|
||||
headers.store(*Gitlab::Workhorse.send_artifacts_entry(build, entry))
|
||||
def send_artifacts_entry(file, entry)
|
||||
headers.store(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
|
||||
head :ok
|
||||
end
|
||||
|
||||
|
|
|
@ -50,10 +50,10 @@ module Ci
|
|||
metrics: :gzip,
|
||||
metrics_referee: :gzip,
|
||||
network_referee: :gzip,
|
||||
lsif: :gzip,
|
||||
dotenv: :gzip,
|
||||
cobertura: :gzip,
|
||||
cluster_applications: :gzip,
|
||||
lsif: :zip,
|
||||
|
||||
# All these file formats use `raw` as we need to store them uncompressed
|
||||
# for Frontend to fetch the files and do analysis
|
||||
|
|
|
@ -74,6 +74,7 @@ class Issue < ApplicationRecord
|
|||
scope :due_before, ->(date) { where('issues.due_date < ?', date) }
|
||||
scope :due_between, ->(from_date, to_date) { where('issues.due_date >= ?', from_date).where('issues.due_date <= ?', to_date) }
|
||||
scope :due_tomorrow, -> { where(due_date: Date.tomorrow) }
|
||||
scope :not_authored_by, ->(user) { where.not(author_id: user) }
|
||||
|
||||
scope :order_due_date_asc, -> { reorder(::Gitlab::Database.nulls_last_order('due_date', 'ASC')) }
|
||||
scope :order_due_date_desc, -> { reorder(::Gitlab::Database.nulls_last_order('due_date', 'DESC')) }
|
||||
|
@ -90,6 +91,7 @@ class Issue < ApplicationRecord
|
|||
scope :confidential_only, -> { where(confidential: true) }
|
||||
|
||||
scope :counts_by_state, -> { reorder(nil).group(:state_id).count }
|
||||
scope :with_alert_management_alerts, -> { joins(:alert_management_alert) }
|
||||
|
||||
# An issue can be uniquely identified by project_id and iid
|
||||
# Takes one or more sets of composite IDs, expressed as hash-like records of
|
||||
|
|
|
@ -81,6 +81,10 @@ class Service < ApplicationRecord
|
|||
active
|
||||
end
|
||||
|
||||
def operating?
|
||||
active && persisted?
|
||||
end
|
||||
|
||||
def show_active_box?
|
||||
true
|
||||
end
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
= _('All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings.')
|
||||
= render_if_exists 'projects/new_ci_cd_banner_external_repo'
|
||||
%p
|
||||
- pages_getting_started_guide = link_to _('Pages getting started guide'), help_page_path("user/project/pages/getting_started_part_two", anchor: "fork-a-project-to-get-started-from"), target: '_blank'
|
||||
- pages_getting_started_guide = link_to _('Pages getting started guide'), help_page_path("user/project/pages/index", anchor: "getting-started"), target: '_blank'
|
||||
= _('Information about additional Pages templates and how to install them can be found in our %{pages_getting_started_guide}.').html_safe % { pages_getting_started_guide: pages_getting_started_guide }
|
||||
.md
|
||||
= brand_new_project_guidelines
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
%h4.prepend-top-0
|
||||
= @service.title
|
||||
- [true, false].each do |value|
|
||||
- hide_class = 'd-none' if @service.activated? != value
|
||||
- hide_class = 'd-none' if @service.operating? != value
|
||||
%span.js-service-active-status{ class: hide_class, data: { value: value.to_s } }
|
||||
= boolean_to_icon value
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
.form-group.group-name-holder.col-sm-12
|
||||
= f.label :name, class: 'label-bold' do
|
||||
= _("Group name")
|
||||
= f.text_field :name, placeholder: 'My Awesome Group', class: 'form-control input-lg',
|
||||
= f.text_field :name, placeholder: _('My Awesome Group'), class: 'form-control input-lg',
|
||||
required: true,
|
||||
title: _('Please fill in a descriptive name for your group.'),
|
||||
autofocus: true
|
||||
|
@ -22,7 +22,7 @@
|
|||
- if parent
|
||||
%strong= parent.full_path + '/'
|
||||
= f.hidden_field :parent_id
|
||||
= f.text_field :path, placeholder: 'my-awesome-group', class: 'form-control js-validate-group-path',
|
||||
= f.text_field :path, placeholder: _('my-awesome-group'), class: 'form-control js-validate-group-path',
|
||||
autofocus: local_assigns[:autofocus] || false, required: true,
|
||||
pattern: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS,
|
||||
title: _('Please choose a group URL with no special characters.'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
- if milestone.expired? and not milestone.closed?
|
||||
.status-box.status-box-expired.append-bottom-5 = _('Expired')
|
||||
.status-box.status-box-expired.append-bottom-5= _('Expired')
|
||||
- if milestone.upcoming?
|
||||
.status-box.status-box-mr-merged.append-bottom-5 = _('Upcoming')
|
||||
.status-box.status-box-mr-merged.append-bottom-5= _('Upcoming')
|
||||
- if milestone.closed?
|
||||
.status-box.status-box-closed.append-bottom-5 = _('Closed')
|
||||
.status-box.status-box-closed.append-bottom-5= _('Closed')
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
- activated_label = (integration.activated? ? s_("ProjectService|%{service_title}: status on") : s_("ProjectService|%{service_title}: status off")) % { service_title: integration.title }
|
||||
%tr{ role: 'row' }
|
||||
%td{ role: 'cell', 'aria-colindex': 1, 'aria-label': activated_label }
|
||||
= boolean_to_icon integration.activated?
|
||||
= boolean_to_icon integration.operating?
|
||||
%td{ role: 'cell', 'aria-colindex': 2 }
|
||||
= link_to scoped_edit_integration_path(integration), { data: { qa_selector: "#{integration.to_param}_link" } } do
|
||||
%strong= integration.title
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix 500 on creating an invalid domains and verification
|
||||
merge_request: 31190
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix incorrect number of errors returned when querying sentry errors
|
||||
merge_request: 31252
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add instance column to services table if it's missing
|
||||
merge_request: 31631
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix incorrect regex used in FileUploader#extract_dynamic_path
|
||||
merge_request: 32271
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Externalize i18n strings from ./app/views/shared/_group_form.html.haml
|
||||
merge_request: 32132
|
||||
author: Gilang Gumilar
|
||||
type: changed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add issues_created_gitlab_alerts to usage ping
|
||||
merge_request: 31802
|
||||
author:
|
||||
type: added
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix duplicate index removal on ci_pipelines.project_id
|
||||
merge_request: 31043
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Replace the outdated link
|
||||
merge_request: 31874
|
||||
author: Renamoo
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: View raw file of any zip artifacts
|
||||
merge_request: 31912
|
||||
author:
|
||||
type: added
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix bug when services appear active even though they are not
|
||||
merge_request: 30160
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add Alert Detail view
|
||||
merge_request: 31877
|
||||
author:
|
||||
type: added
|
|
@ -6,6 +6,6 @@ class AddProjectShowDefaultAwardEmojis < ActiveRecord::Migration[6.0]
|
|||
DOWNTIME = false
|
||||
|
||||
def change
|
||||
add_column :project_settings, :show_default_award_emojis, :boolean, default: true, null: false # rubocop: disable Migration/AddColumn
|
||||
add_column :project_settings, :show_default_award_emojis, :boolean, default: true, null: false
|
||||
end
|
||||
end
|
||||
|
|
|
@ -285,7 +285,7 @@ The following documentation relates to the DevOps **Release** stage:
|
|||
| [Auto Deploy](topics/autodevops/stages.md#auto-deploy) | Configure GitLab for the deployment of your application. |
|
||||
| [Canary Deployments](user/project/canary_deployments.md) **(PREMIUM)** | Employ a popular CI strategy where a small portion of the fleet is updated to the new version first. |
|
||||
| [Deploy Boards](user/project/deploy_boards.md) **(PREMIUM)** | View the current health and status of each CI environment running on Kubernetes, displaying the status of the pods in the deployment. |
|
||||
| [Environments and deployments](ci/environments.md) | With environments, you can control the continuous deployment of your software within GitLab. |
|
||||
| [Environments and deployments](ci/environments/index.md) | With environments, you can control the continuous deployment of your software within GitLab. |
|
||||
| [Environment-specific variables](ci/variables/README.md#limit-the-environment-scopes-of-environment-variables) | Limit the scope of variables to specific environments. |
|
||||
| [GitLab CI/CD](ci/README.md) | Explore the features and capabilities of Continuous Deployment and Delivery with GitLab. |
|
||||
| [GitLab Pages](user/project/pages/index.md) | Build, test, and deploy a static site directly from GitLab. |
|
||||
|
|
|
@ -134,7 +134,7 @@ The following table lists basic ports that must be open between the **primary**
|
|||
See the full list of ports used by GitLab in [Package defaults](https://docs.gitlab.com/omnibus/package-information/defaults.html)
|
||||
|
||||
NOTE: **Note:**
|
||||
[Web terminal](../../../ci/environments.md#web-terminals) support requires your load balancer to correctly handle WebSocket connections.
|
||||
[Web terminal](../../../ci/environments/index.md#web-terminals) support requires your load balancer to correctly handle WebSocket connections.
|
||||
When using HTTP or HTTPS proxying, your load balancer must be configured to pass through the `Connection` and `Upgrade` hop-by-hop headers. See the [web terminal](../../integration/terminal.md) integration guide for more details.
|
||||
|
||||
NOTE: **Note:**
|
||||
|
|
|
@ -66,7 +66,7 @@ for details on managing SSL certificates and configuring NGINX.
|
|||
| 443 | 443 | TCP or HTTPS (*1*) (*2*) |
|
||||
| 22 | 22 | TCP |
|
||||
|
||||
- (*1*): [Web terminal](../../ci/environments.md#web-terminals) support requires
|
||||
- (*1*): [Web terminal](../../ci/environments/index.md#web-terminals) support requires
|
||||
your load balancer to correctly handle WebSocket connections. When using
|
||||
HTTP or HTTPS proxying, this means your load balancer must be configured
|
||||
to pass through the `Connection` and `Upgrade` hop-by-hop headers. See the
|
||||
|
|
|
@ -100,7 +100,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
|
|||
- [Mattermost](https://docs.gitlab.com/omnibus/gitlab-mattermost/): Integrate with [Mattermost](https://mattermost.com), an open source, private cloud workplace for web messaging.
|
||||
- [PlantUML](integration/plantuml.md): Create simple diagrams in AsciiDoc and Markdown documents
|
||||
created in snippets, wikis, and repositories.
|
||||
- [Web terminals](integration/terminal.md): Provide terminal access to your applications deployed to Kubernetes from within GitLab's CI/CD [environments](../ci/environments.md#web-terminals).
|
||||
- [Web terminals](integration/terminal.md): Provide terminal access to your applications deployed to Kubernetes from within GitLab's CI/CD [environments](../ci/environments/index.md#web-terminals).
|
||||
|
||||
## User settings and permissions
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ Only project maintainers and owners can access web terminals.
|
|||
With the introduction of the [Kubernetes integration](../../user/project/clusters/index.md),
|
||||
GitLab gained the ability to store and use credentials for a Kubernetes cluster.
|
||||
One of the things it uses these credentials for is providing access to
|
||||
[web terminals](../../ci/environments.md#web-terminals) for environments.
|
||||
[web terminals](../../ci/environments/index.md#web-terminals) for environments.
|
||||
|
||||
## How it works
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Users with Developer or higher [permissions](../user/permissions.md) can access
|
|||
|
||||
## List all effective feature flag specs under the specified environment
|
||||
|
||||
Get all effective feature flag specs under the specified [environment](../ci/environments.md).
|
||||
Get all effective feature flag specs under the specified [environment](../ci/environments/index.md).
|
||||
|
||||
For instance, there are two specs, `staging` and `production`, for a feature flag.
|
||||
When you pass `production` as a parameter to this endpoint, the system returns
|
||||
|
@ -23,7 +23,7 @@ GET /projects/:id/feature_flag_scopes
|
|||
| Attribute | Type | Required | Description |
|
||||
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
|
||||
| `environment` | string | yes | The [environment](../ci/environments.md) name |
|
||||
| `environment` | string | yes | The [environment](../ci/environments/index.md) name |
|
||||
|
||||
```shell
|
||||
curl --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects/1/feature_flag_scopes?environment=production
|
||||
|
@ -155,7 +155,7 @@ POST /projects/:id/feature_flags/:name/scopes
|
|||
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
|
||||
| `name` | string | yes | The name of the feature flag. |
|
||||
| `environment_scope` | string | yes | The [environment spec](../ci/environments.md#scoping-environments-with-specs) of the feature flag. |
|
||||
| `environment_scope` | string | yes | The [environment spec](../ci/environments/index.md#scoping-environments-with-specs) of the feature flag. |
|
||||
| `active` | boolean | yes | Whether the spec is active. |
|
||||
| `strategies` | json | yes | The [strategies](../user/project/operations/feature_flags.md#feature-flag-strategies) of the feature flag spec. |
|
||||
|
||||
|
@ -202,7 +202,7 @@ GET /projects/:id/feature_flags/:name/scopes/:environment_scope
|
|||
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
|
||||
| `name` | string | yes | The name of the feature flag. |
|
||||
| `environment_scope` | string | yes | The URL-encoded [environment spec](../ci/environments.md#scoping-environments-with-specs) of the feature flag. |
|
||||
| `environment_scope` | string | yes | The URL-encoded [environment spec](../ci/environments/index.md#scoping-environments-with-specs) of the feature flag. |
|
||||
|
||||
```shell
|
||||
curl --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects/:id/feature_flags/new_live_trace/scopes/production
|
||||
|
@ -238,7 +238,7 @@ PUT /projects/:id/feature_flags/:name/scopes/:environment_scope
|
|||
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
|
||||
| `name` | string | yes | The name of the feature flag. |
|
||||
| `environment_scope` | string | yes | The URL-encoded [environment spec](../ci/environments.md#scoping-environments-with-specs) of the feature flag. |
|
||||
| `environment_scope` | string | yes | The URL-encoded [environment spec](../ci/environments/index.md#scoping-environments-with-specs) of the feature flag. |
|
||||
| `active` | boolean | yes | Whether the spec is active. |
|
||||
| `strategies` | json | yes | The [strategies](../user/project/operations/feature_flags.md#feature-flag-strategies) of the feature flag spec. |
|
||||
|
||||
|
@ -284,7 +284,7 @@ DELETE /projects/:id/feature_flags/:name/scopes/:environment_scope
|
|||
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
|
||||
| `name` | string | yes | The name of the feature flag. |
|
||||
| `environment_scope` | string | yes | The URL-encoded [environment spec](../ci/environments.md#scoping-environments-with-specs) of the feature flag. |
|
||||
| `environment_scope` | string | yes | The URL-encoded [environment spec](../ci/environments/index.md#scoping-environments-with-specs) of the feature flag. |
|
||||
|
||||
```shell
|
||||
curl --header "PRIVATE-TOKEN: <your_access_token>" --request DELETE https://gitlab.example.com/api/v4/projects/1/feature_flags/new_live_trace/scopes/production
|
||||
|
|
|
@ -155,7 +155,7 @@ POST /projects/:id/feature_flags
|
|||
| `name` | string | yes | The name of the feature flag. |
|
||||
| `description` | string | no | The description of the feature flag. |
|
||||
| `scopes` | JSON | no | The [feature flag specs](../user/project/operations/feature_flags.md#define-environment-specs) of the feature flag. |
|
||||
| `scopes:environment_scope` | string | no | The [environment spec](../ci/environments.md#scoping-environments-with-specs). |
|
||||
| `scopes:environment_scope` | string | no | The [environment spec](../ci/environments/index.md#scoping-environments-with-specs). |
|
||||
| `scopes:active` | boolean | no | Whether the spec is active. |
|
||||
| `scopes:strategies` | JSON | no | The [strategies](../user/project/operations/feature_flags.md#feature-flag-strategies) of the feature flag spec. |
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# Features flags API
|
||||
|
||||
This API is for managing Flipper-based [feature flags used in development of GitLab](../development/feature_flags/index.md).
|
||||
|
||||
All methods require administrator authorization.
|
||||
|
||||
Notice that currently the API only supports boolean and percentage-of-time gate
|
||||
|
|
|
@ -51,7 +51,7 @@ POST /projects/:id/approvals
|
|||
| `approvals_before_merge` | integer | no | How many approvals are required before an MR can be merged. Deprecated in 12.0 in favor of Approval Rules API. |
|
||||
| `reset_approvals_on_push` | boolean | no | Reset approvals on a new push |
|
||||
| `disable_overriding_approvers_per_merge_request` | boolean | no | Allow/Disallow overriding approvers per MR |
|
||||
| `merge_requests_author_approval` | boolean | no | Allow/Disallow authors from self approving merge requests; `true` means authors cannot self approve |
|
||||
| `merge_requests_author_approval` | boolean | no | Allow/Disallow authors from self approving merge requests; `true` means authors can self approve |
|
||||
| `merge_requests_disable_committers_approval` | boolean | no | Allow/Disallow committers from self approving merge requests |
|
||||
| `require_password_to_approve` | boolean | no | Require approver to enter a password in order to authenticate before adding the approval |
|
||||
|
||||
|
|
|
@ -96,7 +96,6 @@ Example response:
|
|||
],
|
||||
"commit_path":"/root/awesome-app/commit/588440f66559714280628a4f9799f0c4eb880a4a",
|
||||
"tag_path":"/root/awesome-app/-/tags/v0.11.1",
|
||||
"evidence_sha":"760d6cdfb0879c3ffedec13af470e0f71cf52c6cde4d",
|
||||
"assets":{
|
||||
"count":6,
|
||||
"sources":[
|
||||
|
@ -133,6 +132,13 @@ Example response:
|
|||
],
|
||||
"evidence_file_path":"https://gitlab.example.com/root/awesome-app/-/releases/v0.2/evidence.json"
|
||||
},
|
||||
"evidences":[
|
||||
{
|
||||
sha: "760d6cdfb0879c3ffedec13af470e0f71cf52c6cde4d",
|
||||
filepath: "https://gitlab.example.com/root/awesome-app/-/releases/v0.2/evidence.json",
|
||||
collected_at: "2019-01-03T01:56:19.539Z"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"tag_name":"v0.1",
|
||||
|
@ -165,7 +171,6 @@ Example response:
|
|||
"committer_email":"admin@example.com",
|
||||
"committed_date":"2019-01-03T01:53:28.000Z"
|
||||
},
|
||||
"evidence_sha":"760d6cdfb0879c3ffedec13af470e0f71cf52c6cde4d",
|
||||
"assets":{
|
||||
"count":4,
|
||||
"sources":[
|
||||
|
@ -191,6 +196,13 @@ Example response:
|
|||
],
|
||||
"evidence_file_path":"https://gitlab.example.com/root/awesome-app/-/releases/v0.1/evidence.json"
|
||||
},
|
||||
"evidences":[
|
||||
{
|
||||
sha: "c3ffedec13af470e760d6cdfb08790f71cf52c6cde4d",
|
||||
filepath: "https://gitlab.example.com/root/awesome-app/-/releases/v0.1/evidence.json",
|
||||
collected_at: "2019-01-03T01:55:18.203Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
type: reference
|
||||
---
|
||||
|
||||
# .gitignore API
|
||||
# `.gitignore` API
|
||||
|
||||
In GitLab, there is an API endpoint available for `.gitignore`. For more
|
||||
information on `gitignore`, see the
|
||||
|
|
|
@ -85,7 +85,7 @@ GitLab CI/CD uses a number of concepts to describe and run your build and deploy
|
|||
|:--------------|:-------------|
|
||||
| [Pipelines](pipelines/index.md) | Structure your CI/CD process through pipelines. |
|
||||
| [Environment variables](variables/README.md) | Reuse values based on a variable/value key pair. |
|
||||
| [Environments](environments.md) | Deploy your application to different environments (e.g., staging, production). |
|
||||
| [Environments](environments/index.md) | Deploy your application to different environments (e.g., staging, production). |
|
||||
| [Job artifacts](pipelines/job_artifacts.md) | Output, use, and reuse job artifacts. |
|
||||
| [Cache dependencies](caching/index.md) | Cache your dependencies for a faster execution. |
|
||||
| [GitLab Runner](https://docs.gitlab.com/runner/) | Configure your own GitLab Runners to execute your scripts. |
|
||||
|
|
|
@ -1,987 +1,5 @@
|
|||
---
|
||||
type: reference
|
||||
redirect_to: 'environments/index.md'
|
||||
---
|
||||
|
||||
# Environments and deployments
|
||||
|
||||
> Introduced in GitLab 8.9.
|
||||
|
||||
Environments allow control of the continuous deployment of your software,
|
||||
all within GitLab.
|
||||
|
||||
## Introduction
|
||||
|
||||
There are many stages required in the software development process before the software is ready
|
||||
for public consumption.
|
||||
|
||||
For example:
|
||||
|
||||
1. Develop your code.
|
||||
1. Test your code.
|
||||
1. Deploy your code into a testing or staging environment before you release it to the public.
|
||||
|
||||
This helps find bugs in your software, and also in the deployment process as well.
|
||||
|
||||
GitLab CI/CD is capable of not only testing or building your projects, but also
|
||||
deploying them in your infrastructure, with the added benefit of giving you a
|
||||
way to track your deployments. In other words, you will always know what is
|
||||
currently being deployed or has been deployed on your servers.
|
||||
|
||||
It's important to know that:
|
||||
|
||||
- Environments are like tags for your CI jobs, describing where code gets deployed.
|
||||
- Deployments are created when [jobs](yaml/README.md#introduction) deploy versions of code to environments,
|
||||
so every environment can have one or more deployments.
|
||||
|
||||
GitLab:
|
||||
|
||||
- Provides a full history of your deployments for each environment.
|
||||
- Keeps track of your deployments, so you always know what is currently being deployed on your
|
||||
servers.
|
||||
|
||||
If you have a deployment service such as [Kubernetes](../user/project/clusters/index.md)
|
||||
associated with your project, you can use it to assist with your deployments, and
|
||||
can even access a [web terminal](#web-terminals) for your environment from within GitLab!
|
||||
|
||||
## Configuring environments
|
||||
|
||||
Configuring environments involves:
|
||||
|
||||
1. Understanding how [pipelines](pipelines/index.md) work.
|
||||
1. Defining environments in your project's [`.gitlab-ci.yml`](yaml/README.md) file.
|
||||
1. Creating a job configured to deploy your application. For example, a deploy job configured with [`environment`](yaml/README.md#environment) to deploy your application to a [Kubernetes cluster](../user/project/clusters/index.md).
|
||||
|
||||
The rest of this section illustrates how to configure environments and deployments using
|
||||
an example scenario. It assumes you have already:
|
||||
|
||||
- Created a [project](../gitlab-basics/create-project.md) in GitLab.
|
||||
- Set up [a Runner](runners/README.md).
|
||||
|
||||
In the scenario:
|
||||
|
||||
- We are developing an application.
|
||||
- We want to run tests and build our app on all branches.
|
||||
- Our default branch is `master`.
|
||||
- We deploy the app only when a pipeline on `master` branch is run.
|
||||
|
||||
### Defining environments
|
||||
|
||||
Let's consider the following `.gitlab-ci.yml` example:
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- deploy
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script: echo "Running tests"
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script: echo "Building the app"
|
||||
|
||||
deploy_staging:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to staging server"
|
||||
environment:
|
||||
name: staging
|
||||
url: https://staging.example.com
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
We have defined three [stages](yaml/README.md#stages):
|
||||
|
||||
- `test`
|
||||
- `build`
|
||||
- `deploy`
|
||||
|
||||
The jobs assigned to these stages will run in this order. If any job fails, then
|
||||
the pipeline fails and jobs that are assigned to the next stage won't run.
|
||||
|
||||
In our case:
|
||||
|
||||
- The `test` job will run first.
|
||||
- Then the `build` job.
|
||||
- Lastly the `deploy_staging` job.
|
||||
|
||||
With this configuration, we:
|
||||
|
||||
- Check that the tests pass.
|
||||
- Ensure that our app is able to be built successfully.
|
||||
- Lastly we deploy to the staging server.
|
||||
|
||||
NOTE: **Note:**
|
||||
The `environment` keyword defines where the app is deployed.
|
||||
The environment `name` and `url` is exposed in various places
|
||||
within GitLab. Each time a job that has an environment specified
|
||||
succeeds, a deployment is recorded, along with the Git SHA, and environment name.
|
||||
|
||||
CAUTION: **Caution**:
|
||||
Some characters are not allowed in environment names. Use only letters,
|
||||
numbers, spaces, and `-`, `_`, `/`, `{`, `}`, or `.`. Also, it must not start nor end with `/`.
|
||||
|
||||
In summary, with the above `.gitlab-ci.yml` we have achieved the following:
|
||||
|
||||
- All branches will run the `test` and `build` jobs.
|
||||
- The `deploy_staging` job will run [only](yaml/README.md#onlyexcept-basic) on the `master`
|
||||
branch, which means all merge requests that are created from branches don't
|
||||
get deployed to the staging server.
|
||||
- When a merge request is merged, all jobs will run and the `deploy_staging`
|
||||
job will deploy our code to a staging server while the deployment
|
||||
will be recorded in an environment named `staging`.
|
||||
|
||||
#### Environment variables and Runner
|
||||
|
||||
Starting with GitLab 8.15, the environment name is exposed to the Runner in
|
||||
two forms:
|
||||
|
||||
- `$CI_ENVIRONMENT_NAME`. The name given in `.gitlab-ci.yml` (with any variables
|
||||
expanded).
|
||||
- `$CI_ENVIRONMENT_SLUG`. A "cleaned-up" version of the name, suitable for use in URLs,
|
||||
DNS, etc.
|
||||
|
||||
If you change the name of an existing environment, the:
|
||||
|
||||
- `$CI_ENVIRONMENT_NAME` variable will be updated with the new environment name.
|
||||
- `$CI_ENVIRONMENT_SLUG` variable will remain unchanged to prevent unintended side
|
||||
effects.
|
||||
|
||||
Starting with GitLab 9.3, the environment URL is exposed to the Runner via
|
||||
`$CI_ENVIRONMENT_URL`. The URL is expanded from either:
|
||||
|
||||
- `.gitlab-ci.yml`.
|
||||
- The external URL from the environment if not defined in `.gitlab-ci.yml`.
|
||||
|
||||
#### Set dynamic environment URLs after a job finishes
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/17066) in GitLab 12.9.
|
||||
|
||||
In a job script, you can specify a static [environment URL](#using-the-environment-url).
|
||||
However, there may be times when you want a dynamic URL. For example,
|
||||
if you deploy a Review App to an external hosting
|
||||
service that generates a random URL per deployment, like `https://94dd65b.amazonaws.com/qa-lambda-1234567`,
|
||||
you don't know the URL before the deployment script finishes.
|
||||
If you want to use the environment URL in GitLab, you would have to update it manually.
|
||||
|
||||
To address this problem, you can configure a deployment job to report back a set of
|
||||
variables, including the URL that was dynamically-generated by the external service.
|
||||
GitLab supports [dotenv](https://github.com/bkeepers/dotenv) file as the format,
|
||||
and expands the `environment:url` value with variables defined in the dotenv file.
|
||||
|
||||
To use this feature, specify the
|
||||
[`artifacts:reports:dotenv`](pipelines/job_artifacts.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
|
||||
|
||||
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
|
||||
For an overview, see [Set dynamic URLs after a job finished](https://youtu.be/70jDXtOf4Ig).
|
||||
|
||||
##### Example of setting dynamic environment URLs
|
||||
|
||||
The following example shows a Review App that creates a new environment
|
||||
per merge request. The `review` job is triggered by every push, and
|
||||
creates or updates an environment named `review/your-branch-name`.
|
||||
The environment URL is set to `$DYNAMIC_ENVIRONMENT_URL`:
|
||||
|
||||
```yaml
|
||||
review:
|
||||
script:
|
||||
- DYNAMIC_ENVIRONMENT_URL=$(deploy-script) # In script, get the environment URL.
|
||||
- echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> deploy.env # Add the value to a dotenv file.
|
||||
artifacts:
|
||||
reports:
|
||||
dotenv: deploy.env # Report back dotenv file to rails.
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_SLUG
|
||||
url: $DYNAMIC_ENVIRONMENT_URL # and set the variable produced in script to `environment:url`
|
||||
on_stop: stop_review
|
||||
|
||||
stop_review:
|
||||
script:
|
||||
- ./teardown-environment
|
||||
when: manual
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_SLUG
|
||||
action: stop
|
||||
```
|
||||
|
||||
As soon as the `review` job finishes, GitLab updates the `review/your-branch-name`
|
||||
environment's URL.
|
||||
It parses the report artifact `deploy.env`, registers a list of variables as runtime-created,
|
||||
uses it for expanding `environment:url: $DYNAMIC_ENVIRONMENT_URL` and sets it to the environment URL.
|
||||
You can also specify a static part of the URL at `environment:url:`, such as
|
||||
`https://$DYNAMIC_ENVIRONMENT_URL`. If the value of `DYNAMIC_ENVIRONMENT_URL` is
|
||||
`123.awesome.com`, the final result will be `https://123.awesome.com`.
|
||||
|
||||
The assigned URL for the `review/your-branch-name` environment is visible in the UI.
|
||||
[See where the environment URL is displayed](#using-the-environment-url).
|
||||
|
||||
> **Notes:**
|
||||
>
|
||||
> - `stop_review` doesn't generate a dotenv report artifact, so it won't recognize the `DYNAMIC_ENVIRONMENT_URL` variable. Therefore you should not set `environment:url:` in the `stop_review` job.
|
||||
> - If the environment URL is not valid (for example, the URL is malformed), the system doesn't update the environment URL.
|
||||
|
||||
### Configuring manual deployments
|
||||
|
||||
Adding `when: manual` to an automatically executed job's configuration converts it to
|
||||
a job requiring manual action.
|
||||
|
||||
To expand on the [previous example](#defining-environments), the following includes
|
||||
another job that deploys our app to a production server and is
|
||||
tracked by a `production` environment.
|
||||
|
||||
The `.gitlab-ci.yml` file for this is as follows:
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- deploy
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script: echo "Running tests"
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script: echo "Building the app"
|
||||
|
||||
deploy_staging:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to staging server"
|
||||
environment:
|
||||
name: staging
|
||||
url: https://staging.example.com
|
||||
only:
|
||||
- master
|
||||
|
||||
deploy_prod:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to production server"
|
||||
environment:
|
||||
name: production
|
||||
url: https://example.com
|
||||
when: manual
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
The `when: manual` action:
|
||||
|
||||
- Exposes a "play" button in GitLab's UI for that job.
|
||||
- Means the `deploy_prod` job will only be triggered when the "play" button is clicked.
|
||||
|
||||
You can find the "play" button in the pipelines, environments, deployments, and jobs views.
|
||||
|
||||
| View | Screenshot |
|
||||
|:----------------|:-------------------------------------------------------------------------------|
|
||||
| Pipelines | ![Pipelines manual action](img/environments_manual_action_pipelines.png) |
|
||||
| Single pipeline | ![Pipelines manual action](img/environments_manual_action_single_pipeline.png) |
|
||||
| Environments | ![Environments manual action](img/environments_manual_action_environments.png) |
|
||||
| Deployments | ![Deployments manual action](img/environments_manual_action_deployments.png) |
|
||||
| Jobs | ![Builds manual action](img/environments_manual_action_jobs.png) |
|
||||
|
||||
Clicking on the play button in any view will trigger the `deploy_prod` job, and the
|
||||
deployment will be recorded as a new environment named `production`.
|
||||
|
||||
NOTE: **Note:**
|
||||
If your environment's name is `production` (all lowercase),
|
||||
it will get recorded in [Value Stream Analytics](../user/project/cycle_analytics.md).
|
||||
|
||||
### Configuring dynamic environments
|
||||
|
||||
Regular environments are good when deploying to "stable" environments like staging or production.
|
||||
|
||||
However, for environments for branches other than `master`, dynamic environments
|
||||
can be used. Dynamic environments make it possible to create environments on the fly by
|
||||
declaring their names dynamically in `.gitlab-ci.yml`.
|
||||
|
||||
Dynamic environments are a fundamental part of [Review apps](review_apps/index.md).
|
||||
|
||||
### Configuring incremental rollouts
|
||||
|
||||
Learn how to release production changes to only a portion of your Kubernetes pods with
|
||||
[incremental rollouts](environments/incremental_rollouts.md).
|
||||
|
||||
#### Allowed variables
|
||||
|
||||
The `name` and `url` parameters for dynamic environments can use most available CI/CD variables,
|
||||
including:
|
||||
|
||||
- [Predefined environment variables](variables/README.md#predefined-environment-variables)
|
||||
- [Project and group variables](variables/README.md#gitlab-cicd-environment-variables)
|
||||
- [`.gitlab-ci.yml` variables](yaml/README.md#variables)
|
||||
|
||||
However, you cannot use variables defined:
|
||||
|
||||
- Under `script`.
|
||||
- On the Runner's side.
|
||||
|
||||
There are also other variables that are unsupported in the context of `environment:name`.
|
||||
For more information, see [Where variables can be used](variables/where_variables_can_be_used.md).
|
||||
|
||||
#### Example configuration
|
||||
|
||||
GitLab Runner exposes various [environment variables](variables/README.md) when a job runs, so
|
||||
you can use them as environment names.
|
||||
|
||||
In the following example, the job will deploy to all branches except `master`:
|
||||
|
||||
```yaml
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_ENVIRONMENT_SLUG.example.com
|
||||
only:
|
||||
- branches
|
||||
except:
|
||||
- master
|
||||
```
|
||||
|
||||
In this example:
|
||||
|
||||
- The job's name is `deploy_review` and it runs on the `deploy` stage.
|
||||
- We set the `environment` with the `environment:name` as `review/$CI_COMMIT_REF_NAME`.
|
||||
Since the [environment name](yaml/README.md#environmentname) can contain slashes (`/`), we can
|
||||
use this pattern to distinguish between dynamic and regular environments.
|
||||
- We tell the job to run [`only`](yaml/README.md#onlyexcept-basic) on branches,
|
||||
[`except`](yaml/README.md#onlyexcept-basic) `master`.
|
||||
|
||||
For the value of:
|
||||
|
||||
- `environment:name`, the first part is `review`, followed by a `/` and then `$CI_COMMIT_REF_NAME`,
|
||||
which receives the value of the branch name.
|
||||
- `environment:url`, we want a specific and distinct URL for each branch. `$CI_COMMIT_REF_NAME`
|
||||
may contain a `/` or other characters that would be invalid in a domain name or URL,
|
||||
so we use `$CI_ENVIRONMENT_SLUG` to guarantee that we get a valid URL.
|
||||
|
||||
For example, given a `$CI_COMMIT_REF_NAME` of `100-Do-The-Thing`, the URL will be something
|
||||
like `https://100-do-the-4f99a2.example.com`. Again, the way you set up
|
||||
the web server to serve these requests is based on your setup.
|
||||
|
||||
We have used `$CI_ENVIRONMENT_SLUG` here because it is guaranteed to be unique. If
|
||||
you're using a workflow like [GitLab Flow](../topics/gitlab_flow.md), collisions
|
||||
are unlikely and you may prefer environment names to be more closely based on the
|
||||
branch name. In that case, you could use `$CI_COMMIT_REF_NAME` in `environment:url` in
|
||||
the example above: `https://$CI_COMMIT_REF_NAME.example.com`, which would give a URL
|
||||
of `https://100-do-the-thing.example.com`.
|
||||
|
||||
NOTE: **Note:**
|
||||
You are not required to use the same prefix or only slashes (`/`) in the dynamic environments'
|
||||
names. However, using this format will enable the [grouping similar environments](#grouping-similar-environments)
|
||||
feature.
|
||||
|
||||
### Configuring Kubernetes deployments
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/27630) in GitLab 12.6.
|
||||
|
||||
If you are deploying to a [Kubernetes cluster](../user/project/clusters/index.md)
|
||||
associated with your project, you can configure these deployments from your
|
||||
`gitlab-ci.yml` file.
|
||||
|
||||
The following configuration options are supported:
|
||||
|
||||
- [`namespace`](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)
|
||||
|
||||
In the following example, the job will deploy your application to the
|
||||
`production` Kubernetes namespace.
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to production server"
|
||||
environment:
|
||||
name: production
|
||||
url: https://example.com
|
||||
kubernetes:
|
||||
namespace: production
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
When deploying to a Kubernetes cluster using GitLab's Kubernetes integration,
|
||||
information about the cluster and namespace will be displayed above the job
|
||||
trace on the deployment job page:
|
||||
|
||||
![Deployment cluster information](img/environments_deployment_cluster_v12_8.png)
|
||||
|
||||
NOTE: **Note:**
|
||||
Kubernetes configuration is not supported for Kubernetes clusters
|
||||
that are [managed by GitLab](../user/project/clusters/index.md#gitlab-managed-clusters).
|
||||
To follow progress on support for GitLab-managed clusters, see the
|
||||
[relevant issue](https://gitlab.com/gitlab-org/gitlab/issues/38054).
|
||||
|
||||
### Complete example
|
||||
|
||||
The configuration in this section provides a full development workflow where your app is:
|
||||
|
||||
- Tested.
|
||||
- Built.
|
||||
- Deployed as a Review App.
|
||||
- Deployed to a staging server once the merge request is merged.
|
||||
- Finally, able to be manually deployed to the production server.
|
||||
|
||||
The following combines the previous configuration examples, including:
|
||||
|
||||
- Defining [simple environments](#defining-environments) for testing, building, and deployment to staging.
|
||||
- Adding [manual actions](#configuring-manual-deployments) for deployment to production.
|
||||
- Creating [dynamic environments](#configuring-dynamic-environments) for deployments for reviewing.
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- deploy
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script: echo "Running tests"
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script: echo "Building the app"
|
||||
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_ENVIRONMENT_SLUG.example.com
|
||||
only:
|
||||
- branches
|
||||
except:
|
||||
- master
|
||||
|
||||
deploy_staging:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to staging server"
|
||||
environment:
|
||||
name: staging
|
||||
url: https://staging.example.com
|
||||
only:
|
||||
- master
|
||||
|
||||
deploy_prod:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to production server"
|
||||
environment:
|
||||
name: production
|
||||
url: https://example.com
|
||||
when: manual
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
A more realistic example would also include copying files to a location where a
|
||||
webserver (for example, NGINX) could then access and serve them.
|
||||
|
||||
The example below will copy the `public` directory to `/srv/nginx/$CI_COMMIT_REF_SLUG/public`:
|
||||
|
||||
```yaml
|
||||
review_app:
|
||||
stage: deploy
|
||||
script:
|
||||
- rsync -av --delete public /srv/nginx/$CI_COMMIT_REF_SLUG
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_COMMIT_REF_SLUG.example.com
|
||||
```
|
||||
|
||||
This example requires that NGINX and GitLab Runner are set up on the server this job will run on.
|
||||
|
||||
NOTE: **Note:**
|
||||
See the [limitations](#limitations) section for some edge cases regarding the naming of
|
||||
your branches and Review Apps.
|
||||
|
||||
The complete example provides the following workflow to developers:
|
||||
|
||||
- Create a branch locally.
|
||||
- Make changes and commit them.
|
||||
- Push the branch to GitLab.
|
||||
- Create a merge request.
|
||||
|
||||
Behind the scenes, GitLab Runner will:
|
||||
|
||||
- Pick up the changes and start running the jobs.
|
||||
- Run the jobs sequentially as defined in `stages`:
|
||||
- First, run the tests.
|
||||
- If the tests succeed, build the app.
|
||||
- If the build succeeds, the app is deployed to an environment with a name specific to the
|
||||
branch.
|
||||
|
||||
So now, every branch:
|
||||
|
||||
- Gets its own environment.
|
||||
- Is deployed to its own unique location, with the added benefit of:
|
||||
- Having a [history of deployments](#viewing-deployment-history).
|
||||
- Being able to [rollback changes](#retrying-and-rolling-back) if needed.
|
||||
|
||||
For more information, see [Using the environment URL](#using-the-environment-url).
|
||||
|
||||
### Protected environments
|
||||
|
||||
Environments can be "protected", restricting access to them.
|
||||
|
||||
For more information, see [Protected environments](environments/protected_environments.md).
|
||||
|
||||
## Working with environments
|
||||
|
||||
Once environments are configured, GitLab provides many features for working with them,
|
||||
as documented below.
|
||||
|
||||
### Viewing environments and deployments
|
||||
|
||||
A list of environments and deployment statuses is available on each project's **Operations > Environments** page.
|
||||
|
||||
For example:
|
||||
|
||||
![Environment view](img/environments_available.png)
|
||||
|
||||
This example shows:
|
||||
|
||||
- The environment's name with a link to its deployments.
|
||||
- The last deployment ID number and who performed it.
|
||||
- The job ID of the last deployment with its respective job name.
|
||||
- The commit information of the last deployment, such as who committed it, to what
|
||||
branch, and the Git SHA of the commit.
|
||||
- The exact time the last deployment was performed.
|
||||
- A button that takes you to the URL that you defined under the `environment` keyword
|
||||
in `.gitlab-ci.yml`.
|
||||
- A button that re-deploys the latest deployment, meaning it runs the job
|
||||
defined by the environment name for that specific commit.
|
||||
|
||||
The information shown in the **Environments** page is limited to the latest
|
||||
deployments, but an environment can have multiple deployments.
|
||||
|
||||
> **Notes:**
|
||||
>
|
||||
> - While you can create environments manually in the web interface, we recommend
|
||||
> that you define your environments in `.gitlab-ci.yml` first. They will
|
||||
> be automatically created for you after the first deploy.
|
||||
> - The environments page can only be viewed by users with [Reporter permission](../user/permissions.md#project-members-permissions)
|
||||
> and above. For more information on permissions, see the [permissions documentation](../user/permissions.md).
|
||||
> - Only deploys that happen after your `.gitlab-ci.yml` is properly configured
|
||||
> will show up in the **Environment** and **Last deployment** lists.
|
||||
|
||||
### Viewing deployment history
|
||||
|
||||
GitLab keeps track of your deployments, so you:
|
||||
|
||||
- Always know what is currently being deployed on your servers.
|
||||
- Can have the full history of your deployments for every environment.
|
||||
|
||||
Clicking on an environment shows the history of its deployments. Here's an example **Environments** page
|
||||
with multiple deployments:
|
||||
|
||||
![Deployments](img/deployments_view.png)
|
||||
|
||||
This view is similar to the **Environments** page, but all deployments are shown. Also in this view
|
||||
is a **Rollback** button. For more information, see [Retrying and rolling back](#retrying-and-rolling-back).
|
||||
|
||||
### Retrying and rolling back
|
||||
|
||||
If there is a problem with a deployment, you can retry it or roll it back.
|
||||
|
||||
To retry or rollback a deployment:
|
||||
|
||||
1. Navigate to **Operations > Environments**.
|
||||
1. Click on the environment.
|
||||
1. In the deployment history list for the environment, click the:
|
||||
- **Retry** button next to the last deployment, to retry that deployment.
|
||||
- **Rollback** button next to a previously successful deployment, to roll back to that deployment.
|
||||
|
||||
#### What to expect with a rollback
|
||||
|
||||
Pressing the **Rollback** button on a specific commit will trigger a _new_ deployment with its
|
||||
own unique job ID.
|
||||
|
||||
This means that you will see a new deployment that points to the commit you are rolling back to.
|
||||
|
||||
NOTE: **Note:**
|
||||
The defined deployment process in the job's `script` determines whether the rollback succeeds or not.
|
||||
|
||||
### Using the environment URL
|
||||
|
||||
The [environment URL](yaml/README.md#environmenturl) is exposed in a few
|
||||
places within GitLab:
|
||||
|
||||
- In a merge request widget as a link:
|
||||
![Environment URL in merge request](img/environments_mr_review_app.png)
|
||||
- In the Environments view as a button:
|
||||
![Environment URL in environments](img/environments_available.png)
|
||||
- In the Deployments view as a button:
|
||||
![Environment URL in deployments](img/deployments_view.png)
|
||||
|
||||
You can see this information in a merge request itself if:
|
||||
|
||||
- The merge request is eventually merged to the default branch (usually `master`).
|
||||
- That branch also deploys to an environment (for example, `staging` or `production`).
|
||||
|
||||
For example:
|
||||
|
||||
![Environment URLs in merge request](img/environments_link_url_mr.png)
|
||||
|
||||
#### Going from source files to public pages
|
||||
|
||||
With GitLab's [Route Maps](review_apps/index.md#route-maps) you can go directly
|
||||
from source files to public pages in the environment set for Review Apps.
|
||||
|
||||
### Stopping an environment
|
||||
|
||||
Stopping an environment:
|
||||
|
||||
- Moves it from the list of **Available** environments to the list of **Stopped**
|
||||
environments on the [**Environments** page](#viewing-environments-and-deployments).
|
||||
- Executes an [`on_stop` action](yaml/README.md#environmenton_stop), if defined.
|
||||
|
||||
This is often used when multiple developers are working on a project at the same time,
|
||||
each of them pushing to their own branches, causing many dynamic environments to be created.
|
||||
|
||||
NOTE: **Note:**
|
||||
Starting with GitLab 8.14, dynamic environments are stopped automatically
|
||||
when their associated branch is deleted.
|
||||
|
||||
#### Automatically stopping an environment
|
||||
|
||||
Environments can be stopped automatically using special configuration.
|
||||
|
||||
Consider the following example where the `deploy_review` job calls `stop_review`
|
||||
to clean up and stop the environment:
|
||||
|
||||
```yaml
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_ENVIRONMENT_SLUG.example.com
|
||||
on_stop: stop_review
|
||||
only:
|
||||
- branches
|
||||
except:
|
||||
- master
|
||||
|
||||
stop_review:
|
||||
stage: deploy
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
script:
|
||||
- echo "Remove review app"
|
||||
when: manual
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
action: stop
|
||||
```
|
||||
|
||||
Setting the [`GIT_STRATEGY`](yaml/README.md#git-strategy) to `none` is necessary in the
|
||||
`stop_review` job so that the [GitLab Runner](https://docs.gitlab.com/runner/) won't
|
||||
try to check out the code after the branch is deleted.
|
||||
|
||||
When you have an environment that has a stop action defined (typically when
|
||||
the environment describes a Review App), GitLab will automatically trigger a
|
||||
stop action when the associated branch is deleted. The `stop_review` job must
|
||||
be in the same `stage` as the `deploy_review` job in order for the environment
|
||||
to automatically stop.
|
||||
|
||||
You can read more in the [`.gitlab-ci.yml` reference](yaml/README.md#environmenton_stop).
|
||||
|
||||
#### Environments auto-stop
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/20956) in GitLab 12.8.
|
||||
|
||||
You can set a expiry time to environments and stop them automatically after a certain period.
|
||||
|
||||
For example, consider the use of this feature with Review Apps environments.
|
||||
When you set up Review Apps, sometimes they keep running for a long time
|
||||
because some merge requests are left as open. An example for this situation is when the author of the merge
|
||||
request is not actively working on it, due to priority changes or a different approach was decided on, and the merge requests was simply forgotten.
|
||||
Idle environments waste resources, therefore they
|
||||
should be terminated as soon as possible.
|
||||
|
||||
To address this problem, you can specify an optional expiration date for
|
||||
Review Apps environments. When the expiry time is reached, GitLab will automatically trigger a job
|
||||
to stop the environment, eliminating the need of manually doing so. In case an environment is updated, the expiration is renewed
|
||||
ensuring that only active merge requests keep running Review Apps.
|
||||
|
||||
To enable this feature, you need to specify the [`environment:auto_stop_in`](yaml/README.md#environmentauto_stop_in) keyword in `.gitlab-ci.yml`.
|
||||
You can specify a human-friendly date as the value, such as `1 hour and 30 minutes` or `1 day`.
|
||||
`auto_stop_in` uses the same format of [`artifacts:expire_in` docs](yaml/README.md#artifactsexpire_in).
|
||||
|
||||
##### Auto-stop example
|
||||
|
||||
In the following example, there is a basic review app setup that creates a new environment
|
||||
per merge request. The `review_app` job is triggered by every push and
|
||||
creates or updates an environment named `review/your-branch-name`.
|
||||
The environment keeps running until `stop_review_app` is executed:
|
||||
|
||||
```yaml
|
||||
review_app:
|
||||
script: deploy-review-app
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
on_stop: stop_review_app
|
||||
auto_stop_in: 1 week
|
||||
|
||||
stop_review_app:
|
||||
script: stop-review-app
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
action: stop
|
||||
when: manual
|
||||
```
|
||||
|
||||
As long as a merge request is active and keeps getting new commits,
|
||||
the review app will not stop, so developers don't need to worry about
|
||||
re-initiating review app.
|
||||
|
||||
On the other hand, since `stop_review_app` is set to `auto_stop_in: 1 week`,
|
||||
if a merge request becomes inactive for more than a week,
|
||||
GitLab automatically triggers the `stop_review_app` job to stop the environment.
|
||||
|
||||
You can also check the expiration date of environments through the GitLab UI. To do so,
|
||||
go to **Operations > Environments > Environment**. You can see the auto-stop period
|
||||
at the left-top section and a pin-mark button at the right-top section. This pin-mark
|
||||
button can be used to prevent auto-stopping the environment. By clicking this button, the `auto_stop_in` setting is over-written
|
||||
and the environment will be active until it's stopped manually.
|
||||
|
||||
![Environment auto stop](img/environment_auto_stop_v12_8.png)
|
||||
|
||||
NOTE: **NOTE**
|
||||
Due to the resource limitation, a background worker for stopping environments only
|
||||
runs once every hour. This means environments will not be stopped at the exact
|
||||
timestamp as the specified period, but will be stopped when the hourly cron worker
|
||||
detects expired environments.
|
||||
|
||||
#### Delete a stopped environment
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22629) in GitLab 12.9.
|
||||
|
||||
You can delete [stopped environments](#stopping-an-environment) in one of two
|
||||
ways: through the GitLab UI or through the API.
|
||||
|
||||
##### Delete environments through the UI
|
||||
|
||||
To view the list of **Stopped** environments, navigate to **Operations > Environments**
|
||||
and click the **Stopped** tab.
|
||||
|
||||
From there, you can click the **Delete** button directly, or you can click the
|
||||
environment name to see its details and **Delete** it from there.
|
||||
|
||||
You can also delete environments by viewing the details for a
|
||||
stopped environment:
|
||||
|
||||
1. Navigate to **Operations > Environments**.
|
||||
1. Click on the name of an environment within the **Stopped** environments list.
|
||||
1. Click on the **Delete** button that appears at the top for all stopped environments.
|
||||
1. Finally, confirm your chosen environment in the modal that appears to delete it.
|
||||
|
||||
##### Delete environments through the API
|
||||
|
||||
Environments can also be deleted by using the [Environments API](../api/environments.md#delete-an-environment).
|
||||
|
||||
### Grouping similar environments
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7015) in GitLab 8.14.
|
||||
|
||||
As documented in [Configuring dynamic environments](#configuring-dynamic-environments), you can
|
||||
prepend environment name with a word, followed by a `/`, and finally the branch
|
||||
name, which is automatically defined by the `CI_COMMIT_REF_NAME` variable.
|
||||
|
||||
In short, environments that are named like `type/foo` are all presented under the same
|
||||
group, named `type`.
|
||||
|
||||
In our [minimal example](#example-configuration), we named the environments `review/$CI_COMMIT_REF_NAME`
|
||||
where `$CI_COMMIT_REF_NAME` is the branch name. Here is a snippet of the example:
|
||||
|
||||
```yaml
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
```
|
||||
|
||||
In this case, if you visit the **Environments** page and the branches
|
||||
exist, you should see something like:
|
||||
|
||||
![Environment groups](img/environments_dynamic_groups.png)
|
||||
|
||||
### Monitoring environments
|
||||
|
||||
If you have enabled [Prometheus for monitoring system and response metrics](../user/project/integrations/prometheus.md),
|
||||
you can monitor the behavior of your app running in each environment. For the monitoring
|
||||
dashboard to appear, you need to Configure Prometheus to collect at least one
|
||||
[supported metric](../user/project/integrations/prometheus_library/index.md).
|
||||
|
||||
NOTE: **Note:**
|
||||
Since GitLab 9.2, all deployments to an environment are shown directly on the monitoring dashboard.
|
||||
|
||||
Once configured, GitLab will attempt to retrieve [supported performance metrics](../user/project/integrations/prometheus_library/index.md)
|
||||
for any environment that has had a successful deployment. If monitoring data was
|
||||
successfully retrieved, a **Monitoring** button will appear for each environment.
|
||||
|
||||
![Environment Detail with Metrics](img/deployments_view.png)
|
||||
|
||||
Clicking on the **Monitoring** button will display a new page showing up to the last
|
||||
8 hours of performance data. It may take a minute or two for data to appear
|
||||
after initial deployment.
|
||||
|
||||
All deployments to an environment are shown directly on the monitoring dashboard,
|
||||
which allows easy correlation between any changes in performance and new
|
||||
versions of the app, all without leaving GitLab.
|
||||
|
||||
![Monitoring dashboard](img/environments_monitoring.png)
|
||||
|
||||
#### Linking to external dashboard
|
||||
|
||||
Add a [button to the Monitoring dashboard](../user/project/operations/linking_to_an_external_dashboard.md) linking directly to your existing external dashboards.
|
||||
|
||||
#### Embedding metrics in GitLab Flavored Markdown
|
||||
|
||||
Metric charts can be embedded within GitLab Flavored Markdown. See [Embedding Metrics within GitLab Flavored Markdown](../user/project/integrations/prometheus.md#embedding-metric-charts-within-gitlab-flavored-markdown) for more details.
|
||||
|
||||
### Web terminals
|
||||
|
||||
> Web terminals were added in GitLab 8.15 and are only available to project Maintainers and Owners.
|
||||
|
||||
If you deploy to your environments with the help of a deployment service (for example,
|
||||
the [Kubernetes integration](../user/project/clusters/index.md)), GitLab can open
|
||||
a terminal session to your environment.
|
||||
|
||||
This is a powerful feature that allows you to debug issues without leaving the comfort
|
||||
of your web browser. To enable it, just follow the instructions given in the service integration
|
||||
documentation.
|
||||
|
||||
Once enabled, your environments will gain a "terminal" button:
|
||||
|
||||
![Terminal button on environment index](img/environments_terminal_button_on_index.png)
|
||||
|
||||
You can also access the terminal button from the page for a specific environment:
|
||||
|
||||
![Terminal button for an environment](img/environments_terminal_button_on_show.png)
|
||||
|
||||
Wherever you find it, clicking the button will take you to a separate page to
|
||||
establish the terminal session:
|
||||
|
||||
![Terminal page](img/environments_terminal_page.png)
|
||||
|
||||
This works just like any other terminal. You'll be in the container created
|
||||
by your deployment so you can:
|
||||
|
||||
- Run shell commands and get responses in real time.
|
||||
- Check the logs.
|
||||
- Try out configuration or code tweaks etc.
|
||||
|
||||
You can open multiple terminals to the same environment, they each get their own shell
|
||||
session and even a multiplexer like `screen` or `tmux`.
|
||||
|
||||
NOTE: **Note:**
|
||||
Container-based deployments often lack basic tools (like an editor), and may
|
||||
be stopped or restarted at any time. If this happens, you will lose all your
|
||||
changes. Treat this as a debugging tool, not a comprehensive online IDE.
|
||||
|
||||
### Check out deployments locally
|
||||
|
||||
Since GitLab 8.13, a reference in the Git repository is saved for each deployment, so
|
||||
knowing the state of your current environments is only a `git fetch` away.
|
||||
|
||||
In your Git configuration, append the `[remote "<your-remote>"]` block with an extra
|
||||
fetch line:
|
||||
|
||||
```text
|
||||
fetch = +refs/environments/*:refs/remotes/origin/environments/*
|
||||
```
|
||||
|
||||
### Scoping environments with specs
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2112) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.4.
|
||||
> - [Scoping for environment variables was moved to Core](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30779) to Core in GitLab 12.2.
|
||||
|
||||
You can limit the environment scope of a variable by
|
||||
defining which environments it can be available for.
|
||||
|
||||
Wildcards can be used, and the default environment scope is `*`, which means
|
||||
any jobs will have this variable, not matter if an environment is defined or
|
||||
not.
|
||||
|
||||
For example, if the environment scope is `production`, then only the jobs
|
||||
having the environment `production` defined would have this specific variable.
|
||||
Wildcards (`*`) can be used along with the environment name, therefore if the
|
||||
environment scope is `review/*` then any jobs with environment names starting
|
||||
with `review/` would have that particular variable.
|
||||
|
||||
Some GitLab features can behave differently for each environment.
|
||||
For example, you can
|
||||
[create a secret variable to be injected only into a production environment](variables/README.md#limit-the-environment-scopes-of-environment-variables).
|
||||
|
||||
In most cases, these features use the _environment specs_ mechanism, which offers
|
||||
an efficient way to implement scoping within each environment group.
|
||||
|
||||
Let's say there are four environments:
|
||||
|
||||
- `production`
|
||||
- `staging`
|
||||
- `review/feature-1`
|
||||
- `review/feature-2`
|
||||
|
||||
Each environment can be matched with the following environment spec:
|
||||
|
||||
| Environment Spec | `production` | `staging` | `review/feature-1` | `review/feature-2` |
|
||||
|:-----------------|:-------------|:----------|:-------------------|:-------------------|
|
||||
| * | Matched | Matched | Matched | Matched |
|
||||
| production | Matched | | | |
|
||||
| staging | | Matched | | |
|
||||
| review/* | | | Matched | Matched |
|
||||
| review/feature-1 | | | Matched | |
|
||||
|
||||
As you can see, you can use specific matching for selecting a particular environment,
|
||||
and also use wildcard matching (`*`) for selecting a particular environment group,
|
||||
such as [Review Apps](review_apps/index.md) (`review/*`).
|
||||
|
||||
NOTE: **Note:**
|
||||
The most _specific_ spec takes precedence over the other wildcard matching.
|
||||
In this case, `review/feature-1` spec takes precedence over `review/*` and `*` specs.
|
||||
|
||||
### Environments Dashboard **(PREMIUM)**
|
||||
|
||||
See [Environments Dashboard](environments/environments_dashboard.md) for a summary of each
|
||||
environment's operational health.
|
||||
|
||||
## Limitations
|
||||
|
||||
In the `environment: name`, you are limited to only the [predefined environment variables](variables/predefined_variables.md).
|
||||
Re-using variables defined inside `script` as part of the environment name will not work.
|
||||
|
||||
## Further reading
|
||||
|
||||
Below are some links you may find interesting:
|
||||
|
||||
- [The `.gitlab-ci.yml` definition of environments](yaml/README.md#environment)
|
||||
- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
|
||||
- [Review Apps - Use dynamic environments to deploy your code for every branch](review_apps/index.md)
|
||||
- [Deploy Boards for your applications running on Kubernetes](../user/project/deploy_boards.md) **(PREMIUM)**
|
||||
|
||||
<!-- ## Troubleshooting
|
||||
|
||||
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
|
||||
one might have when setting this up, or when something is changed, or on upgrading, it's
|
||||
important to describe those, too. Think of things that may go wrong and include them here.
|
||||
This is important to minimize requests for support, and to avoid doc comments with
|
||||
questions that you know someone might ask.
|
||||
|
||||
Each scenario can be a third-level heading, e.g. `### Getting error message X`.
|
||||
If you have none to add when creating a doc, leave this section in place
|
||||
but commented out to help encourage others to add to it in the future. -->
|
||||
This document was moved to [another location](environments/index.md).
|
||||
|
|
|
@ -0,0 +1,988 @@
|
|||
---
|
||||
type: reference
|
||||
disqus_identifier: 'https://docs.gitlab.com/ee/ci/environments.html'
|
||||
---
|
||||
|
||||
# Environments and deployments
|
||||
|
||||
> Introduced in GitLab 8.9.
|
||||
|
||||
Environments allow control of the continuous deployment of your software,
|
||||
all within GitLab.
|
||||
|
||||
## Introduction
|
||||
|
||||
There are many stages required in the software development process before the software is ready
|
||||
for public consumption.
|
||||
|
||||
For example:
|
||||
|
||||
1. Develop your code.
|
||||
1. Test your code.
|
||||
1. Deploy your code into a testing or staging environment before you release it to the public.
|
||||
|
||||
This helps find bugs in your software, and also in the deployment process as well.
|
||||
|
||||
GitLab CI/CD is capable of not only testing or building your projects, but also
|
||||
deploying them in your infrastructure, with the added benefit of giving you a
|
||||
way to track your deployments. In other words, you will always know what is
|
||||
currently being deployed or has been deployed on your servers.
|
||||
|
||||
It's important to know that:
|
||||
|
||||
- Environments are like tags for your CI jobs, describing where code gets deployed.
|
||||
- Deployments are created when [jobs](../yaml/README.md#introduction) deploy versions of code to environments,
|
||||
so every environment can have one or more deployments.
|
||||
|
||||
GitLab:
|
||||
|
||||
- Provides a full history of your deployments for each environment.
|
||||
- Keeps track of your deployments, so you always know what is currently being deployed on your
|
||||
servers.
|
||||
|
||||
If you have a deployment service such as [Kubernetes](../../user/project/clusters/index.md)
|
||||
associated with your project, you can use it to assist with your deployments, and
|
||||
can even access a [web terminal](#web-terminals) for your environment from within GitLab!
|
||||
|
||||
## Configuring environments
|
||||
|
||||
Configuring environments involves:
|
||||
|
||||
1. Understanding how [pipelines](../pipelines/index.md) work.
|
||||
1. Defining environments in your project's [`.gitlab-ci.yml`](../yaml/README.md) file.
|
||||
1. Creating a job configured to deploy your application. For example, a deploy job configured with [`environment`](../yaml/README.md#environment) to deploy your application to a [Kubernetes cluster](../../user/project/clusters/index.md).
|
||||
|
||||
The rest of this section illustrates how to configure environments and deployments using
|
||||
an example scenario. It assumes you have already:
|
||||
|
||||
- Created a [project](../../gitlab-basics/create-project.md) in GitLab.
|
||||
- Set up [a Runner](../runners/README.md).
|
||||
|
||||
In the scenario:
|
||||
|
||||
- We are developing an application.
|
||||
- We want to run tests and build our app on all branches.
|
||||
- Our default branch is `master`.
|
||||
- We deploy the app only when a pipeline on `master` branch is run.
|
||||
|
||||
### Defining environments
|
||||
|
||||
Let's consider the following `.gitlab-ci.yml` example:
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- deploy
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script: echo "Running tests"
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script: echo "Building the app"
|
||||
|
||||
deploy_staging:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to staging server"
|
||||
environment:
|
||||
name: staging
|
||||
url: https://staging.example.com
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
We have defined three [stages](../yaml/README.md#stages):
|
||||
|
||||
- `test`
|
||||
- `build`
|
||||
- `deploy`
|
||||
|
||||
The jobs assigned to these stages will run in this order. If any job fails, then
|
||||
the pipeline fails and jobs that are assigned to the next stage won't run.
|
||||
|
||||
In our case:
|
||||
|
||||
- The `test` job will run first.
|
||||
- Then the `build` job.
|
||||
- Lastly the `deploy_staging` job.
|
||||
|
||||
With this configuration, we:
|
||||
|
||||
- Check that the tests pass.
|
||||
- Ensure that our app is able to be built successfully.
|
||||
- Lastly we deploy to the staging server.
|
||||
|
||||
NOTE: **Note:**
|
||||
The `environment` keyword defines where the app is deployed.
|
||||
The environment `name` and `url` is exposed in various places
|
||||
within GitLab. Each time a job that has an environment specified
|
||||
succeeds, a deployment is recorded, along with the Git SHA, and environment name.
|
||||
|
||||
CAUTION: **Caution**:
|
||||
Some characters are not allowed in environment names. Use only letters,
|
||||
numbers, spaces, and `-`, `_`, `/`, `{`, `}`, or `.`. Also, it must not start nor end with `/`.
|
||||
|
||||
In summary, with the above `.gitlab-ci.yml` we have achieved the following:
|
||||
|
||||
- All branches will run the `test` and `build` jobs.
|
||||
- The `deploy_staging` job will run [only](../yaml/README.md#onlyexcept-basic) on the `master`
|
||||
branch, which means all merge requests that are created from branches don't
|
||||
get deployed to the staging server.
|
||||
- When a merge request is merged, all jobs will run and the `deploy_staging`
|
||||
job will deploy our code to a staging server while the deployment
|
||||
will be recorded in an environment named `staging`.
|
||||
|
||||
#### Environment variables and Runner
|
||||
|
||||
Starting with GitLab 8.15, the environment name is exposed to the Runner in
|
||||
two forms:
|
||||
|
||||
- `$CI_ENVIRONMENT_NAME`. The name given in `.gitlab-ci.yml` (with any variables
|
||||
expanded).
|
||||
- `$CI_ENVIRONMENT_SLUG`. A "cleaned-up" version of the name, suitable for use in URLs,
|
||||
DNS, etc.
|
||||
|
||||
If you change the name of an existing environment, the:
|
||||
|
||||
- `$CI_ENVIRONMENT_NAME` variable will be updated with the new environment name.
|
||||
- `$CI_ENVIRONMENT_SLUG` variable will remain unchanged to prevent unintended side
|
||||
effects.
|
||||
|
||||
Starting with GitLab 9.3, the environment URL is exposed to the Runner via
|
||||
`$CI_ENVIRONMENT_URL`. The URL is expanded from either:
|
||||
|
||||
- `.gitlab-ci.yml`.
|
||||
- The external URL from the environment if not defined in `.gitlab-ci.yml`.
|
||||
|
||||
#### Set dynamic environment URLs after a job finishes
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/17066) in GitLab 12.9.
|
||||
|
||||
In a job script, you can specify a static [environment URL](#using-the-environment-url).
|
||||
However, there may be times when you want a dynamic URL. For example,
|
||||
if you deploy a Review App to an external hosting
|
||||
service that generates a random URL per deployment, like `https://94dd65b.amazonaws.com/qa-lambda-1234567`,
|
||||
you don't know the URL before the deployment script finishes.
|
||||
If you want to use the environment URL in GitLab, you would have to update it manually.
|
||||
|
||||
To address this problem, you can configure a deployment job to report back a set of
|
||||
variables, including the URL that was dynamically-generated by the external service.
|
||||
GitLab supports [dotenv](https://github.com/bkeepers/dotenv) file as the format,
|
||||
and expands the `environment:url` value with variables defined in the dotenv file.
|
||||
|
||||
To use this feature, specify the
|
||||
[`artifacts:reports:dotenv`](../pipelines/job_artifacts.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
|
||||
|
||||
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
|
||||
For an overview, see [Set dynamic URLs after a job finished](https://youtu.be/70jDXtOf4Ig).
|
||||
|
||||
##### Example of setting dynamic environment URLs
|
||||
|
||||
The following example shows a Review App that creates a new environment
|
||||
per merge request. The `review` job is triggered by every push, and
|
||||
creates or updates an environment named `review/your-branch-name`.
|
||||
The environment URL is set to `$DYNAMIC_ENVIRONMENT_URL`:
|
||||
|
||||
```yaml
|
||||
review:
|
||||
script:
|
||||
- DYNAMIC_ENVIRONMENT_URL=$(deploy-script) # In script, get the environment URL.
|
||||
- echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> deploy.env # Add the value to a dotenv file.
|
||||
artifacts:
|
||||
reports:
|
||||
dotenv: deploy.env # Report back dotenv file to rails.
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_SLUG
|
||||
url: $DYNAMIC_ENVIRONMENT_URL # and set the variable produced in script to `environment:url`
|
||||
on_stop: stop_review
|
||||
|
||||
stop_review:
|
||||
script:
|
||||
- ./teardown-environment
|
||||
when: manual
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_SLUG
|
||||
action: stop
|
||||
```
|
||||
|
||||
As soon as the `review` job finishes, GitLab updates the `review/your-branch-name`
|
||||
environment's URL.
|
||||
It parses the report artifact `deploy.env`, registers a list of variables as runtime-created,
|
||||
uses it for expanding `environment:url: $DYNAMIC_ENVIRONMENT_URL` and sets it to the environment URL.
|
||||
You can also specify a static part of the URL at `environment:url:`, such as
|
||||
`https://$DYNAMIC_ENVIRONMENT_URL`. If the value of `DYNAMIC_ENVIRONMENT_URL` is
|
||||
`123.awesome.com`, the final result will be `https://123.awesome.com`.
|
||||
|
||||
The assigned URL for the `review/your-branch-name` environment is visible in the UI.
|
||||
[See where the environment URL is displayed](#using-the-environment-url).
|
||||
|
||||
> **Notes:**
|
||||
>
|
||||
> - `stop_review` doesn't generate a dotenv report artifact, so it won't recognize the `DYNAMIC_ENVIRONMENT_URL` variable. Therefore you should not set `environment:url:` in the `stop_review` job.
|
||||
> - If the environment URL is not valid (for example, the URL is malformed), the system doesn't update the environment URL.
|
||||
|
||||
### Configuring manual deployments
|
||||
|
||||
Adding `when: manual` to an automatically executed job's configuration converts it to
|
||||
a job requiring manual action.
|
||||
|
||||
To expand on the [previous example](#defining-environments), the following includes
|
||||
another job that deploys our app to a production server and is
|
||||
tracked by a `production` environment.
|
||||
|
||||
The `.gitlab-ci.yml` file for this is as follows:
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- deploy
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script: echo "Running tests"
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script: echo "Building the app"
|
||||
|
||||
deploy_staging:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to staging server"
|
||||
environment:
|
||||
name: staging
|
||||
url: https://staging.example.com
|
||||
only:
|
||||
- master
|
||||
|
||||
deploy_prod:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to production server"
|
||||
environment:
|
||||
name: production
|
||||
url: https://example.com
|
||||
when: manual
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
The `when: manual` action:
|
||||
|
||||
- Exposes a "play" button in GitLab's UI for that job.
|
||||
- Means the `deploy_prod` job will only be triggered when the "play" button is clicked.
|
||||
|
||||
You can find the "play" button in the pipelines, environments, deployments, and jobs views.
|
||||
|
||||
| View | Screenshot |
|
||||
|:----------------|:-------------------------------------------------------------------------------|
|
||||
| Pipelines | ![Pipelines manual action](../img/environments_manual_action_pipelines.png) |
|
||||
| Single pipeline | ![Pipelines manual action](../img/environments_manual_action_single_pipeline.png) |
|
||||
| Environments | ![Environments manual action](../img/environments_manual_action_environments.png) |
|
||||
| Deployments | ![Deployments manual action](../img/environments_manual_action_deployments.png) |
|
||||
| Jobs | ![Builds manual action](../img/environments_manual_action_jobs.png) |
|
||||
|
||||
Clicking on the play button in any view will trigger the `deploy_prod` job, and the
|
||||
deployment will be recorded as a new environment named `production`.
|
||||
|
||||
NOTE: **Note:**
|
||||
If your environment's name is `production` (all lowercase),
|
||||
it will get recorded in [Value Stream Analytics](../../user/project/cycle_analytics.md).
|
||||
|
||||
### Configuring dynamic environments
|
||||
|
||||
Regular environments are good when deploying to "stable" environments like staging or production.
|
||||
|
||||
However, for environments for branches other than `master`, dynamic environments
|
||||
can be used. Dynamic environments make it possible to create environments on the fly by
|
||||
declaring their names dynamically in `.gitlab-ci.yml`.
|
||||
|
||||
Dynamic environments are a fundamental part of [Review apps](../review_apps/index.md).
|
||||
|
||||
### Configuring incremental rollouts
|
||||
|
||||
Learn how to release production changes to only a portion of your Kubernetes pods with
|
||||
[incremental rollouts](../environments/incremental_rollouts.md).
|
||||
|
||||
#### Allowed variables
|
||||
|
||||
The `name` and `url` parameters for dynamic environments can use most available CI/CD variables,
|
||||
including:
|
||||
|
||||
- [Predefined environment variables](../variables/README.md#predefined-environment-variables)
|
||||
- [Project and group variables](../variables/README.md#gitlab-cicd-environment-variables)
|
||||
- [`.gitlab-ci.yml` variables](../yaml/README.md#variables)
|
||||
|
||||
However, you cannot use variables defined:
|
||||
|
||||
- Under `script`.
|
||||
- On the Runner's side.
|
||||
|
||||
There are also other variables that are unsupported in the context of `environment:name`.
|
||||
For more information, see [Where variables can be used](../variables/where_variables_can_be_used.md).
|
||||
|
||||
#### Example configuration
|
||||
|
||||
GitLab Runner exposes various [environment variables](../variables/README.md) when a job runs, so
|
||||
you can use them as environment names.
|
||||
|
||||
In the following example, the job will deploy to all branches except `master`:
|
||||
|
||||
```yaml
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_ENVIRONMENT_SLUG.example.com
|
||||
only:
|
||||
- branches
|
||||
except:
|
||||
- master
|
||||
```
|
||||
|
||||
In this example:
|
||||
|
||||
- The job's name is `deploy_review` and it runs on the `deploy` stage.
|
||||
- We set the `environment` with the `environment:name` as `review/$CI_COMMIT_REF_NAME`.
|
||||
Since the [environment name](../yaml/README.md#environmentname) can contain slashes (`/`), we can
|
||||
use this pattern to distinguish between dynamic and regular environments.
|
||||
- We tell the job to run [`only`](../yaml/README.md#onlyexcept-basic) on branches,
|
||||
[`except`](../yaml/README.md#onlyexcept-basic) `master`.
|
||||
|
||||
For the value of:
|
||||
|
||||
- `environment:name`, the first part is `review`, followed by a `/` and then `$CI_COMMIT_REF_NAME`,
|
||||
which receives the value of the branch name.
|
||||
- `environment:url`, we want a specific and distinct URL for each branch. `$CI_COMMIT_REF_NAME`
|
||||
may contain a `/` or other characters that would be invalid in a domain name or URL,
|
||||
so we use `$CI_ENVIRONMENT_SLUG` to guarantee that we get a valid URL.
|
||||
|
||||
For example, given a `$CI_COMMIT_REF_NAME` of `100-Do-The-Thing`, the URL will be something
|
||||
like `https://100-do-the-4f99a2.example.com`. Again, the way you set up
|
||||
the web server to serve these requests is based on your setup.
|
||||
|
||||
We have used `$CI_ENVIRONMENT_SLUG` here because it is guaranteed to be unique. If
|
||||
you're using a workflow like [GitLab Flow](../../topics/gitlab_flow.md), collisions
|
||||
are unlikely and you may prefer environment names to be more closely based on the
|
||||
branch name. In that case, you could use `$CI_COMMIT_REF_NAME` in `environment:url` in
|
||||
the example above: `https://$CI_COMMIT_REF_NAME.example.com`, which would give a URL
|
||||
of `https://100-do-the-thing.example.com`.
|
||||
|
||||
NOTE: **Note:**
|
||||
You are not required to use the same prefix or only slashes (`/`) in the dynamic environments'
|
||||
names. However, using this format will enable the [grouping similar environments](#grouping-similar-environments)
|
||||
feature.
|
||||
|
||||
### Configuring Kubernetes deployments
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/27630) in GitLab 12.6.
|
||||
|
||||
If you are deploying to a [Kubernetes cluster](../../user/project/clusters/index.md)
|
||||
associated with your project, you can configure these deployments from your
|
||||
`gitlab-ci.yml` file.
|
||||
|
||||
The following configuration options are supported:
|
||||
|
||||
- [`namespace`](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)
|
||||
|
||||
In the following example, the job will deploy your application to the
|
||||
`production` Kubernetes namespace.
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to production server"
|
||||
environment:
|
||||
name: production
|
||||
url: https://example.com
|
||||
kubernetes:
|
||||
namespace: production
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
When deploying to a Kubernetes cluster using GitLab's Kubernetes integration,
|
||||
information about the cluster and namespace will be displayed above the job
|
||||
trace on the deployment job page:
|
||||
|
||||
![Deployment cluster information](../img/environments_deployment_cluster_v12_8.png)
|
||||
|
||||
NOTE: **Note:**
|
||||
Kubernetes configuration is not supported for Kubernetes clusters
|
||||
that are [managed by GitLab](../../user/project/clusters/index.md#gitlab-managed-clusters).
|
||||
To follow progress on support for GitLab-managed clusters, see the
|
||||
[relevant issue](https://gitlab.com/gitlab-org/gitlab/issues/38054).
|
||||
|
||||
### Complete example
|
||||
|
||||
The configuration in this section provides a full development workflow where your app is:
|
||||
|
||||
- Tested.
|
||||
- Built.
|
||||
- Deployed as a Review App.
|
||||
- Deployed to a staging server once the merge request is merged.
|
||||
- Finally, able to be manually deployed to the production server.
|
||||
|
||||
The following combines the previous configuration examples, including:
|
||||
|
||||
- Defining [simple environments](#defining-environments) for testing, building, and deployment to staging.
|
||||
- Adding [manual actions](#configuring-manual-deployments) for deployment to production.
|
||||
- Creating [dynamic environments](#configuring-dynamic-environments) for deployments for reviewing.
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- deploy
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script: echo "Running tests"
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script: echo "Building the app"
|
||||
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_ENVIRONMENT_SLUG.example.com
|
||||
only:
|
||||
- branches
|
||||
except:
|
||||
- master
|
||||
|
||||
deploy_staging:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to staging server"
|
||||
environment:
|
||||
name: staging
|
||||
url: https://staging.example.com
|
||||
only:
|
||||
- master
|
||||
|
||||
deploy_prod:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy to production server"
|
||||
environment:
|
||||
name: production
|
||||
url: https://example.com
|
||||
when: manual
|
||||
only:
|
||||
- master
|
||||
```
|
||||
|
||||
A more realistic example would also include copying files to a location where a
|
||||
webserver (for example, NGINX) could then access and serve them.
|
||||
|
||||
The example below will copy the `public` directory to `/srv/nginx/$CI_COMMIT_REF_SLUG/public`:
|
||||
|
||||
```yaml
|
||||
review_app:
|
||||
stage: deploy
|
||||
script:
|
||||
- rsync -av --delete public /srv/nginx/$CI_COMMIT_REF_SLUG
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_COMMIT_REF_SLUG.example.com
|
||||
```
|
||||
|
||||
This example requires that NGINX and GitLab Runner are set up on the server this job will run on.
|
||||
|
||||
NOTE: **Note:**
|
||||
See the [limitations](#limitations) section for some edge cases regarding the naming of
|
||||
your branches and Review Apps.
|
||||
|
||||
The complete example provides the following workflow to developers:
|
||||
|
||||
- Create a branch locally.
|
||||
- Make changes and commit them.
|
||||
- Push the branch to GitLab.
|
||||
- Create a merge request.
|
||||
|
||||
Behind the scenes, GitLab Runner will:
|
||||
|
||||
- Pick up the changes and start running the jobs.
|
||||
- Run the jobs sequentially as defined in `stages`:
|
||||
- First, run the tests.
|
||||
- If the tests succeed, build the app.
|
||||
- If the build succeeds, the app is deployed to an environment with a name specific to the
|
||||
branch.
|
||||
|
||||
So now, every branch:
|
||||
|
||||
- Gets its own environment.
|
||||
- Is deployed to its own unique location, with the added benefit of:
|
||||
- Having a [history of deployments](#viewing-deployment-history).
|
||||
- Being able to [rollback changes](#retrying-and-rolling-back) if needed.
|
||||
|
||||
For more information, see [Using the environment URL](#using-the-environment-url).
|
||||
|
||||
### Protected environments
|
||||
|
||||
Environments can be "protected", restricting access to them.
|
||||
|
||||
For more information, see [Protected environments](protected_environments.md).
|
||||
|
||||
## Working with environments
|
||||
|
||||
Once environments are configured, GitLab provides many features for working with them,
|
||||
as documented below.
|
||||
|
||||
### Viewing environments and deployments
|
||||
|
||||
A list of environments and deployment statuses is available on each project's **Operations > Environments** page.
|
||||
|
||||
For example:
|
||||
|
||||
![Environment view](../img/environments_available.png)
|
||||
|
||||
This example shows:
|
||||
|
||||
- The environment's name with a link to its deployments.
|
||||
- The last deployment ID number and who performed it.
|
||||
- The job ID of the last deployment with its respective job name.
|
||||
- The commit information of the last deployment, such as who committed it, to what
|
||||
branch, and the Git SHA of the commit.
|
||||
- The exact time the last deployment was performed.
|
||||
- A button that takes you to the URL that you defined under the `environment` keyword
|
||||
in `.gitlab-ci.yml`.
|
||||
- A button that re-deploys the latest deployment, meaning it runs the job
|
||||
defined by the environment name for that specific commit.
|
||||
|
||||
The information shown in the **Environments** page is limited to the latest
|
||||
deployments, but an environment can have multiple deployments.
|
||||
|
||||
> **Notes:**
|
||||
>
|
||||
> - While you can create environments manually in the web interface, we recommend
|
||||
> that you define your environments in `.gitlab-ci.yml` first. They will
|
||||
> be automatically created for you after the first deploy.
|
||||
> - The environments page can only be viewed by users with [Reporter permission](../../user/permissions.md#project-members-permissions)
|
||||
> and above. For more information on permissions, see the [permissions documentation](../../user/permissions.md).
|
||||
> - Only deploys that happen after your `.gitlab-ci.yml` is properly configured
|
||||
> will show up in the **Environment** and **Last deployment** lists.
|
||||
|
||||
### Viewing deployment history
|
||||
|
||||
GitLab keeps track of your deployments, so you:
|
||||
|
||||
- Always know what is currently being deployed on your servers.
|
||||
- Can have the full history of your deployments for every environment.
|
||||
|
||||
Clicking on an environment shows the history of its deployments. Here's an example **Environments** page
|
||||
with multiple deployments:
|
||||
|
||||
![Deployments](../img/deployments_view.png)
|
||||
|
||||
This view is similar to the **Environments** page, but all deployments are shown. Also in this view
|
||||
is a **Rollback** button. For more information, see [Retrying and rolling back](#retrying-and-rolling-back).
|
||||
|
||||
### Retrying and rolling back
|
||||
|
||||
If there is a problem with a deployment, you can retry it or roll it back.
|
||||
|
||||
To retry or rollback a deployment:
|
||||
|
||||
1. Navigate to **Operations > Environments**.
|
||||
1. Click on the environment.
|
||||
1. In the deployment history list for the environment, click the:
|
||||
- **Retry** button next to the last deployment, to retry that deployment.
|
||||
- **Rollback** button next to a previously successful deployment, to roll back to that deployment.
|
||||
|
||||
#### What to expect with a rollback
|
||||
|
||||
Pressing the **Rollback** button on a specific commit will trigger a _new_ deployment with its
|
||||
own unique job ID.
|
||||
|
||||
This means that you will see a new deployment that points to the commit you are rolling back to.
|
||||
|
||||
NOTE: **Note:**
|
||||
The defined deployment process in the job's `script` determines whether the rollback succeeds or not.
|
||||
|
||||
### Using the environment URL
|
||||
|
||||
The [environment URL](../yaml/README.md#environmenturl) is exposed in a few
|
||||
places within GitLab:
|
||||
|
||||
- In a merge request widget as a link:
|
||||
![Environment URL in merge request](../img/environments_mr_review_app.png)
|
||||
- In the Environments view as a button:
|
||||
![Environment URL in environments](../img/environments_available.png)
|
||||
- In the Deployments view as a button:
|
||||
![Environment URL in deployments](../img/deployments_view.png)
|
||||
|
||||
You can see this information in a merge request itself if:
|
||||
|
||||
- The merge request is eventually merged to the default branch (usually `master`).
|
||||
- That branch also deploys to an environment (for example, `staging` or `production`).
|
||||
|
||||
For example:
|
||||
|
||||
![Environment URLs in merge request](../img/environments_link_url_mr.png)
|
||||
|
||||
#### Going from source files to public pages
|
||||
|
||||
With GitLab's [Route Maps](../review_apps/index.md#route-maps) you can go directly
|
||||
from source files to public pages in the environment set for Review Apps.
|
||||
|
||||
### Stopping an environment
|
||||
|
||||
Stopping an environment:
|
||||
|
||||
- Moves it from the list of **Available** environments to the list of **Stopped**
|
||||
environments on the [**Environments** page](#viewing-environments-and-deployments).
|
||||
- Executes an [`on_stop` action](../yaml/README.md#environmenton_stop), if defined.
|
||||
|
||||
This is often used when multiple developers are working on a project at the same time,
|
||||
each of them pushing to their own branches, causing many dynamic environments to be created.
|
||||
|
||||
NOTE: **Note:**
|
||||
Starting with GitLab 8.14, dynamic environments are stopped automatically
|
||||
when their associated branch is deleted.
|
||||
|
||||
#### Automatically stopping an environment
|
||||
|
||||
Environments can be stopped automatically using special configuration.
|
||||
|
||||
Consider the following example where the `deploy_review` job calls `stop_review`
|
||||
to clean up and stop the environment:
|
||||
|
||||
```yaml
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://$CI_ENVIRONMENT_SLUG.example.com
|
||||
on_stop: stop_review
|
||||
only:
|
||||
- branches
|
||||
except:
|
||||
- master
|
||||
|
||||
stop_review:
|
||||
stage: deploy
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
script:
|
||||
- echo "Remove review app"
|
||||
when: manual
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
action: stop
|
||||
```
|
||||
|
||||
Setting the [`GIT_STRATEGY`](../yaml/README.md#git-strategy) to `none` is necessary in the
|
||||
`stop_review` job so that the [GitLab Runner](https://docs.gitlab.com/runner/) won't
|
||||
try to check out the code after the branch is deleted.
|
||||
|
||||
When you have an environment that has a stop action defined (typically when
|
||||
the environment describes a Review App), GitLab will automatically trigger a
|
||||
stop action when the associated branch is deleted. The `stop_review` job must
|
||||
be in the same `stage` as the `deploy_review` job in order for the environment
|
||||
to automatically stop.
|
||||
|
||||
You can read more in the [`.gitlab-ci.yml` reference](../yaml/README.md#environmenton_stop).
|
||||
|
||||
#### Environments auto-stop
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/20956) in GitLab 12.8.
|
||||
|
||||
You can set a expiry time to environments and stop them automatically after a certain period.
|
||||
|
||||
For example, consider the use of this feature with Review Apps environments.
|
||||
When you set up Review Apps, sometimes they keep running for a long time
|
||||
because some merge requests are left as open. An example for this situation is when the author of the merge
|
||||
request is not actively working on it, due to priority changes or a different approach was decided on, and the merge requests was simply forgotten.
|
||||
Idle environments waste resources, therefore they
|
||||
should be terminated as soon as possible.
|
||||
|
||||
To address this problem, you can specify an optional expiration date for
|
||||
Review Apps environments. When the expiry time is reached, GitLab will automatically trigger a job
|
||||
to stop the environment, eliminating the need of manually doing so. In case an environment is updated, the expiration is renewed
|
||||
ensuring that only active merge requests keep running Review Apps.
|
||||
|
||||
To enable this feature, you need to specify the [`environment:auto_stop_in`](../yaml/README.md#environmentauto_stop_in) keyword in `.gitlab-ci.yml`.
|
||||
You can specify a human-friendly date as the value, such as `1 hour and 30 minutes` or `1 day`.
|
||||
`auto_stop_in` uses the same format of [`artifacts:expire_in` docs](../yaml/README.md#artifactsexpire_in).
|
||||
|
||||
##### Auto-stop example
|
||||
|
||||
In the following example, there is a basic review app setup that creates a new environment
|
||||
per merge request. The `review_app` job is triggered by every push and
|
||||
creates or updates an environment named `review/your-branch-name`.
|
||||
The environment keeps running until `stop_review_app` is executed:
|
||||
|
||||
```yaml
|
||||
review_app:
|
||||
script: deploy-review-app
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
on_stop: stop_review_app
|
||||
auto_stop_in: 1 week
|
||||
|
||||
stop_review_app:
|
||||
script: stop-review-app
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
action: stop
|
||||
when: manual
|
||||
```
|
||||
|
||||
As long as a merge request is active and keeps getting new commits,
|
||||
the review app will not stop, so developers don't need to worry about
|
||||
re-initiating review app.
|
||||
|
||||
On the other hand, since `stop_review_app` is set to `auto_stop_in: 1 week`,
|
||||
if a merge request becomes inactive for more than a week,
|
||||
GitLab automatically triggers the `stop_review_app` job to stop the environment.
|
||||
|
||||
You can also check the expiration date of environments through the GitLab UI. To do so,
|
||||
go to **Operations > Environments > Environment**. You can see the auto-stop period
|
||||
at the left-top section and a pin-mark button at the right-top section. This pin-mark
|
||||
button can be used to prevent auto-stopping the environment. By clicking this button, the `auto_stop_in` setting is over-written
|
||||
and the environment will be active until it's stopped manually.
|
||||
|
||||
![Environment auto stop](../img/environment_auto_stop_v12_8.png)
|
||||
|
||||
NOTE: **NOTE**
|
||||
Due to the resource limitation, a background worker for stopping environments only
|
||||
runs once every hour. This means environments will not be stopped at the exact
|
||||
timestamp as the specified period, but will be stopped when the hourly cron worker
|
||||
detects expired environments.
|
||||
|
||||
#### Delete a stopped environment
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22629) in GitLab 12.9.
|
||||
|
||||
You can delete [stopped environments](#stopping-an-environment) in one of two
|
||||
ways: through the GitLab UI or through the API.
|
||||
|
||||
##### Delete environments through the UI
|
||||
|
||||
To view the list of **Stopped** environments, navigate to **Operations > Environments**
|
||||
and click the **Stopped** tab.
|
||||
|
||||
From there, you can click the **Delete** button directly, or you can click the
|
||||
environment name to see its details and **Delete** it from there.
|
||||
|
||||
You can also delete environments by viewing the details for a
|
||||
stopped environment:
|
||||
|
||||
1. Navigate to **Operations > Environments**.
|
||||
1. Click on the name of an environment within the **Stopped** environments list.
|
||||
1. Click on the **Delete** button that appears at the top for all stopped environments.
|
||||
1. Finally, confirm your chosen environment in the modal that appears to delete it.
|
||||
|
||||
##### Delete environments through the API
|
||||
|
||||
Environments can also be deleted by using the [Environments API](../../api/environments.md#delete-an-environment).
|
||||
|
||||
### Grouping similar environments
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7015) in GitLab 8.14.
|
||||
|
||||
As documented in [Configuring dynamic environments](#configuring-dynamic-environments), you can
|
||||
prepend environment name with a word, followed by a `/`, and finally the branch
|
||||
name, which is automatically defined by the `CI_COMMIT_REF_NAME` variable.
|
||||
|
||||
In short, environments that are named like `type/foo` are all presented under the same
|
||||
group, named `type`.
|
||||
|
||||
In our [minimal example](#example-configuration), we named the environments `review/$CI_COMMIT_REF_NAME`
|
||||
where `$CI_COMMIT_REF_NAME` is the branch name. Here is a snippet of the example:
|
||||
|
||||
```yaml
|
||||
deploy_review:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy a review app"
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
```
|
||||
|
||||
In this case, if you visit the **Environments** page and the branches
|
||||
exist, you should see something like:
|
||||
|
||||
![Environment groups](../img/environments_dynamic_groups.png)
|
||||
|
||||
### Monitoring environments
|
||||
|
||||
If you have enabled [Prometheus for monitoring system and response metrics](../../user/project/integrations/prometheus.md),
|
||||
you can monitor the behavior of your app running in each environment. For the monitoring
|
||||
dashboard to appear, you need to Configure Prometheus to collect at least one
|
||||
[supported metric](../../user/project/integrations/prometheus_library/index.md).
|
||||
|
||||
NOTE: **Note:**
|
||||
Since GitLab 9.2, all deployments to an environment are shown directly on the monitoring dashboard.
|
||||
|
||||
Once configured, GitLab will attempt to retrieve [supported performance metrics](../../user/project/integrations/prometheus_library/index.md)
|
||||
for any environment that has had a successful deployment. If monitoring data was
|
||||
successfully retrieved, a **Monitoring** button will appear for each environment.
|
||||
|
||||
![Environment Detail with Metrics](../img/deployments_view.png)
|
||||
|
||||
Clicking on the **Monitoring** button will display a new page showing up to the last
|
||||
8 hours of performance data. It may take a minute or two for data to appear
|
||||
after initial deployment.
|
||||
|
||||
All deployments to an environment are shown directly on the monitoring dashboard,
|
||||
which allows easy correlation between any changes in performance and new
|
||||
versions of the app, all without leaving GitLab.
|
||||
|
||||
![Monitoring dashboard](../img/environments_monitoring.png)
|
||||
|
||||
#### Linking to external dashboard
|
||||
|
||||
Add a [button to the Monitoring dashboard](../../user/project/operations/linking_to_an_external_dashboard.md) linking directly to your existing external dashboards.
|
||||
|
||||
#### Embedding metrics in GitLab Flavored Markdown
|
||||
|
||||
Metric charts can be embedded within GitLab Flavored Markdown. See [Embedding Metrics within GitLab Flavored Markdown](../../user/project/integrations/prometheus.md#embedding-metric-charts-within-gitlab-flavored-markdown) for more details.
|
||||
|
||||
### Web terminals
|
||||
|
||||
> Web terminals were added in GitLab 8.15 and are only available to project Maintainers and Owners.
|
||||
|
||||
If you deploy to your environments with the help of a deployment service (for example,
|
||||
the [Kubernetes integration](../../user/project/clusters/index.md)), GitLab can open
|
||||
a terminal session to your environment.
|
||||
|
||||
This is a powerful feature that allows you to debug issues without leaving the comfort
|
||||
of your web browser. To enable it, just follow the instructions given in the service integration
|
||||
documentation.
|
||||
|
||||
Once enabled, your environments will gain a "terminal" button:
|
||||
|
||||
![Terminal button on environment index](../img/environments_terminal_button_on_index.png)
|
||||
|
||||
You can also access the terminal button from the page for a specific environment:
|
||||
|
||||
![Terminal button for an environment](../img/environments_terminal_button_on_show.png)
|
||||
|
||||
Wherever you find it, clicking the button will take you to a separate page to
|
||||
establish the terminal session:
|
||||
|
||||
![Terminal page](../img/environments_terminal_page.png)
|
||||
|
||||
This works just like any other terminal. You'll be in the container created
|
||||
by your deployment so you can:
|
||||
|
||||
- Run shell commands and get responses in real time.
|
||||
- Check the logs.
|
||||
- Try out configuration or code tweaks etc.
|
||||
|
||||
You can open multiple terminals to the same environment, they each get their own shell
|
||||
session and even a multiplexer like `screen` or `tmux`.
|
||||
|
||||
NOTE: **Note:**
|
||||
Container-based deployments often lack basic tools (like an editor), and may
|
||||
be stopped or restarted at any time. If this happens, you will lose all your
|
||||
changes. Treat this as a debugging tool, not a comprehensive online IDE.
|
||||
|
||||
### Check out deployments locally
|
||||
|
||||
Since GitLab 8.13, a reference in the Git repository is saved for each deployment, so
|
||||
knowing the state of your current environments is only a `git fetch` away.
|
||||
|
||||
In your Git configuration, append the `[remote "<your-remote>"]` block with an extra
|
||||
fetch line:
|
||||
|
||||
```text
|
||||
fetch = +refs/environments/*:refs/remotes/origin/environments/*
|
||||
```
|
||||
|
||||
### Scoping environments with specs
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2112) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.4.
|
||||
> - [Scoping for environment variables was moved to Core](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30779) to Core in GitLab 12.2.
|
||||
|
||||
You can limit the environment scope of a variable by
|
||||
defining which environments it can be available for.
|
||||
|
||||
Wildcards can be used, and the default environment scope is `*`, which means
|
||||
any jobs will have this variable, not matter if an environment is defined or
|
||||
not.
|
||||
|
||||
For example, if the environment scope is `production`, then only the jobs
|
||||
having the environment `production` defined would have this specific variable.
|
||||
Wildcards (`*`) can be used along with the environment name, therefore if the
|
||||
environment scope is `review/*` then any jobs with environment names starting
|
||||
with `review/` would have that particular variable.
|
||||
|
||||
Some GitLab features can behave differently for each environment.
|
||||
For example, you can
|
||||
[create a secret variable to be injected only into a production environment](../variables/README.md#limit-the-environment-scopes-of-environment-variables).
|
||||
|
||||
In most cases, these features use the _environment specs_ mechanism, which offers
|
||||
an efficient way to implement scoping within each environment group.
|
||||
|
||||
Let's say there are four environments:
|
||||
|
||||
- `production`
|
||||
- `staging`
|
||||
- `review/feature-1`
|
||||
- `review/feature-2`
|
||||
|
||||
Each environment can be matched with the following environment spec:
|
||||
|
||||
| Environment Spec | `production` | `staging` | `review/feature-1` | `review/feature-2` |
|
||||
|:-----------------|:-------------|:----------|:-------------------|:-------------------|
|
||||
| * | Matched | Matched | Matched | Matched |
|
||||
| production | Matched | | | |
|
||||
| staging | | Matched | | |
|
||||
| review/* | | | Matched | Matched |
|
||||
| review/feature-1 | | | Matched | |
|
||||
|
||||
As you can see, you can use specific matching for selecting a particular environment,
|
||||
and also use wildcard matching (`*`) for selecting a particular environment group,
|
||||
such as [Review Apps](../review_apps/index.md) (`review/*`).
|
||||
|
||||
NOTE: **Note:**
|
||||
The most _specific_ spec takes precedence over the other wildcard matching.
|
||||
In this case, `review/feature-1` spec takes precedence over `review/*` and `*` specs.
|
||||
|
||||
### Environments Dashboard **(PREMIUM)**
|
||||
|
||||
See [Environments Dashboard](../environments/environments_dashboard.md) for a summary of each
|
||||
environment's operational health.
|
||||
|
||||
## Limitations
|
||||
|
||||
In the `environment: name`, you are limited to only the [predefined environment variables](../variables/predefined_variables.md).
|
||||
Re-using variables defined inside `script` as part of the environment name will not work.
|
||||
|
||||
## Further reading
|
||||
|
||||
Below are some links you may find interesting:
|
||||
|
||||
- [The `.gitlab-ci.yml` definition of environments](../yaml/README.md#environment)
|
||||
- [A blog post on Deployments & Environments](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
|
||||
- [Review Apps - Use dynamic environments to deploy your code for every branch](../review_apps/index.md)
|
||||
- [Deploy Boards for your applications running on Kubernetes](../../user/project/deploy_boards.md) **(PREMIUM)**
|
||||
|
||||
<!-- ## Troubleshooting
|
||||
|
||||
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
|
||||
one might have when setting this up, or when something is changed, or on upgrading, it's
|
||||
important to describe those, too. Think of things that may go wrong and include them here.
|
||||
This is important to minimize requests for support, and to avoid doc comments with
|
||||
questions that you know someone might ask.
|
||||
|
||||
Each scenario can be a third-level heading, e.g. `### Getting error message X`.
|
||||
If you have none to add when creating a doc, leave this section in place
|
||||
but commented out to help encourage others to add to it in the future. -->
|
|
@ -8,7 +8,7 @@ type: concepts, howto
|
|||
|
||||
## Overview
|
||||
|
||||
[Environments](../environments.md) can be used for different reasons:
|
||||
[Environments](../environments/index.md) can be used for different reasons:
|
||||
|
||||
- Some of them are just for testing.
|
||||
- Others are for production.
|
||||
|
|
|
@ -516,7 +516,7 @@ Errors can be easily debugged through GitLab's build logs, and within minutes of
|
|||
you can see the changes live on your game.
|
||||
|
||||
Setting up Continuous Integration and Continuous Deployment from the start with Dark Nova enables
|
||||
rapid but stable development. We can easily test changes in a separate [environment](../../environments.md),
|
||||
rapid but stable development. We can easily test changes in a separate [environment](../../environments/index.md),
|
||||
or multiple environments if needed. Balancing and updating a multiplayer game can be ongoing
|
||||
and tedious, but having faith in a stable deployment with GitLab CI/CD allows
|
||||
a lot of breathing room in quickly getting changes to players.
|
||||
|
|
|
@ -376,7 +376,7 @@ You might want to create another Envoy task to do that for you.
|
|||
We also create the `.env` file in the same path to set up our production environment variables for Laravel.
|
||||
These are persistent data and will be shared to every new release.
|
||||
|
||||
Now, we would need to deploy our app by running `envoy run deploy`, but it won't be necessary since GitLab can handle that for us with CI's [environments](../../environments.md), which will be described [later](#setting-up-gitlab-cicd) in this tutorial.
|
||||
Now, we would need to deploy our app by running `envoy run deploy`, but it won't be necessary since GitLab can handle that for us with CI's [environments](../../environments/index.md), which will be described [later](#setting-up-gitlab-cicd) in this tutorial.
|
||||
|
||||
Now it's time to commit [Envoy.blade.php](https://gitlab.com/mehranrasulian/laravel-sample/blob/master/Envoy.blade.php) and push it to the `master` branch.
|
||||
To keep things simple, we commit directly to `master`, without using [feature-branches](../../../topics/gitlab_flow.md#github-flow-as-a-simpler-alternative) since collaboration is beyond the scope of this tutorial.
|
||||
|
|
|
@ -136,7 +136,7 @@ displayed by GitLab:
|
|||
![pipeline status](img/pipeline_status.png)
|
||||
|
||||
At the end, if anything goes wrong, you can easily
|
||||
[roll back](../environments.md#retrying-and-rolling-back) all the changes:
|
||||
[roll back](../environments/index.md#retrying-and-rolling-back) all the changes:
|
||||
|
||||
![rollback button](img/rollback.png)
|
||||
|
||||
|
@ -207,7 +207,7 @@ according to each stage (Verify, Package, Release).
|
|||
With GitLab CI/CD you can also:
|
||||
|
||||
- Easily set up your app's entire lifecycle with [Auto DevOps](../../topics/autodevops/index.md).
|
||||
- Deploy your app to different [environments](../environments.md).
|
||||
- Deploy your app to different [environments](../environments/index.md).
|
||||
- Install your own [GitLab Runner](https://docs.gitlab.com/runner/).
|
||||
- [Schedule pipelines](../pipelines/schedules.md).
|
||||
- Check for app vulnerabilities with [Security Test reports](../../user/application_security/index.md). **(ULTIMATE)**
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 14 KiB |
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
|
@ -82,7 +82,7 @@ You can find the current and historical pipeline runs under your project's
|
|||
**CI/CD > Pipelines** page. You can also access pipelines for a merge request by navigating
|
||||
to its **Pipelines** tab.
|
||||
|
||||
![Pipelines index page](img/pipelines_index.png)
|
||||
![Pipelines index page](img/pipelines_index_v13_0.png)
|
||||
|
||||
Clicking a pipeline will bring you to the **Pipeline Details** page and show
|
||||
the jobs that were run for that pipeline. From here you can cancel a running pipeline,
|
||||
|
@ -93,6 +93,12 @@ latest pipeline for the last commit of a given branch is available at `/project/
|
|||
Also, `/project/pipelines/latest` will redirect you to the latest pipeline for the last commit
|
||||
on the project's default branch.
|
||||
|
||||
[Starting in GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/215367),
|
||||
you can filter the pipeline list by:
|
||||
|
||||
- Trigger author
|
||||
- Branch name
|
||||
|
||||
### Run a pipeline manually
|
||||
|
||||
Pipelines can be manually executed, with predefined or manually-specified [variables](../variables/README.md).
|
||||
|
@ -153,7 +159,7 @@ You can do this straight from the pipeline graph. Just click the play button
|
|||
to execute that particular job.
|
||||
|
||||
For example, your pipeline might start automatically, but it requires manual action to
|
||||
[deploy to production](../environments.md#configuring-manual-deployments). In the example below, the `production`
|
||||
[deploy to production](../environments/index.md#configuring-manual-deployments). In the example below, the `production`
|
||||
stage has a job with a manual action.
|
||||
|
||||
![Pipelines example](img/pipelines.png)
|
||||
|
@ -343,7 +349,7 @@ build ruby 2/3:
|
|||
stage: build
|
||||
script:
|
||||
- echo "ruby2"
|
||||
|
||||
|
||||
build ruby 3/3:
|
||||
stage: build
|
||||
script:
|
||||
|
@ -391,7 +397,7 @@ For example, if you start rolling out new code and:
|
|||
|
||||
- Users do not experience trouble, GitLab can automatically complete the deployment from 0% to 100%.
|
||||
- Users experience trouble with the new code, you can stop the timed incremental rollout by canceling the pipeline
|
||||
and [rolling](../environments.md#retrying-and-rolling-back) back to the last stable version.
|
||||
and [rolling](../environments/index.md#retrying-and-rolling-back) back to the last stable version.
|
||||
|
||||
![Pipelines example](img/pipeline_incremental_rollout.png)
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ combination thereof (`junit: [rspec.xml, test-results/TEST-*.xml]`).
|
|||
The `dotenv` report collects a set of environment variables as artifacts.
|
||||
|
||||
The collected variables are registered as runtime-created variables of the job,
|
||||
which is useful to [set dynamic environment URLs after a job finishes](../environments.md#set-dynamic-environment-urls-after-a-job-finishes).
|
||||
which is useful to [set dynamic environment URLs after a job finishes](../environments/index.md#set-dynamic-environment-urls-after-a-job-finishes).
|
||||
It's not available for download through the web interface.
|
||||
|
||||
There are a couple of limitations on top of the [original dotenv rules](https://github.com/motdotla/dotenv#rules).
|
||||
|
|
|
@ -29,7 +29,7 @@ In the above example:
|
|||
|
||||
## How Review Apps work
|
||||
|
||||
A Review App is a mapping of a branch with an [environment](../environments.md).
|
||||
A Review App is a mapping of a branch with an [environment](../environments/index.md).
|
||||
Access to the Review App is made available as a link on the [merge request](../../user/project/merge_requests.md) relevant to the branch.
|
||||
|
||||
The following is an example of a merge request with an environment set dynamically.
|
||||
|
@ -49,7 +49,7 @@ After adding Review Apps to your workflow, you follow the branched Git flow. Tha
|
|||
|
||||
## Configuring Review Apps
|
||||
|
||||
Review Apps are built on [dynamic environments](../environments.md#configuring-dynamic-environments), which allow you to dynamically create a new environment for each branch.
|
||||
Review Apps are built on [dynamic environments](../environments/index.md#configuring-dynamic-environments), which allow you to dynamically create a new environment for each branch.
|
||||
|
||||
The process of configuring Review Apps is as follows:
|
||||
|
||||
|
@ -58,7 +58,7 @@ The process of configuring Review Apps is as follows:
|
|||
1. Set up a job in `.gitlab-ci.yml` that uses the [predefined CI environment variable](../variables/README.md) `${CI_COMMIT_REF_NAME}`
|
||||
to create dynamic environments and restrict it to run only on branches.
|
||||
Alternatively, you can get a YML template for this job by [enabling review apps](#enable-review-apps-button) for your project.
|
||||
1. Optionally, set a job that [manually stops](../environments.md#stopping-an-environment) the Review Apps.
|
||||
1. Optionally, set a job that [manually stops](../environments/index.md#stopping-an-environment) the Review Apps.
|
||||
|
||||
### Enable Review Apps button
|
||||
|
||||
|
@ -82,7 +82,7 @@ you can copy and paste into `.gitlab-ci.yml` as a starting point. To do so:
|
|||
|
||||
## Review Apps auto-stop
|
||||
|
||||
See how to [configure Review Apps environments to expire and auto-stop](../environments.md#environments-auto-stop)
|
||||
See how to [configure Review Apps environments to expire and auto-stop](../environments/index.md#environments-auto-stop)
|
||||
after a given period of time.
|
||||
|
||||
## Review Apps examples
|
||||
|
@ -100,7 +100,7 @@ See also the video [Demo: Cloud Native Development with GitLab](https://www.yout
|
|||
> Introduced in GitLab 8.17. In GitLab 11.5, the file links are available in the merge request widget.
|
||||
|
||||
Route Maps allows you to go directly from source files
|
||||
to public pages on the [environment](../environments.md) defined for
|
||||
to public pages on the [environment](../environments/index.md) defined for
|
||||
Review Apps.
|
||||
|
||||
Once set up, the review app link in the merge request
|
||||
|
@ -301,4 +301,4 @@ automatically in the respective merge request.
|
|||
|
||||
## Limitations
|
||||
|
||||
Review App limitations are the same as [environments limitations](../environments.md#limitations).
|
||||
Review App limitations are the same as [environments limitations](../environments/index.md#limitations).
|
||||
|
|
|
@ -431,9 +431,9 @@ Click [here](where_variables_can_be_used.md) for a section that describes where
|
|||
### Limit the environment scopes of environment variables
|
||||
|
||||
You can limit the environment scope of a variable by
|
||||
[defining which environments](../environments.md) it can be available for.
|
||||
[defining which environments](../environments/index.md) it can be available for.
|
||||
|
||||
To learn more about scoping environments, see [Scoping environments with specs](../environments.md#scoping-environments-with-specs).
|
||||
To learn more about scoping environments, see [Scoping environments with specs](../environments/index.md#scoping-environments-with-specs).
|
||||
|
||||
### Deployment environment variables
|
||||
|
||||
|
@ -442,7 +442,7 @@ To learn more about scoping environments, see [Scoping environments with specs](
|
|||
[Integrations](../../user/project/integrations/overview.md) that are
|
||||
responsible for deployment configuration may define their own variables that
|
||||
are set in the build environment. These variables are only defined for
|
||||
[deployment jobs](../environments.md). Please consult the documentation of
|
||||
[deployment jobs](../environments/index.md). Please consult the documentation of
|
||||
the integrations that you are using to learn which variables they define.
|
||||
|
||||
An example integration that defines deployment variables is the
|
||||
|
|
|
@ -1871,7 +1871,7 @@ Manual actions are a special type of job that are not executed automatically,
|
|||
they need to be explicitly started by a user. An example usage of manual actions
|
||||
would be a deployment to a production environment. Manual actions can be started
|
||||
from the pipeline, job, environment, and deployment views. Read more at the
|
||||
[environments documentation](../environments.md#configuring-manual-deployments).
|
||||
[environments documentation](../environments/index.md#configuring-manual-deployments).
|
||||
|
||||
Manual actions can be either optional or blocking. Blocking manual actions will
|
||||
block the execution of the pipeline at the stage this action is defined in. It's
|
||||
|
@ -1984,7 +1984,7 @@ GitLab Runner will pick your job soon and start the job.
|
|||
|
||||
> - Introduced in GitLab 8.9.
|
||||
> - You can read more about environments and find more examples in the
|
||||
> [documentation about environments](../environments.md).
|
||||
> [documentation about environments](../environments/index.md).
|
||||
|
||||
`environment` is used to define that a job deploys to a specific environment.
|
||||
If `environment` is specified and no environment under that name exists, a new
|
||||
|
@ -2114,7 +2114,7 @@ GitLab's web interface in order to run.
|
|||
|
||||
Also in the example, `GIT_STRATEGY` is set to `none` so that GitLab Runner won’t
|
||||
try to check out the code after the branch is deleted when the `stop_review_app`
|
||||
job is [automatically triggered](../environments.md#automatically-stopping-an-environment).
|
||||
job is [automatically triggered](../environments/index.md#automatically-stopping-an-environment).
|
||||
|
||||
NOTE: **Note:**
|
||||
The above example overwrites global variables. If your stop environment job depends
|
||||
|
@ -2150,7 +2150,7 @@ When `review_app` job is executed and a review app is created, a life period of
|
|||
the environment is set to `1 day`.
|
||||
|
||||
For more information, see
|
||||
[the environments auto-stop documentation](../environments.md#environments-auto-stop)
|
||||
[the environments auto-stop documentation](../environments/index.md#environments-auto-stop)
|
||||
|
||||
#### `environment:kubernetes`
|
||||
|
||||
|
@ -2176,7 +2176,7 @@ environment, using the `production`
|
|||
[Kubernetes namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/).
|
||||
|
||||
For more information, see
|
||||
[Available settings for `kubernetes`](../environments.md#configuring-kubernetes-deployments).
|
||||
[Available settings for `kubernetes`](../environments/index.md#configuring-kubernetes-deployments).
|
||||
|
||||
NOTE: **Note:**
|
||||
Kubernetes configuration is not supported for Kubernetes clusters
|
||||
|
|
|
@ -56,13 +56,13 @@ When declaring multiple globals, always use one `/* global [name] */` line per v
|
|||
|
||||
## Formatting with Prettier
|
||||
|
||||
Our code is automatically formatted with [Prettier](https://prettier.io) to follow our style guides. Prettier is taking care of formatting .js, .vue, and .scss files based on the standard prettier rules. You can find all settings for Prettier in `.prettierrc`.
|
||||
Our code is automatically formatted with [Prettier](https://prettier.io) to follow our style guides. Prettier is taking care of formatting `.js`, `.vue`, and `.scss` files based on the standard prettier rules. You can find all settings for Prettier in `.prettierrc`.
|
||||
|
||||
### Editor
|
||||
|
||||
The easiest way to include prettier in your workflow is by setting up your preferred editor (all major editors are supported) accordingly. We suggest setting up prettier to run automatically when each file is saved. Find [here](https://prettier.io/docs/en/editors.html) the best way to set it up in your preferred editor.
|
||||
|
||||
Please take care that you only let Prettier format the same file types as the global Yarn script does (.js, .vue, and .scss). In VSCode by example you can easily exclude file formats in your settings file:
|
||||
Please take care that you only let Prettier format the same file types as the global Yarn script does (`.js`, `.vue`, and `.scss`). In VSCode by example you can easily exclude file formats in your settings file:
|
||||
|
||||
```json
|
||||
"prettier.disableLanguages": [
|
||||
|
|
|
@ -261,6 +261,8 @@ I, [2020-01-13T19:01:17.091Z #11056] INFO -- : {"message"=>"Message", "project_
|
|||
lifecycle, which can then be added to the web request
|
||||
or Sidekiq logs.
|
||||
|
||||
The API, Rails and Sidekiq logs contain fields starting with `meta.` with this context information.
|
||||
|
||||
Entry points can be seen at:
|
||||
|
||||
- [`ApplicationController`](https://gitlab.com/gitlab-org/gitlab/blob/master/app/controllers/application_controller.rb)
|
||||
|
|
|
@ -102,10 +102,10 @@ subgraph "CNG-mirror pipeline"
|
|||
### Auto-stopping of Review Apps
|
||||
|
||||
Review Apps are automatically stopped 2 days after the last deployment thanks to
|
||||
the [Environment auto-stop](../../ci/environments.md#environments-auto-stop) feature.
|
||||
the [Environment auto-stop](../../ci/environments/index.md#environments-auto-stop) feature.
|
||||
|
||||
If you need your Review App to stay up for a longer time, you can
|
||||
[pin its environment](../../ci/environments.md#auto-stop-example) or retry the
|
||||
[pin its environment](../../ci/environments/index.md#auto-stop-example) or retry the
|
||||
`review-deploy` job to update the "latest deployed at" time.
|
||||
|
||||
The `review-cleanup` job that automatically runs in scheduled
|
||||
|
|
|
@ -22,7 +22,7 @@ To enable the Microsoft Azure OAuth2 OmniAuth provider you must register your ap
|
|||
|
||||
1. Add a "Reply URL" pointing to the Azure OAuth callback of your GitLab installation (e.g. `https://gitlab.mycompany.com/users/auth/azure_oauth2/callback`).
|
||||
|
||||
1. Create a "Client secret" by selecting a duration, the secret will be generated as soon as you click the "Save" button in the bottom menu..
|
||||
1. Create a "Client secret" by selecting a duration, the secret will be generated as soon as you click the "Save" button in the bottom menu.
|
||||
|
||||
1. Note the "CLIENT ID" and the "CLIENT SECRET".
|
||||
|
||||
|
|
|
@ -300,7 +300,7 @@ sudo -u git -H bundle exec rake gitlab:backup:create SKIP=tar RAILS_ENV=producti
|
|||
|
||||
#### Uploading backups to a remote (cloud) storage
|
||||
|
||||
Starting with GitLab 7.4 you can let the backup script upload the '.tar' file it creates.
|
||||
Starting with GitLab 7.4 you can let the backup script upload the `.tar` file it creates.
|
||||
It uses the [Fog library](http://fog.io/) to perform the upload.
|
||||
In the example below we use Amazon S3 for storage, but Fog also lets you use
|
||||
[other storage providers](http://fog.io/storage/). GitLab
|
||||
|
|
|
@ -179,7 +179,7 @@ into your project and edit it as needed.
|
|||
|
||||
For clusters not managed by GitLab, you can customize the namespace in
|
||||
`.gitlab-ci.yml` by specifying
|
||||
[`environment:kubernetes:namespace`](../../ci/environments.md#configuring-kubernetes-deployments).
|
||||
[`environment:kubernetes:namespace`](../../ci/environments/index.md#configuring-kubernetes-deployments).
|
||||
For example, the following configuration overrides the namespace used for
|
||||
`production` deployments:
|
||||
|
||||
|
@ -269,7 +269,7 @@ You must define environment-scoped variables for `POSTGRES_ENABLED` and
|
|||
`DATABASE_URL` in your project's CI/CD settings:
|
||||
|
||||
1. Disable the built-in PostgreSQL installation for the required environments using
|
||||
scoped [environment variables](../../ci/environments.md#scoping-environments-with-specs).
|
||||
scoped [environment variables](../../ci/environments/index.md#scoping-environments-with-specs).
|
||||
For this use case, it's likely that only `production` will need to be added to this
|
||||
list. The built-in PostgreSQL setup for Review Apps and staging is sufficient.
|
||||
|
||||
|
@ -534,7 +534,7 @@ required to go from `10%` to `100%`, you can jump to whatever job you want.
|
|||
You can also scale down by running a lower percentage job, just before hitting
|
||||
`100%`. Once you get to `100%`, you can't scale down, and you'd have to roll
|
||||
back by redeploying the old version using the
|
||||
[rollback button](../../ci/environments.md#retrying-and-rolling-back) in the
|
||||
[rollback button](../../ci/environments/index.md#retrying-and-rolling-back) in the
|
||||
environment page.
|
||||
|
||||
Below, you can see how the pipeline will look if the rollout or staging
|
||||
|
|
|
@ -215,12 +215,12 @@ you to common environment tasks:
|
|||
about the Kubernetes cluster and how the application
|
||||
affects it in terms of memory usage, CPU usage, and latency
|
||||
- **Deploy to** (**{play}** **{angle-down}**) - Displays a list of environments you can deploy to
|
||||
- **Terminal** (**{terminal}**) - Opens a [web terminal](../../ci/environments.md#web-terminals)
|
||||
- **Terminal** (**{terminal}**) - Opens a [web terminal](../../ci/environments/index.md#web-terminals)
|
||||
session inside the container where the application is running
|
||||
- **Re-deploy to environment** (**{repeat}**) - For more information, see
|
||||
[Retrying and rolling back](../../ci/environments.md#retrying-and-rolling-back)
|
||||
[Retrying and rolling back](../../ci/environments/index.md#retrying-and-rolling-back)
|
||||
- **Stop environment** (**{stop}**) - For more information, see
|
||||
[Stopping an environment](../../ci/environments.md#stopping-an-environment)
|
||||
[Stopping an environment](../../ci/environments/index.md#stopping-an-environment)
|
||||
|
||||
GitLab displays the [Deploy Board](../../user/project/deploy_boards.md) below the
|
||||
environment's information, with squares representing pods in your
|
||||
|
|
|
@ -538,7 +538,7 @@ may require commands to be wrapped as follows:
|
|||
Some of the reasons you may need to wrap commands:
|
||||
|
||||
- Attaching using `kubectl exec`.
|
||||
- Using GitLab's [Web Terminal](../../ci/environments.md#web-terminals).
|
||||
- Using GitLab's [Web Terminal](../../ci/environments/index.md#web-terminals).
|
||||
|
||||
For example, to start a Rails console from the application root directory, run:
|
||||
|
||||
|
@ -572,7 +572,7 @@ To use Auto Monitoring:
|
|||
1. [Enable Auto DevOps](index.md#enablingdisabling-auto-devops), if you haven't done already.
|
||||
1. Navigate to your project's **{rocket}** **CI/CD > Pipelines** and click **Run Pipeline**.
|
||||
1. After the pipeline finishes successfully, open the
|
||||
[monitoring dashboard for a deployed environment](../../ci/environments.md#monitoring-environments)
|
||||
[monitoring dashboard for a deployed environment](../../ci/environments/index.md#monitoring-environments)
|
||||
to view the metrics of your deployed application. To view the metrics of the
|
||||
whole Kubernetes cluster, navigate to **{cloud-gear}** **Operations > Metrics**.
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@ deleted, you can choose to retain the [persistent
|
|||
volume](#retain-persistent-volumes).
|
||||
|
||||
TIP: **Tip:** You can also
|
||||
[scope](../../ci/environments.md#scoping-environments-with-specs) the
|
||||
[scope](../../ci/environments/index.md#scoping-environments-with-specs) the
|
||||
`AUTO_DEVOPS_POSTGRES_CHANNEL`, `AUTO_DEVOPS_POSTGRES_DELETE_V1` and
|
||||
`POSTGRES_VERSION` variables to specific environments, e.g. `staging`.
|
||||
|
||||
|
@ -176,7 +176,7 @@ TIP: **Tip:** You can also
|
|||
1. Set `POSTGRES_VERSION` to `11.7`. This is the minimum PostgreSQL
|
||||
version supported.
|
||||
1. Set `PRODUCTION_REPLICAS` to `0`. For other environments, use
|
||||
`REPLICAS` with an [environment scope](../../ci/environments.md#scoping-environments-with-specs).
|
||||
`REPLICAS` with an [environment scope](../../ci/environments/index.md#scoping-environments-with-specs).
|
||||
1. If you have set the `DB_INITIALIZE` or `DB_MIGRATE` variables, either
|
||||
remove the variables, or rename the variables temporarily to
|
||||
`XDB_INITIALIZE` or the `XDB_MIGRATE` to effectively disable them.
|
||||
|
|
|
@ -253,7 +253,7 @@ If you need to utilize some code that was introduced in `master` after you creat
|
|||
If your feature branch has a merge conflict, creating a merge commit is a standard way of solving this.
|
||||
|
||||
NOTE: **Note:**
|
||||
Sometimes you can use .gitattributes to reduce merge conflicts.
|
||||
Sometimes you can use `.gitattributes` to reduce merge conflicts.
|
||||
For example, you can set your changelog file to use the [union merge driver](https://git-scm.com/docs/gitattributes#gitattributes-union) so that multiple new entries don't conflict with each other.
|
||||
|
||||
The last reason for creating merge commits is to keep long-running feature branches up-to-date with the latest state of the project.
|
||||
|
|
|
@ -278,7 +278,7 @@ git rm '*.txt'
|
|||
git rm -r <dirname>
|
||||
```
|
||||
|
||||
If we want to remove a file from the repository but keep it on disk, say we forgot to add it to our .gitignore file then use `--cache`:
|
||||
If we want to remove a file from the repository but keep it on disk, say we forgot to add it to our `.gitignore` file then use `--cache`:
|
||||
|
||||
```shell
|
||||
git rm <filename> --cache
|
||||
|
|
|
@ -10,7 +10,7 @@ the previous version you were using.
|
|||
|
||||
First, roll back the code or package. For source installations this involves
|
||||
checking out the older version (branch or tag). For Omnibus installations this
|
||||
means installing the older .deb or .rpm package. Then, restore from a backup.
|
||||
means installing the older `.deb` or `.rpm` package. Then, restore from a backup.
|
||||
Follow the instructions in the
|
||||
[Backup and Restore](../raketasks/backup_restore.md#restore-gitlab)
|
||||
documentation.
|
||||
|
|
|
@ -315,6 +315,7 @@ but commented out to help encourage others to add to it in the future. -->
|
|||
|incident_issues|counts|monitor|Issues created by the alert bot|
|
||||
|alert_bot_incident_issues|counts|monitor|Issues created by the alert bot|
|
||||
|incident_labeled_issues|counts|monitor|Issues with the incident label|
|
||||
|issues_created_gitlab_alerts|counts|monitor|issues created from alerts by non-alert bot users|
|
||||
|ldap_group_links|counts||
|
||||
|ldap_keys|counts||
|
||||
|ldap_users|counts||
|
||||
|
|
|
@ -37,17 +37,16 @@ The results are sorted by the severity of the vulnerability:
|
|||
|
||||
## Requirements
|
||||
|
||||
To run a Dependency Scanning job, by default, you need GitLab Runner with the
|
||||
[`docker`](https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode) or
|
||||
[`kubernetes`](https://docs.gitlab.com/runner/install/kubernetes.html#running-privileged-containers-for-the-runners)
|
||||
executor running in privileged mode. If you're using the shared Runners on GitLab.com,
|
||||
this is enabled by default.
|
||||
To run Dependency Scanning jobs, by default, you need GitLab Runner with the
|
||||
[`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
|
||||
[`kubernetes`](https://docs.gitlab.com/runner/install/kubernetes.html) executor.
|
||||
If you're using the shared Runners on GitLab.com, this is enabled by default.
|
||||
|
||||
CAUTION: **Caution:**
|
||||
If you use your own Runners, make sure your installed version of Docker
|
||||
is **not** `19.03.0`. See [troubleshooting information](#error-response-from-daemon-error-processing-tar-file-docker-tar-relocation-error) for details.
|
||||
|
||||
Privileged mode is not necessary if you've [disabled Docker in Docker for Dependency Scanning](#disabling-docker-in-docker-for-dependency-scanning)
|
||||
Beginning with GitLab 13.0, Docker privileged mode is necessary only if you've [enabled Docker-in-Docker for Dependency Scanning](#enabling-docker-in-docker).
|
||||
|
||||
## Supported languages and package managers
|
||||
|
||||
|
@ -86,7 +85,7 @@ include:
|
|||
- template: Dependency-Scanning.gitlab-ci.yml
|
||||
```
|
||||
|
||||
The included template will create a `dependency_scanning` job in your CI/CD
|
||||
The included template will create Dependency Scanning jobs in your CI/CD
|
||||
pipeline and scan your project's source code for possible vulnerabilities.
|
||||
The results will be saved as a
|
||||
[Dependency Scanning report artifact](../../../ci/pipelines/job_artifacts.md#artifactsreportsdependency_scanning-ultimate)
|
||||
|
@ -110,23 +109,24 @@ variables:
|
|||
Because template is [evaluated before](../../../ci/yaml/README.md#include) the pipeline
|
||||
configuration, the last mention of the variable will take precedence.
|
||||
|
||||
### Overriding the Dependency Scanning template
|
||||
### Overriding Dependency Scanning jobs
|
||||
|
||||
CAUTION: **Deprecation:**
|
||||
Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/README.md#onlyexcept-basic)
|
||||
is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules) instead.
|
||||
|
||||
If you want to override the job definition, such as changing properties like
|
||||
`variables` or `dependencies`, you must declare a `dependency_scanning` job
|
||||
after the template inclusion, and specify any additional keys under it. For example:
|
||||
To override a job definition (for example, to change properties like `variables` or `dependencies`),
|
||||
declare a new job with the same name as the one to override. Place this new job after the template
|
||||
inclusion and specify any additional keys under it. For example, this disables `DS_REMEDIATE` for
|
||||
the `gemnasium` analyzer:
|
||||
|
||||
```yaml
|
||||
include:
|
||||
- template: Dependency-Scanning.gitlab-ci.yml
|
||||
|
||||
dependency_scanning:
|
||||
gemnasium-dependency_scanning:
|
||||
variables:
|
||||
CI_DEBUG_TRACE: "true"
|
||||
DS_REMEDIATE: "false"
|
||||
```
|
||||
|
||||
### Available variables
|
||||
|
@ -143,13 +143,13 @@ The following variables allow configuration of global dependency scanning settin
|
|||
| `SECURE_ANALYZERS_PREFIX` | Override the name of the Docker registry providing the official default images (proxy). Read more about [customizing analyzers](analyzers.md). |
|
||||
| `DS_ANALYZER_IMAGE_PREFIX` | **DEPRECATED:** Use `SECURE_ANALYZERS_PREFIX` instead. |
|
||||
| `DS_DEFAULT_ANALYZERS` | Override the names of the official default images. Read more about [customizing analyzers](analyzers.md). |
|
||||
| `DS_DISABLE_DIND` | Disable Docker-in-Docker and run analyzers [individually](#disabling-docker-in-docker-for-dependency-scanning).|
|
||||
| `DS_DISABLE_DIND` | Disable Docker-in-Docker and run analyzers [individually](#enabling-docker-in-docker). This variable is `true` by default. |
|
||||
| `ADDITIONAL_CA_CERT_BUNDLE` | Bundle of CA certs to trust. |
|
||||
| `DS_EXCLUDED_PATHS` | Exclude vulnerabilities from output based on the paths. A comma-separated list of patterns. Patterns can be globs, or file or folder paths (for example, `doc,spec`). Parent directories also match patterns. |
|
||||
|
||||
#### Configuring Docker-in-Docker orchestrator
|
||||
|
||||
The following variables configure the Docker-in-Docker orchestrator.
|
||||
The following variables configure the Docker-in-Docker orchestrator, and therefore are only used when the Docker-in-Docker mode is [enabled](#enabling-docker-in-docker).
|
||||
|
||||
| Environment variable | Default | Description |
|
||||
| --------------------------------------- | ----------- | ----------- |
|
||||
|
@ -193,34 +193,26 @@ you can use the `MAVEN_CLI_OPTS` environment variable.
|
|||
|
||||
Read more on [how to use private Maven repositories](../index.md#using-private-maven-repos).
|
||||
|
||||
### Disabling Docker in Docker for Dependency Scanning
|
||||
### Enabling Docker-in-Docker
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/12487) in GitLab Ultimate 12.5.
|
||||
|
||||
You can avoid the need for Docker in Docker by running the individual analyzers.
|
||||
This does not require running the executor in privileged mode. For example:
|
||||
If needed, you can enable Docker-in-Docker to restore the Dependency Scanning behavior that existed
|
||||
prior to GitLab 13.0. Follow these steps to do so:
|
||||
|
||||
```yaml
|
||||
include:
|
||||
- template: Dependency-Scanning.gitlab-ci.yml
|
||||
1. Configure GitLab Runner with Docker-in-Docker in [privileged mode](https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode).
|
||||
1. Set the `DS_DISABLE_DIND` variable to `false`:
|
||||
|
||||
variables:
|
||||
DS_DISABLE_DIND: "true"
|
||||
```
|
||||
```yaml
|
||||
include:
|
||||
- template: Dependency-Scanning.gitlab-ci.yml
|
||||
|
||||
This will create individual `<analyzer-name>-dependency_scanning` jobs for each analyzer that runs in your CI/CD pipeline.
|
||||
variables:
|
||||
DS_DISABLE_DIND: "false"
|
||||
```
|
||||
|
||||
By removing Docker-in-Docker (DIND), GitLab relies on [Linguist](https://github.com/github/linguist)
|
||||
to start relevant analyzers depending on the detected repository language(s) instead of the
|
||||
[orchestrator](https://gitlab.com/gitlab-org/security-products/dependency-scanning/). However, there
|
||||
are some differences in the way repository languages are detected between DIND and non-DIND. You can
|
||||
observe these differences by checking both Linguist and the common library. For instance, Linguist
|
||||
looks for `*.java` files to spin up the [gemnasium-maven](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven)
|
||||
image, while orchestrator only looks for the existence of `pom.xml` or `build.gradle`. GitLab uses
|
||||
Linguist to detect new file types in the default branch. This means that when introducing files or
|
||||
dependencies for a new language or package manager, the corresponding scans won't be triggered in
|
||||
the merge request, and will only run on the default branch once the merge request is merged. This will be addressed by
|
||||
[#211702](https://gitlab.com/gitlab-org/gitlab/-/issues/211702).
|
||||
This creates a single `dependency_scanning` job in your CI/CD pipeline instead of multiple
|
||||
`<analyzer-name>-dependency_scanning` jobs.
|
||||
|
||||
## Interacting with the vulnerabilities
|
||||
|
||||
|
@ -428,7 +420,7 @@ jobs to run successfully. For more information, see [Offline environments](../of
|
|||
|
||||
Here are the requirements for using Dependency Scanning in an offline environment:
|
||||
|
||||
- [Disable Docker-In-Docker](#disabling-docker-in-docker-for-dependency-scanning).
|
||||
- Keep Docker-In-Docker disabled (default).
|
||||
- GitLab Runner with the [`docker` or `kubernetes` executor](#requirements).
|
||||
- Docker Container Registry with locally available copies of Dependency Scanning [analyzer](https://gitlab.com/gitlab-org/security-products/analyzers) images.
|
||||
- Host an offline Git copy of the [gemnasium-db advisory database](https://gitlab.com/gitlab-org/security-products/gemnasium-db/)
|
||||
|
@ -477,7 +469,6 @@ include:
|
|||
- template: Dependency-Scanning.gitlab-ci.yml
|
||||
|
||||
variables:
|
||||
DS_DISABLE_DIND: "true"
|
||||
DS_ANALYZER_IMAGE_PREFIX: "docker-registry.example.com/analyzers"
|
||||
```
|
||||
|
||||
|
@ -613,7 +604,7 @@ ERROR: Could not find dependencies: <dependency-name>. You may need to run npm i
|
|||
|
||||
### Error response from daemon: error processing tar file: docker-tar: relocation error
|
||||
|
||||
This error occurs when the Docker version used to run the SAST job is `19.03.0`.
|
||||
This error occurs when the Docker version that runs the Dependency Scanning job is `19.03.00`.
|
||||
Consider updating to Docker `19.03.1` or greater. Older versions are not
|
||||
affected. Read more in
|
||||
[this issue](https://gitlab.com/gitlab-org/gitlab/issues/13830#note_211354992 "Current SAST container fails").
|
||||
|
|
|
@ -452,6 +452,6 @@ involve pinning to the previous template versions, for example:
|
|||
```
|
||||
|
||||
Additionally, we provide a dedicated project containing the versioned legacy templates.
|
||||
This can be useful for offline setups or anyone wishing to use [Auto DevOps](../../topics/autodevops/index.md)..
|
||||
This can be useful for offline setups or anyone wishing to use [Auto DevOps](../../topics/autodevops/index.md).
|
||||
|
||||
Instructions are available in the [legacy template project](https://gitlab.com/gitlab-org/auto-devops-v12-10).
|
||||
|
|
|
@ -145,10 +145,10 @@ CAUTION: **Deprecation:**
|
|||
Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/README.md#onlyexcept-basic)
|
||||
is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules) instead.
|
||||
|
||||
If you want to override a job definition (for example, change properties like
|
||||
`variables` or `dependencies`), you need to declare a job with the same name as the SAST job to override, after the
|
||||
template inclusion and specify any additional keys under it.
|
||||
For example, this enables `FAIL_NEVER` for the `spotbugs` analyzer:
|
||||
To override a job definition, (for example, change properties like `variables` or `dependencies`),
|
||||
declare a job with the same name as the SAST job to override. Place this new job after the template
|
||||
inclusion and specify any additional keys under it. For example, this enables `FAIL_NEVER` for the
|
||||
`spotbugs` analyzer:
|
||||
|
||||
```yaml
|
||||
include:
|
||||
|
@ -176,19 +176,22 @@ Read more on [how to use private Maven repositories](../index.md#using-private-m
|
|||
|
||||
### Enabling Docker-in-Docker
|
||||
|
||||
If needed, you can restore the behavior of SAST prior to %13.0 by enabling back Docker-in-Docker.
|
||||
You need GitLab Runner with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode), and the variable `SAST_DISABLE_DIND` set to `false`:
|
||||
If needed, you can enable Docker-in-Docker to restore the SAST behavior that existed prior to GitLab
|
||||
13.0. Follow these steps to do so:
|
||||
|
||||
```yaml
|
||||
include:
|
||||
- template: SAST.gitlab-ci.yml
|
||||
1. Configure GitLab Runner with Docker-inDocker in [privileged mode](https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode).
|
||||
1. Set the variable `SAST_DISABLE_DIND` set to `false`:
|
||||
|
||||
variables:
|
||||
SAST_DISABLE_DIND: "false"
|
||||
```
|
||||
```yaml
|
||||
include:
|
||||
- template: SAST.gitlab-ci.yml
|
||||
|
||||
This will create a single `sast` job in your CI/CD pipeline
|
||||
instead of multiple `<analyzer-name>-sast` jobs.
|
||||
variables:
|
||||
SAST_DISABLE_DIND: "false"
|
||||
```
|
||||
|
||||
This creates a single `sast` job in your CI/CD pipeline instead of multiple `<analyzer-name>-sast`
|
||||
jobs.
|
||||
|
||||
#### Enabling Kubesec analyzer
|
||||
|
||||
|
@ -545,7 +548,7 @@ security reports without requiring internet access.
|
|||
|
||||
### Error response from daemon: error processing tar file: docker-tar: relocation error
|
||||
|
||||
This error occurs when the Docker version used to run the SAST job is `19.03.0`.
|
||||
This error occurs when the Docker version that runs the SAST job is `19.03.0`.
|
||||
Consider updating to Docker `19.03.1` or greater. Older versions are not
|
||||
affected. Read more in
|
||||
[this issue](https://gitlab.com/gitlab-org/gitlab/issues/13830#note_211354992 "Current SAST container fails").
|
||||
|
|
|
@ -21,7 +21,7 @@ The Web Application Firewall section provides metrics for the NGINX
|
|||
Ingress controller and ModSecurity firewall. This section has the
|
||||
following prerequisites:
|
||||
|
||||
- Project has to have at least one [environment](../../../ci/environments.md).
|
||||
- Project has to have at least one [environment](../../../ci/environments/index.md).
|
||||
- [Web Application Firewall](../../clusters/applications.md#web-application-firewall-modsecurity) has to be enabled.
|
||||
- [Elastic Stack](../../clusters/applications.md#web-application-firewall-modsecurity) has to be installed.
|
||||
|
||||
|
@ -48,7 +48,7 @@ The **Container Network Policy** section provides packet flow metrics for
|
|||
your application's Kubernetes namespace. This section has the following
|
||||
prerequisites:
|
||||
|
||||
- Your project contains at least one [environment](../../../ci/environments.md)
|
||||
- Your project contains at least one [environment](../../../ci/environments/index.md)
|
||||
- You've [installed Cilium](../../clusters/applications.md#install-cilium-using-gitlab-cicd)
|
||||
- You've configured the [Prometheus service](../../project/integrations/prometheus.md#enabling-prometheus-integration)
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ GitLab provides **GitLab Managed Apps**, a one-click install for various applica
|
|||
be added directly to your configured cluster.
|
||||
|
||||
These applications are needed for [Review Apps](../../ci/review_apps/index.md)
|
||||
and [deployments](../../ci/environments.md) when using [Auto DevOps](../../topics/autodevops/index.md).
|
||||
and [deployments](../../ci/environments/index.md) when using [Auto DevOps](../../topics/autodevops/index.md).
|
||||
|
||||
You can install them after you
|
||||
[create a cluster](../project/clusters/add_remove_clusters.md).
|
||||
|
|
|
@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/13392) for group-level clusters in [GitLab Premium](https://about.gitlab.com/pricing/) 12.3.
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/14809) for instance-level clusters in [GitLab Premium](https://about.gitlab.com/pricing/) 12.4.
|
||||
|
||||
Cluster environments provide a consolidated view of which CI [environments](../../ci/environments.md) are
|
||||
Cluster environments provide a consolidated view of which CI [environments](../../ci/environments/index.md) are
|
||||
deployed to the Kubernetes cluster and it:
|
||||
|
||||
- Shows the project and the relevant environment related to the deployment.
|
||||
|
|
|
@ -103,7 +103,7 @@ The domain should have a wildcard DNS configured to the Ingress IP address.
|
|||
|
||||
When adding more than one Kubernetes cluster to your project, you need to differentiate
|
||||
them with an environment scope. The environment scope associates clusters with
|
||||
[environments](../../../ci/environments.md) similar to how the
|
||||
[environments](../../../ci/environments/index.md) similar to how the
|
||||
[environment-specific variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-environment-variables)
|
||||
work.
|
||||
|
||||
|
@ -157,7 +157,7 @@ The result is:
|
|||
|
||||
## Cluster environments **(PREMIUM)**
|
||||
|
||||
For a consolidated view of which CI [environments](../../../ci/environments.md)
|
||||
For a consolidated view of which CI [environments](../../../ci/environments/index.md)
|
||||
are deployed to the Kubernetes cluster, see the documentation for
|
||||
[cluster environments](../../clusters/environments.md).
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ To learn what you can do with an epic, see [Manage epics](manage_epics.md). Poss
|
|||
- [Reopen a closed epic](manage_epics.md#reopen-a-closed-epic)
|
||||
- [Go to an epic from an issue](manage_epics.md#go-to-an-epic-from-an-issue)
|
||||
- [Search for an epic from epics list page](manage_epics.md#search-for-an-epic-from-epics-list-page)
|
||||
- [Make an epic confidential](manage_epics.md#make-an-epic-confidential)
|
||||
- [Manage issues assigned to an epic](manage_epics.md#manage-issues-assigned-to-an-epic)
|
||||
- [Manage multi-level child epics **(ULTIMATE)**](manage_epics.md#manage-multi-level-child-epics-ultimate)
|
||||
|
||||
|
|
|
@ -17,7 +17,8 @@ selected group. From your group page:
|
|||
|
||||
1. Go to **Epics**.
|
||||
1. Click **New epic**.
|
||||
1. Enter a descriptive title and click **Create epic**.
|
||||
1. Enter a descriptive title.
|
||||
1. Click **Create epic**.
|
||||
|
||||
You will be taken to the new epic where can edit the following details:
|
||||
|
||||
|
@ -29,8 +30,7 @@ You will be taken to the new epic where can edit the following details:
|
|||
|
||||
An epic's page contains the following tabs:
|
||||
|
||||
- **Epics and Issues**: epics and issues added to this epic. Child epics and their issues appear in
|
||||
a tree view.
|
||||
- **Epics and Issues**: epics and issues added to this epic. Child epics, and their issues, are shown in a tree view.
|
||||
- Click the <kbd>></kbd> beside a parent epic to reveal the child epics and issues.
|
||||
- Hover over the total counts to see a breakdown of open and closed items.
|
||||
- **Roadmap**: a roadmap view of child epics which have start and due dates.
|
||||
|
@ -121,6 +121,36 @@ The sort option and order is saved and used wherever you browse epics, including
|
|||
|
||||
![epics sort](img/epics_sort.png)
|
||||
|
||||
## Make an epic confidential
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213068) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.0.
|
||||
> - It's deployed behind a feature flag, disabled by default.
|
||||
> - It's disabled on GitLab.com.
|
||||
> - It's not recommended for production use.
|
||||
> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-confidential-epics-premium-only). **(PREMIUM ONLY)**
|
||||
|
||||
When you're creating an epic, you can make it confidential by selecting the **Make this epic
|
||||
confidential** checkbox.
|
||||
|
||||
### Enable Confidential Epics **(PREMIUM ONLY)**
|
||||
|
||||
The Confidential Epics feature is under development and not ready for production use. It's deployed behind a
|
||||
feature flag that is **disabled by default**.
|
||||
[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
|
||||
can enable it for your instance.
|
||||
|
||||
To enable it:
|
||||
|
||||
```ruby
|
||||
Feature.enable(:confidential_epics)
|
||||
```
|
||||
|
||||
To disable it:
|
||||
|
||||
```ruby
|
||||
Feature.disable(:confidential_epics)
|
||||
```
|
||||
|
||||
## Manage issues assigned to an epic
|
||||
|
||||
### Add an issue to an epic
|
||||
|
|
|
@ -12,7 +12,7 @@ projects.
|
|||
|
||||
## Cluster precedence
|
||||
|
||||
GitLab will try [to match](../../../ci/environments.md#scoping-environments-with-specs) clusters in
|
||||
GitLab will try [to match](../../../ci/environments/index.md#scoping-environments-with-specs) clusters in
|
||||
the following order:
|
||||
|
||||
- Project-level clusters.
|
||||
|
@ -20,11 +20,11 @@ the following order:
|
|||
- Instance-level clusters.
|
||||
|
||||
To be selected, the cluster must be enabled and
|
||||
match the [environment selector](../../../ci/environments.md#scoping-environments-with-specs).
|
||||
match the [environment selector](../../../ci/environments/index.md#scoping-environments-with-specs).
|
||||
|
||||
## Cluster environments **(PREMIUM)**
|
||||
|
||||
For a consolidated view of which CI [environments](../../../ci/environments.md)
|
||||
For a consolidated view of which CI [environments](../../../ci/environments/index.md)
|
||||
are deployed to the Kubernetes cluster, see the documentation for
|
||||
[cluster environments](../../clusters/environments.md).
|
||||
|
||||
|
|
|
@ -18,13 +18,15 @@ The Packages feature allows GitLab to act as a repository for the following:
|
|||
|
||||
## Enable the Package Registry for your project
|
||||
|
||||
If you cannot find the **{package}** **Packages & Registries > Package Registry** entry under your
|
||||
project's sidebar, it is not enabled in your GitLab instance. Ask your
|
||||
administrator to enable GitLab Package Registry following the [administration
|
||||
documentation](../../administration/packages/index.md).
|
||||
If you cannot find the **{package}** **Packages & Registries > Package
|
||||
Registry** entry under your project's sidebar, ensure that:
|
||||
|
||||
Once enabled for your GitLab instance, to enable Package Registry for your
|
||||
project:
|
||||
1. The GitLab Package Registry has been enabled by your administrator (following
|
||||
[this documentation](../../administration/packages/index.md)); and
|
||||
1. The Package Registry has been enabled for your project.
|
||||
|
||||
Once an administrator has enabled the GitLab Package Registry for your GitLab
|
||||
instance, to enable Package Registry for your project:
|
||||
|
||||
1. Go to your project's **Settings > General** page.
|
||||
1. Expand the **Visibility, project features, permissions** section and enable the
|
||||
|
|
|
@ -57,7 +57,7 @@ Some GitLab features may support versions outside the range provided here.
|
|||
### Deploy Boards **(PREMIUM)**
|
||||
|
||||
GitLab's Deploy Boards offer a consolidated view of the current health and
|
||||
status of each CI [environment](../../../ci/environments.md) running on Kubernetes,
|
||||
status of each CI [environment](../../../ci/environments/index.md) running on Kubernetes,
|
||||
displaying the status of the pods in the deployment. Developers and other
|
||||
teammates can view the progress and status of a rollout, pod by pod, in the
|
||||
workflow they already use without any need to access Kubernetes.
|
||||
|
@ -102,8 +102,8 @@ Kubernetes clusters can be used without Auto DevOps.
|
|||
|
||||
> Introduced in GitLab 8.15.
|
||||
|
||||
When enabled, the Kubernetes integration adds [web terminal](../../../ci/environments.md#web-terminals)
|
||||
support to your [environments](../../../ci/environments.md). This is based on the `exec` functionality found in
|
||||
When enabled, the Kubernetes integration adds [web terminal](../../../ci/environments/index.md#web-terminals)
|
||||
support to your [environments](../../../ci/environments/index.md). This is based on the `exec` functionality found in
|
||||
Docker and Kubernetes, so you get a new shell session within your existing
|
||||
containers. To use this integration, you should deploy to Kubernetes using
|
||||
the deployment variables above, ensuring any deployments, replica sets, and
|
||||
|
@ -205,7 +205,7 @@ you can either:
|
|||
### Setting the environment scope **(PREMIUM)**
|
||||
|
||||
When adding more than one Kubernetes cluster to your project, you need to differentiate
|
||||
them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments.md) similar to how the
|
||||
them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments/index.md) similar to how the
|
||||
[environment-specific variables](../../../ci/variables/README.md#limit-the-environment-scopes-of-environment-variables) work.
|
||||
|
||||
The default environment scope is `*`, which means all jobs, regardless of their
|
||||
|
@ -321,7 +321,7 @@ of the form `<project_name>-<project_id>-<environment>` (see [Deployment
|
|||
variables](#deployment-variables)).
|
||||
|
||||
For **non**-GitLab-managed clusters, the namespace can be customized using
|
||||
[`environment:kubernetes:namespace`](../../../ci/environments.md#configuring-kubernetes-deployments)
|
||||
[`environment:kubernetes:namespace`](../../../ci/environments/index.md#configuring-kubernetes-deployments)
|
||||
in `.gitlab-ci.yml`.
|
||||
|
||||
NOTE: **Note:** When using a [GitLab-managed cluster](#gitlab-managed-clusters), the
|
||||
|
@ -349,7 +349,7 @@ Reasons for failure include:
|
|||
- The token you gave GitLab does not have [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles)
|
||||
privileges required by GitLab.
|
||||
- Missing `KUBECONFIG` or `KUBE_TOKEN` variables. To be passed to your job, they must have a matching
|
||||
[`environment:name`](../../../ci/environments.md#defining-environments). If your job has no
|
||||
[`environment:name`](../../../ci/environments/index.md#defining-environments). If your job has no
|
||||
`environment:name` set, it will not be passed the Kubernetes credentials.
|
||||
|
||||
NOTE: **NOTE:**
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/1589) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.0.
|
||||
|
||||
GitLab's Deploy Boards offer a consolidated view of the current health and
|
||||
status of each CI [environment](../../ci/environments.md) running on [Kubernetes](https://kubernetes.io), displaying the status
|
||||
status of each CI [environment](../../ci/environments/index.md) running on [Kubernetes](https://kubernetes.io), displaying the status
|
||||
of the pods in the deployment. Developers and other teammates can view the
|
||||
progress and status of a rollout, pod by pod, in the workflow they already use
|
||||
without any need to access Kubernetes.
|
||||
|
@ -57,9 +57,9 @@ specific environment, there are a lot of use cases. To name a few:
|
|||
|
||||
## Enabling Deploy Boards
|
||||
|
||||
To display the Deploy Boards for a specific [environment](../../ci/environments.md) you should:
|
||||
To display the Deploy Boards for a specific [environment](../../ci/environments/index.md) you should:
|
||||
|
||||
1. Have [defined an environment](../../ci/environments.md#defining-environments) with a deploy stage.
|
||||
1. Have [defined an environment](../../ci/environments/index.md#defining-environments) with a deploy stage.
|
||||
|
||||
1. Have a Kubernetes cluster up and running.
|
||||
|
||||
|
@ -113,7 +113,7 @@ metadata:
|
|||
name: "APPLICATION_NAME"
|
||||
annotations:
|
||||
app.gitlab.com/app: ${CI_PROJECT_PATH_SLUG}
|
||||
app.gitlab.com/env: ${CI_ENVIRONMENT_SLUG}
|
||||
app.gitlab.com/env: ${CI_ENVIRONMENT_SLUG}
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
|
@ -146,5 +146,5 @@ version of your application.
|
|||
|
||||
- [GitLab Autodeploy](../../topics/autodevops/stages.md#auto-deploy)
|
||||
- [GitLab CI/CD environment variables](../../ci/variables/README.md)
|
||||
- [Environments and deployments](../../ci/environments.md)
|
||||
- [Environments and deployments](../../ci/environments/index.md)
|
||||
- [Kubernetes deploy example](https://gitlab.com/gitlab-examples/kubernetes-deploy)
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
|
@ -72,6 +72,25 @@ It enables you to search as you type through all environments and select the one
|
|||
|
||||
![Monitoring Dashboard Environments](img/prometheus_dashboard_environments_v12_8.png)
|
||||
|
||||
##### Select a dashboard
|
||||
|
||||
The **dashboard** dropdown box above the dashboard displays the list of all dashboards available for the project.
|
||||
It enables you to search as you type through all dashboards and select the one you're looking for.
|
||||
|
||||
![Monitoring Dashboard select](img/prometheus_dashboard_select_v_13_0.png)
|
||||
|
||||
##### Mark a dashboard as favorite
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214582) in GitLab 13.0.
|
||||
|
||||
When viewing a dashboard, click the empty **Star dashboard** **{star-o}** button to mark a
|
||||
dashboard as a favorite. Starred dashboards display a solid star **{star}** button,
|
||||
and appear at the top of the dashboard select list.
|
||||
|
||||
To remove dashboard from the favorites list, click the solid **Unstar Dashboard** **{star}** button.
|
||||
|
||||
![Monitoring Dashboard favorite state toggle](img/toggle_metrics_user_starred_dashboard_v13_0.png)
|
||||
|
||||
#### About managed Prometheus deployments
|
||||
|
||||
Prometheus is deployed into the `gitlab-managed-apps` namespace, using the [official Helm chart](https://github.com/helm/charts/tree/master/stable/prometheus). Prometheus is only accessible within the cluster, with GitLab communicating through the [Kubernetes API](https://kubernetes.io/docs/concepts/overview/kubernetes-api/).
|
||||
|
@ -145,7 +164,7 @@ one of them will be used:
|
|||
[Cluster precedence](../../instance/clusters/index.md#cluster-precedence).
|
||||
- If you have managed Prometheus applications installed on multiple Kubernetes
|
||||
clusters at the **same** level, the Prometheus application of a cluster with a
|
||||
matching [environment scope](../../../ci/environments.md#scoping-environments-with-specs) is used.
|
||||
matching [environment scope](../../../ci/environments/index.md#scoping-environments-with-specs) is used.
|
||||
|
||||
## Monitoring CI/CD Environments
|
||||
|
||||
|
@ -154,7 +173,7 @@ environment which has had a successful deployment.
|
|||
|
||||
GitLab will automatically scan the Prometheus server for metrics from known servers like Kubernetes and NGINX, and attempt to identify individual environments. The supported metrics and scan process is detailed in our [Prometheus Metrics Library documentation](prometheus_library/index.md).
|
||||
|
||||
You can view the performance dashboard for an environment by [clicking on the monitoring button](../../../ci/environments.md#monitoring-environments).
|
||||
You can view the performance dashboard for an environment by [clicking on the monitoring button](../../../ci/environments/index.md#monitoring-environments).
|
||||
|
||||
### Adding custom metrics
|
||||
|
||||
|
@ -180,6 +199,8 @@ Multiple metrics can be displayed on the same chart if the fields **Name**, **Ty
|
|||
|
||||
#### Query Variables
|
||||
|
||||
##### Predefined variables
|
||||
|
||||
GitLab supports a limited set of [CI variables](../../../ci/variables/README.md) in the Prometheus query. This is particularly useful for identifying a specific environment, for example with `ci_environment_slug`. The supported variables are:
|
||||
|
||||
- `ci_environment_slug`
|
||||
|
@ -192,6 +213,12 @@ GitLab supports a limited set of [CI variables](../../../ci/variables/README.md)
|
|||
NOTE: **Note:**
|
||||
Variables for Prometheus queries must be lowercase.
|
||||
|
||||
##### User-defined variables
|
||||
|
||||
[Variables can be defined](#templating-templating-properties) in a custom dashboard YAML file.
|
||||
|
||||
##### Using variables
|
||||
|
||||
Variables can be specified using double curly braces, such as `"{{ci_environment_slug}}"` ([added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20793) in GitLab 12.7).
|
||||
|
||||
Support for the `"%{ci_environment_slug}"` format was
|
||||
|
@ -303,19 +330,29 @@ If you select another branch, this branch should be merged to your **default** b
|
|||
|
||||
Dashboards have several components:
|
||||
|
||||
- Templating variables.
|
||||
- Panel groups, which consist of panels.
|
||||
- Panels, which support one or more metrics.
|
||||
|
||||
The following tables outline the details of expected properties.
|
||||
|
||||
**Dashboard properties:**
|
||||
##### **Dashboard (top-level) properties**
|
||||
|
||||
| Property | Type | Required | Description |
|
||||
| ------ | ------ | ------ | ------ |
|
||||
| `dashboard` | string | yes | Heading for the dashboard. Only one dashboard should be defined per file. |
|
||||
| `panel_groups` | array | yes | The panel groups which should be on the dashboard. |
|
||||
| `templating` | Hash | no | Top level key under which templating related options can be added. |
|
||||
|
||||
**Panel group (`panel_groups`) properties:**
|
||||
##### **Templating (`templating`) properties**
|
||||
|
||||
| Property | Type | Required | Description |
|
||||
| -------- | ---- | -------- | ----------- |
|
||||
| `variables` | Hash | no | Variables can be defined here. |
|
||||
|
||||
Read the documentation on [templating](#templating-variables-for-metrics-dashboards).
|
||||
|
||||
##### **Panel group (`panel_groups`) properties**
|
||||
|
||||
| Property | Type | Required | Description |
|
||||
| ------ | ------ | ------ | ------ |
|
||||
|
@ -323,7 +360,7 @@ The following tables outline the details of expected properties.
|
|||
| `priority` | number | optional, defaults to order in file | Order to appear on the dashboard. Higher number means higher priority, which will be higher on the page. Numbers do not need to be consecutive. |
|
||||
| `panels` | array | required | The panels which should be in the panel group. |
|
||||
|
||||
**Panel (`panels`) properties:**
|
||||
##### **Panel (`panels`) properties**
|
||||
|
||||
| Property | Type | Required | Description |
|
||||
| ------ | ------ | ------ | ------- |
|
||||
|
@ -335,7 +372,7 @@ The following tables outline the details of expected properties.
|
|||
| `weight` | number | no, defaults to order in file | Order to appear within the grouping. Lower number means higher priority, which will be higher on the page. Numbers do not need to be consecutive. |
|
||||
| `metrics` | array | yes | The metrics which should be displayed in the panel. Any number of metrics can be displayed when `type` is `area-chart` or `line-chart`, whereas only 3 can be displayed when `type` is `anomaly-chart`. |
|
||||
|
||||
**Axis (`panels[].y_axis`) properties:**
|
||||
##### **Axis (`panels[].y_axis`) properties**
|
||||
|
||||
| Property | Type | Required | Description |
|
||||
| ----------- | ------ | ----------------------------- | -------------------------------------------------------------------- |
|
||||
|
@ -343,7 +380,7 @@ The following tables outline the details of expected properties.
|
|||
| `format` | string | no, defaults to `engineering` | Unit format used. See the [full list of units](prometheus_units.md). |
|
||||
| `precision` | number | no, defaults to `2` | Number of decimal places to display in the number. | |
|
||||
|
||||
**Metrics (`metrics`) properties:**
|
||||
##### **Metrics (`metrics`) properties**
|
||||
|
||||
| Property | Type | Required | Description |
|
||||
| ------ | ------ | ------ | ------ |
|
||||
|
@ -652,6 +689,106 @@ Note the following properties:
|
|||
|
||||
![heatmap panel type](img/heatmap_panel_type.png)
|
||||
|
||||
### Templating variables for metrics dashboards
|
||||
|
||||
Templating variables can be used to make your metrics dashboard more versatile.
|
||||
|
||||
#### Templating variable types
|
||||
|
||||
`templating` is a top-level key in the
|
||||
[dashboard YAML](#dashboard-top-level-properties).
|
||||
Define your variables in the `variables` key, under `templating`. The value of
|
||||
the `variables` key should be a hash, and each key under `variables`
|
||||
defines a templating variable on the dashboard.
|
||||
|
||||
A variable can be used in a Prometheus query in the same dashboard using the syntax
|
||||
described [here](#using-variables).
|
||||
|
||||
##### `text` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
For each `text` variable defined in the dashboard YAML, there will be a free text
|
||||
box on the dashboard UI, allowing you to enter a value for each variable.
|
||||
|
||||
The `text` variable type supports a simple and a full syntax.
|
||||
|
||||
###### Simple syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value
|
||||
of `default value`:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: 'default value' # `text` type variable with `default value` as its default.
|
||||
```
|
||||
|
||||
###### Full syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `default`.
|
||||
The label for the text box on the UI will be the value of the `label` key:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: # The variable name that can be used in queries.
|
||||
label: 'Variable 1' # (Optional) label that will appear in the UI for this text box.
|
||||
type: text
|
||||
options:
|
||||
default_value: 'default' # (Optional) default value.
|
||||
```
|
||||
|
||||
##### `custom` variable type
|
||||
|
||||
CAUTION: **Warning:**
|
||||
This variable type is an _alpha_ feature, and is subject to change at any time
|
||||
without prior notice!
|
||||
|
||||
Each `custom` variable defined in the dashboard YAML creates a dropdown
|
||||
selector on the dashboard UI, allowing you to select a value for each variable.
|
||||
|
||||
The `custom` variable type supports a simple and a full syntax.
|
||||
|
||||
###### Simple syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `value1`.
|
||||
The dashboard UI will display a dropdown with `value1`, `value2` and `value3`
|
||||
as the choices.
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: ['value1', 'value2', 'value3']
|
||||
```
|
||||
|
||||
###### Full syntax
|
||||
|
||||
This example creates a variable called `variable1`, with a default value of `var1_option_2`.
|
||||
The label for the text box on the UI will be the value of the `label` key.
|
||||
The dashboard UI will display a dropdown with `Option 1` and `Option 2`
|
||||
as the choices.
|
||||
|
||||
If you select `Option 1` from the dropdown, the variable will be replaced with `value option 1`.
|
||||
Similarly, if you select `Option 2`, the variable will be replaced with `value_option_2`:
|
||||
|
||||
```yaml
|
||||
templating:
|
||||
variables:
|
||||
variable1: # The variable name that can be used in queries.
|
||||
label: 'Variable 1' # (Optional) label that will appear in the UI for this dropdown.
|
||||
type: custom
|
||||
options:
|
||||
values:
|
||||
- value: 'value option 1' # The value that will replace the variable in queries.
|
||||
text: 'Option 1' # (Optional) Text that will appear in the UI dropdown.
|
||||
- value: 'value_option_2'
|
||||
text: 'Option 2'
|
||||
default: true # (Optional) This option should be the default value of this variable.
|
||||
```
|
||||
|
||||
### View and edit the source file of a custom dashboard
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/34779) in GitLab 12.5.
|
||||
|
@ -764,7 +901,7 @@ receivers:
|
|||
...
|
||||
```
|
||||
|
||||
In order for GitLab to associate your alerts with an [environment](../../../ci/environments.md), you need to configure a `gitlab_environment_name` label on the alerts you set up in Prometheus. The value of this should match the name of your Environment in GitLab.
|
||||
In order for GitLab to associate your alerts with an [environment](../../../ci/environments/index.md), you need to configure a `gitlab_environment_name` label on the alerts you set up in Prometheus. The value of this should match the name of your Environment in GitLab.
|
||||
|
||||
### Taking action on incidents **(ULTIMATE)**
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ you will be able to see:
|
|||
- Both pre and post-merge pipelines and the environment information if any.
|
||||
- Which deployments are in progress.
|
||||
|
||||
If there's an [environment](../../../ci/environments.md) and the application is
|
||||
If there's an [environment](../../../ci/environments/index.md) and the application is
|
||||
successfully deployed to it, the deployed environment and the link to the
|
||||
Review App will be shown as well.
|
||||
|
||||
|
|
|
@ -64,3 +64,16 @@ Standard alert statuses include `triggered`, `acknowledged`, and `resolved`:
|
|||
- **Triggered**: No one has begun investigation.
|
||||
- **Acknowledged**: Someone is actively investigating the problem.
|
||||
- **Resolved**: No further work is required.
|
||||
|
||||
## Alert Management details
|
||||
|
||||
NOTE: **Note:**
|
||||
You will need at least Developer [permissions](../../permissions.md) to view Alert Management details.
|
||||
|
||||
Navigate to the Alert Management detail view by visiting the [Alert Management list](#alert-management-list) and selecting an Alert from the list.
|
||||
|
||||
![Alert Management Detail View](img/alert_detail_v13_0.png)
|
||||
|
||||
### Update an Alert's status
|
||||
|
||||
The Alert Management detail view allows users to update the Alert Status. See [Alert Management statuses](#alert-management-statuses) for more details.
|
||||
|
|
|
@ -73,22 +73,22 @@ For example, you may not want to enable a feature flag on production until your
|
|||
first confirmed that the feature is working correctly on testing environments.
|
||||
|
||||
To handle these situations, you can enable a feature flag on a particular environment
|
||||
with [Environment specs](../../../ci/environments.md#scoping-environments-with-specs).
|
||||
with [Environment specs](../../../ci/environments/index.md#scoping-environments-with-specs).
|
||||
You can define multiple specs per flag so that you can control your feature flag more granularly.
|
||||
|
||||
To define specs for each environment:
|
||||
|
||||
1. Navigate to your project's **Operations > Feature Flags**.
|
||||
1. Click on the **New Feature Flag** button or edit an existing flag.
|
||||
1. Set the status of the default [spec](../../../ci/environments.md#scoping-environments-with-specs) (`*`). Choose a rollout strategy. This status and rollout strategy combination will be used for _all_ environments.
|
||||
1. If you want to enable/disable the feature on a specific environment, create a new [spec](../../../ci/environments.md#scoping-environments-with-specs) and type the environment name.
|
||||
1. Set the status of the default [spec](../../../ci/environments/index.md#scoping-environments-with-specs) (`*`). Choose a rollout strategy. This status and rollout strategy combination will be used for _all_ environments.
|
||||
1. If you want to enable/disable the feature on a specific environment, create a new [spec](../../../ci/environments/index.md#scoping-environments-with-specs) and type the environment name.
|
||||
1. Set the status and rollout strategy of the additional spec. This status and rollout strategy combination takes precedence over the default spec since we always use the most specific match available.
|
||||
1. Click **Create feature flag** or **Update feature flag**.
|
||||
|
||||
![Feature flag specs list](img/specs_list_v12_6.png)
|
||||
|
||||
NOTE: **NOTE**
|
||||
We'd highly recommend you to use the [Environment](../../../ci/environments.md)
|
||||
We'd highly recommend you to use the [Environment](../../../ci/environments/index.md)
|
||||
feature in order to quickly assess which flag is enabled per environment.
|
||||
|
||||
## Feature flag behavior change in 13.0
|
||||
|
@ -122,7 +122,7 @@ make a strategy apply to a specific environment spec:
|
|||
|
||||
1. Click the **Add Environment** button.
|
||||
1. Create a new
|
||||
[spec](../../../ci/environments.md#scoping-environments-with-specs).
|
||||
[spec](../../../ci/environments/index.md#scoping-environments-with-specs).
|
||||
|
||||
To apply the strategy to multiple environment specs, repeat these steps.
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
|
@ -4,7 +4,7 @@ GitLab provides a variety of tools to help operate and maintain
|
|||
your applications:
|
||||
|
||||
- Collect [Prometheus metrics](../integrations/prometheus_library/index.md).
|
||||
- Deploy to different [environments](../../../ci/environments.md).
|
||||
- Deploy to different [environments](../../../ci/environments/index.md).
|
||||
- Connect your project to a [Kubernetes cluster](../clusters/index.md).
|
||||
- Manage your infrastructure with [Infrastructure as Code](../../infrastructure/index.md) approaches.
|
||||
- Discover and view errors generated by your applications with [Error Tracking](error_tracking.md).
|
||||
|
|
|
@ -13,7 +13,7 @@ You can add a button to the Monitoring dashboard linking directly to your existi
|
|||
![External Dashboard Settings](img/external_dashboard_settings.png)
|
||||
|
||||
1. There should now be a button on your
|
||||
[Monitoring dashboard](../../../ci/environments.md#monitoring-environments) which
|
||||
[Monitoring dashboard](../../../ci/environments/index.md#monitoring-environments) which
|
||||
will open the URL you entered in the above step.
|
||||
|
||||
![External Dashboard Link](img/external_dashboard_link.png)
|
||||
|
|
|
@ -23,19 +23,19 @@ Press `t` to launch the File search function when in **Issues**,
|
|||
|
||||
Start typing what you are searching for and watch the magic happen. With the
|
||||
up/down arrows, you go up and down the results, with `Esc` you close the search
|
||||
and go back to **Files**.
|
||||
and go back to **Files**
|
||||
|
||||
## How it works
|
||||
|
||||
The File finder feature is powered by the [Fuzzy filter](https://github.com/jeancroy/fuzz-aldrin-plus) library.
|
||||
|
||||
It implements a fuzzy search with highlight, and tries to provide intuitive
|
||||
It implements a fuzzy search with the highlight and tries to provide intuitive
|
||||
results by recognizing patterns that people use while searching.
|
||||
|
||||
For example, consider the [GitLab FOSS repository](https://gitlab.com/gitlab-org/gitlab-foss/tree/master) and that we want to open
|
||||
the `app/controllers/admin/deploy_keys_controller.rb` file.
|
||||
|
||||
Using fuzzy search, we start by typing letters that get us closer to the file.
|
||||
Using a fuzzy search, we start by typing letters that get us closer to the file.
|
||||
|
||||
**Tip:** To narrow down your search, include `/` in your search terms.
|
||||
|
||||
|
|
|
@ -24,7 +24,8 @@ module API
|
|||
Gitlab::GrapeLogging::Loggers::ExceptionLogger.new,
|
||||
Gitlab::GrapeLogging::Loggers::QueueDurationLogger.new,
|
||||
Gitlab::GrapeLogging::Loggers::PerfLogger.new,
|
||||
Gitlab::GrapeLogging::Loggers::CorrelationIdLogger.new
|
||||
Gitlab::GrapeLogging::Loggers::CorrelationIdLogger.new,
|
||||
Gitlab::GrapeLogging::Loggers::ContextLogger.new
|
||||
]
|
||||
|
||||
allow_access_with_scope :api
|
||||
|
|
|
@ -609,8 +609,8 @@ module API
|
|||
header(*Gitlab::Workhorse.send_git_archive(repository, **kwargs))
|
||||
end
|
||||
|
||||
def send_artifacts_entry(build, entry)
|
||||
header(*Gitlab::Workhorse.send_artifacts_entry(build, entry))
|
||||
def send_artifacts_entry(file, entry)
|
||||
header(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
|
||||
end
|
||||
|
||||
# The Grape Error Middleware only has access to `env` but not `params` nor
|
||||
|
|
|
@ -54,7 +54,7 @@ module API
|
|||
|
||||
bad_request! unless path.valid?
|
||||
|
||||
send_artifacts_entry(build, path)
|
||||
send_artifacts_entry(build.artifacts_file, path)
|
||||
end
|
||||
|
||||
desc 'Download the artifacts archive from a job' do
|
||||
|
@ -90,7 +90,7 @@ module API
|
|||
|
||||
bad_request! unless path.valid?
|
||||
|
||||
send_artifacts_entry(build, path)
|
||||
send_artifacts_entry(build.artifacts_file, path)
|
||||
end
|
||||
|
||||
desc 'Keep the artifacts to prevent them from being deleted' do
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# This module adds additional correlation id the grape logger
|
||||
module Gitlab
|
||||
module GrapeLogging
|
||||
module Loggers
|
||||
class ContextLogger < ::GrapeLogging::Loggers::Base
|
||||
def parameters(_, _)
|
||||
Labkit::Context.current.to_h
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -23,6 +23,8 @@ module Gitlab
|
|||
queue_duration_s: event.payload[:queue_duration_s]
|
||||
}
|
||||
|
||||
payload.merge!(event.payload[:metadata]) if event.payload[:metadata]
|
||||
|
||||
::Gitlab::InstrumentationHelper.add_instrumentation_data(payload)
|
||||
|
||||
payload[:response] = event.payload[:response] if event.payload[:response]
|
||||
|
|
|
@ -114,6 +114,7 @@ module Gitlab
|
|||
issues_with_associated_zoom_link: count(ZoomMeeting.added_to_issue),
|
||||
issues_using_zoom_quick_actions: distinct_count(ZoomMeeting, :issue_id),
|
||||
issues_with_embedded_grafana_charts_approx: grafana_embed_usage_data,
|
||||
issues_created_gitlab_alerts: count(Issue.with_alert_management_alerts.not_authored_by(::User.alert_bot)),
|
||||
incident_issues: alert_bot_incident_count,
|
||||
alert_bot_incident_issues: alert_bot_incident_count,
|
||||
incident_labeled_issues: count(::Issue.with_label_attributes(IncidentManagement::CreateIssueService::INCIDENT_LABEL)),
|
||||
|
|
|
@ -130,8 +130,7 @@ module Gitlab
|
|||
]
|
||||
end
|
||||
|
||||
def send_artifacts_entry(build, entry)
|
||||
file = build.artifacts_file
|
||||
def send_artifacts_entry(file, entry)
|
||||
archive = file.file_storage? ? file.path : file.url
|
||||
|
||||
params = {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue