提交 f675c7d4 编写于 作者: G GitLab Bot

Add latest changes from gitlab-org/gitlab@master

上级 0574192d
<script> <script>
import { GlButton } from '@gitlab/ui';
import footerEEMixin from 'ee_else_ce/boards/mixins/modal_footer'; import footerEEMixin from 'ee_else_ce/boards/mixins/modal_footer';
import { deprecatedCreateFlash as Flash } from '../../../flash'; import { deprecatedCreateFlash as Flash } from '../../../flash';
import { __, n__ } from '../../../locale'; import { __, n__ } from '../../../locale';
...@@ -10,6 +11,7 @@ import boardsStore from '../../stores/boards_store'; ...@@ -10,6 +11,7 @@ import boardsStore from '../../stores/boards_store';
export default { export default {
components: { components: {
ListsDropdown, ListsDropdown,
GlButton,
}, },
mixins: [modalMixin, footerEEMixin], mixins: [modalMixin, footerEEMixin],
data() { data() {
...@@ -65,14 +67,14 @@ export default { ...@@ -65,14 +67,14 @@ export default {
<template> <template>
<footer class="form-actions add-issues-footer"> <footer class="form-actions add-issues-footer">
<div class="float-left"> <div class="float-left">
<button :disabled="submitDisabled" class="btn btn-success" type="button" @click="addIssues"> <gl-button :disabled="submitDisabled" category="primary" variant="success" @click="addIssues">
{{ submitText }} {{ submitText }}
</button> </gl-button>
<span class="inline add-issues-footer-to-list">{{ __('to list') }}</span> <span class="inline add-issues-footer-to-list">{{ __('to list') }}</span>
<lists-dropdown /> <lists-dropdown />
</div> </div>
<button class="btn btn-default float-right" type="button" @click="toggleModal(false)"> <gl-button class="float-right" @click="toggleModal(false)">
{{ __('Cancel') }} {{ __('Cancel') }}
</button> </gl-button>
</footer> </footer>
</template> </template>
<script> <script>
import { GlLink } from '@gitlab/ui'; import { GlIcon, GlLink } from '@gitlab/ui';
import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import timeagoMixin from '~/vue_shared/mixins/timeago'; import timeagoMixin from '~/vue_shared/mixins/timeago';
export default { export default {
components: { components: {
TimeagoTooltip, TimeagoTooltip,
GlIcon,
GlLink, GlLink,
}, },
mixins: [timeagoMixin], mixins: [timeagoMixin],
...@@ -14,6 +15,10 @@ export default { ...@@ -14,6 +15,10 @@ export default {
type: Object, type: Object,
required: true, required: true,
}, },
helpUrl: {
type: String,
required: true,
},
}, },
computed: { computed: {
isExpired() { isExpired() {
...@@ -40,6 +45,14 @@ export default { ...@@ -40,6 +45,14 @@ export default {
<span v-if="isExpired">{{ s__('Job|The artifacts were removed') }}</span> <span v-if="isExpired">{{ s__('Job|The artifacts were removed') }}</span>
<span v-if="willExpire">{{ s__('Job|The artifacts will be removed') }}</span> <span v-if="willExpire">{{ s__('Job|The artifacts will be removed') }}</span>
<timeago-tooltip v-if="artifact.expire_at" :time="artifact.expire_at" /> <timeago-tooltip v-if="artifact.expire_at" :time="artifact.expire_at" />
<gl-link
:href="helpUrl"
target="_blank"
rel="noopener noreferrer nofollow"
data-testid="artifact-expired-help-link"
>
<gl-icon name="question" />
</gl-link>
</p> </p>
<p v-else-if="isLocked" class="build-detail-row"> <p v-else-if="isLocked" class="build-detail-row">
<span data-testid="job-locked-message">{{ <span data-testid="job-locked-message">{{
......
...@@ -38,6 +38,11 @@ export default { ...@@ -38,6 +38,11 @@ export default {
}, },
mixins: [delayedJobMixin], mixins: [delayedJobMixin],
props: { props: {
artifactHelpUrl: {
type: String,
required: false,
default: '',
},
runnerSettingsUrl: { runnerSettingsUrl: {
type: String, type: String,
required: false, required: false,
...@@ -319,6 +324,7 @@ export default { ...@@ -319,6 +324,7 @@ export default {
'right-sidebar-expanded': isSidebarOpen, 'right-sidebar-expanded': isSidebarOpen,
'right-sidebar-collapsed': !isSidebarOpen, 'right-sidebar-collapsed': !isSidebarOpen,
}" }"
:artifact-help-url="artifactHelpUrl"
:runner-help-url="runnerHelpUrl" :runner-help-url="runnerHelpUrl"
data-testid="job-sidebar" data-testid="job-sidebar"
/> />
......
...@@ -29,6 +29,11 @@ export default { ...@@ -29,6 +29,11 @@ export default {
}, },
mixins: [timeagoMixin], mixins: [timeagoMixin],
props: { props: {
artifactHelpUrl: {
type: String,
required: false,
default: '',
},
runnerHelpUrl: { runnerHelpUrl: {
type: String, type: String,
required: false, required: false,
...@@ -208,7 +213,7 @@ export default { ...@@ -208,7 +213,7 @@ export default {
</p> </p>
</div> </div>
<artifacts-block v-if="hasArtifact" :artifact="job.artifact" /> <artifacts-block v-if="hasArtifact" :artifact="job.artifact" :help-url="artifactHelpUrl" />
<trigger-block v-if="hasTriggers" :trigger="job.trigger" /> <trigger-block v-if="hasTriggers" :trigger="job.trigger" />
<commit-block <commit-block
:is-last-block="hasStages" :is-last-block="hasStages"
......
...@@ -18,6 +18,7 @@ export default () => { ...@@ -18,6 +18,7 @@ export default () => {
}, },
render(createElement) { render(createElement) {
const { const {
artifactHelpUrl,
deploymentHelpUrl, deploymentHelpUrl,
runnerHelpUrl, runnerHelpUrl,
runnerSettingsUrl, runnerSettingsUrl,
...@@ -32,6 +33,7 @@ export default () => { ...@@ -32,6 +33,7 @@ export default () => {
return createElement('job-app', { return createElement('job-app', {
props: { props: {
artifactHelpUrl,
deploymentHelpUrl, deploymentHelpUrl,
runnerHelpUrl, runnerHelpUrl,
runnerSettingsUrl, runnerSettingsUrl,
......
<script> <script>
/* eslint-disable vue/no-v-html */
import { import {
GlLink, GlLink,
GlButton, GlButton,
...@@ -8,6 +7,7 @@ import { ...@@ -8,6 +7,7 @@ import {
GlTooltipDirective, GlTooltipDirective,
GlTooltip, GlTooltip,
GlBadge, GlBadge,
GlSafeHtmlDirective as SafeHtml,
} from '@gitlab/ui'; } from '@gitlab/ui';
import { VISIBILITY_TYPE_ICON, GROUP_VISIBILITY_TYPE } from '~/groups/constants'; import { VISIBILITY_TYPE_ICON, GROUP_VISIBILITY_TYPE } from '~/groups/constants';
import { __ } from '~/locale'; import { __ } from '~/locale';
...@@ -24,6 +24,7 @@ export default { ...@@ -24,6 +24,7 @@ export default {
}, },
directives: { directives: {
GlTooltip: GlTooltipDirective, GlTooltip: GlTooltipDirective,
SafeHtml,
}, },
props: { props: {
group: { group: {
...@@ -120,7 +121,7 @@ export default { ...@@ -120,7 +121,7 @@ export default {
</span> </span>
</div> </div>
<div v-if="group.description" class="description"> <div v-if="group.description" class="description">
<span v-html="group.markdown_description"> </span> <span v-safe-html="group.markdown_description"> </span>
</div> </div>
</div> </div>
<div class="gl-display-flex gl-flex-shrink-0"> <div class="gl-display-flex gl-flex-shrink-0">
......
...@@ -198,7 +198,7 @@ table { ...@@ -198,7 +198,7 @@ table {
} }
.severity { .severity {
width: 9%; width: 10%;
} }
.identifier { .identifier {
......
...@@ -6,6 +6,7 @@ module Ci ...@@ -6,6 +6,7 @@ module Ci
{ {
"endpoint" => project_job_path(@project, @build, format: :json), "endpoint" => project_job_path(@project, @build, format: :json),
"project_path" => @project.full_path, "project_path" => @project.full_path,
"artifact_help_url" => help_page_path('user/gitlab_com/index.html', anchor: 'gitlab-cicd'),
"deployment_help_url" => help_page_path('user/project/clusters/index.html', anchor: 'troubleshooting'), "deployment_help_url" => help_page_path('user/project/clusters/index.html', anchor: 'troubleshooting'),
"runner_help_url" => help_page_path('ci/runners/README.html', anchor: 'set-maximum-job-timeout-for-a-runner'), "runner_help_url" => help_page_path('ci/runners/README.html', anchor: 'set-maximum-job-timeout-for-a-runner'),
"runner_settings_url" => project_runners_path(@build.project, anchor: 'js-runners-settings'), "runner_settings_url" => project_runners_path(@build.project, anchor: 'js-runners-settings'),
......
---
title: Add the artifact expiration help url
merge_request: 39546
author: Gilang Gumilar
type: added
---
title: Replace v-html with v-safe-html in fork_groups_list_item.vue
merge_request: 41143
author: Kev @KevSlashNull
type: other
...@@ -98,16 +98,19 @@ module ObjectStorage ...@@ -98,16 +98,19 @@ module ObjectStorage
RemoteTempObjectID: object_name, RemoteTempObjectID: object_name,
ObjectStorage: { ObjectStorage: {
Provider: 'AzureRM', Provider: 'AzureRM',
AzureConfig: {
StorageDomain: config.azure_storage_domain
},
GoCloudConfig: { GoCloudConfig: {
URL: "azblob://#{bucket_name}" URL: azure_gocloud_url
} }
} }
} }
end end
def azure_gocloud_url
url = "azblob://#{bucket_name}"
url += "?domain=#{config.azure_storage_domain}" if config.azure_storage_domain.present?
url
end
def use_workhorse_s3_client? def use_workhorse_s3_client?
return false unless Feature.enabled?(:use_workhorse_s3_client, default_enabled: true) return false unless Feature.enabled?(:use_workhorse_s3_client, default_enabled: true)
return false unless config.use_iam_profile? || config.consolidated_settings? return false unless config.use_iam_profile? || config.consolidated_settings?
......
...@@ -8,7 +8,10 @@ describe('Artifacts block', () => { ...@@ -8,7 +8,10 @@ describe('Artifacts block', () => {
const createWrapper = propsData => const createWrapper = propsData =>
mount(ArtifactsBlock, { mount(ArtifactsBlock, {
propsData, propsData: {
helpUrl: 'help-url',
...propsData,
},
}); });
const findArtifactRemoveElt = () => wrapper.find('[data-testid="artifacts-remove-timeline"]'); const findArtifactRemoveElt = () => wrapper.find('[data-testid="artifacts-remove-timeline"]');
...@@ -68,6 +71,12 @@ describe('Artifacts block', () => { ...@@ -68,6 +71,12 @@ describe('Artifacts block', () => {
expect(trimText(findArtifactRemoveElt().text())).toBe( expect(trimText(findArtifactRemoveElt().text())).toBe(
`The artifacts were removed ${formattedDate}`, `The artifacts were removed ${formattedDate}`,
); );
expect(
findArtifactRemoveElt()
.find('[data-testid="artifact-expired-help-link"]')
.attributes('href'),
).toBe('help-url');
}); });
it('does not show the keep button', () => { it('does not show the keep button', () => {
...@@ -94,6 +103,12 @@ describe('Artifacts block', () => { ...@@ -94,6 +103,12 @@ describe('Artifacts block', () => {
expect(trimText(findArtifactRemoveElt().text())).toBe( expect(trimText(findArtifactRemoveElt().text())).toBe(
`The artifacts will be removed ${formattedDate}`, `The artifacts will be removed ${formattedDate}`,
); );
expect(
findArtifactRemoveElt()
.find('[data-testid="artifact-expired-help-link"]')
.attributes('href'),
).toBe('help-url');
}); });
it('renders the keep button', () => { it('renders the keep button', () => {
......
...@@ -33,6 +33,7 @@ describe('Job App', () => { ...@@ -33,6 +33,7 @@ describe('Job App', () => {
}; };
const props = { const props = {
artifactHelpUrl: 'help/artifact',
runnerHelpUrl: 'help/runner', runnerHelpUrl: 'help/runner',
deploymentHelpUrl: 'help/deployment', deploymentHelpUrl: 'help/deployment',
runnerSettingsUrl: 'settings/ci-cd/runners', runnerSettingsUrl: 'settings/ci-cd/runners',
......
...@@ -67,7 +67,7 @@ RSpec.describe Backup::Repository do ...@@ -67,7 +67,7 @@ RSpec.describe Backup::Repository do
end end
[4, 10].each do |max_storage_concurrency| [4, 10].each do |max_storage_concurrency|
context "max_storage_concurrency #{max_storage_concurrency}" do context "max_storage_concurrency #{max_storage_concurrency}", quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/241701' do
it 'creates the expected number of threads' do it 'creates the expected number of threads' do
expect(Thread).to receive(:new) expect(Thread).to receive(:new)
.exactly(storage_keys.length * (max_storage_concurrency + 1)).times .exactly(storage_keys.length * (max_storage_concurrency + 1)).times
......
...@@ -211,8 +211,7 @@ RSpec.describe ObjectStorage::DirectUpload do ...@@ -211,8 +211,7 @@ RSpec.describe ObjectStorage::DirectUpload do
expect(subject[:UseWorkhorseClient]).to be true expect(subject[:UseWorkhorseClient]).to be true
expect(subject[:RemoteTempObjectID]).to eq(object_name) expect(subject[:RemoteTempObjectID]).to eq(object_name)
expect(subject[:ObjectStorage][:Provider]).to eq('AzureRM') expect(subject[:ObjectStorage][:Provider]).to eq('AzureRM')
expect(subject[:ObjectStorage][:AzureConfig][:StorageDomain]).to eq(storage_domain) expect(subject[:ObjectStorage][:GoCloudConfig]).to eq({ URL: gocloud_url })
expect(subject[:ObjectStorage][:GoCloudConfig]).to eq({ URL: "azblob://#{bucket_name}" })
end end
end end
...@@ -399,6 +398,7 @@ RSpec.describe ObjectStorage::DirectUpload do ...@@ -399,6 +398,7 @@ RSpec.describe ObjectStorage::DirectUpload do
let(:has_length) { false } let(:has_length) { false }
let(:storage_domain) { nil } let(:storage_domain) { nil }
let(:storage_url) { 'https://azuretest.blob.core.windows.net' } let(:storage_url) { 'https://azuretest.blob.core.windows.net' }
let(:gocloud_url) { "azblob://#{bucket_name}" }
it_behaves_like 'a valid AzureRM upload' it_behaves_like 'a valid AzureRM upload'
it_behaves_like 'a valid upload without multipart data' it_behaves_like 'a valid upload without multipart data'
...@@ -406,6 +406,7 @@ RSpec.describe ObjectStorage::DirectUpload do ...@@ -406,6 +406,7 @@ RSpec.describe ObjectStorage::DirectUpload do
context 'when a custom storage domain is used' do context 'when a custom storage domain is used' do
let(:storage_domain) { 'blob.core.chinacloudapi.cn' } let(:storage_domain) { 'blob.core.chinacloudapi.cn' }
let(:storage_url) { "https://azuretest.#{storage_domain}" } let(:storage_url) { "https://azuretest.#{storage_domain}" }
let(:gocloud_url) { "azblob://#{bucket_name}?domain=#{storage_domain}" }
before do before do
credentials[:azure_storage_domain] = storage_domain credentials[:azure_storage_domain] = storage_domain
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册