Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-11-15 18:09:13 +00:00
parent 4279dbc29c
commit 2eafcb0673
125 changed files with 1446 additions and 737 deletions

View File

@ -99,7 +99,7 @@ variables:
GIT_SUBMODULE_STRATEGY: "none"
GET_SOURCES_ATTEMPTS: "3"
DEBIAN_VERSION: "bullseye"
CHROME_VERSION: "103"
CHROME_VERSION: "106"
DOCKER_VERSION: "20.10.14"
RUBY_VERSION: "2.7"
GO_VERSION: "1.18"

View File

@ -2,7 +2,7 @@
# project here: https://gitlab.com/gitlab-org/gitlab/-/project_members
# As described in https://docs.gitlab.com/ee/user/project/code_owners.html
* @gitlab-org/maintainers/rails-backend @gitlab-org/maintainers/frontend @gitlab-org/maintainers/database @gl-quality/qe-maintainers @gitlab-org/delivery @gitlab-org/maintainers/cicd-templates @nolith @jacobvosmaer-gitlab @gitlab-org/tw-leadership
* @gitlab-org/maintainers/rails-backend @gitlab-org/maintainers/frontend @gitlab-org/maintainers/database @gl-quality/qe-maintainers @gl-quality/tooling-maintainers @gitlab-org/delivery @gitlab-org/maintainers/cicd-templates @nolith @jacobvosmaer-gitlab @gitlab-org/tw-leadership
CODEOWNERS @gitlab-org/development-leaders @gitlab-org/tw-leadership
docs/CODEOWNERS @gitlab-org/development-leaders @gitlab-org/tw-leadership

View File

@ -88,17 +88,6 @@ update-assets-compile-test-cache:
- echo -n "${GITLAB_ASSETS_HASH}" > "cached-assets-hash.txt"
artifacts: {} # This job's purpose is only to update the cache.
# TODO: Remove this as it's duplicating update-assets-compile-*-cache
update-yarn-cache:
extends:
- .default-retry
- .default-utils-before_script
- .yarn-cache-push
- .shared:rules:update-cache
stage: prepare
script:
- yarn_install_script
update-storybook-yarn-cache:
extends:
- .default-retry

View File

@ -219,23 +219,16 @@
- *node-modules-cache
- *assets-tmp-cache
# TODO: Remove this as it's duplicating .assets-compile-cache-push
.yarn-cache-push:
cache:
- *node-modules-cache-push
.assets-compile-cache:
cache:
- *ruby-gems-cache
- *node-modules-cache
- *assets-cache
- *assets-tmp-cache
.assets-compile-cache-push:
cache:
- *ruby-gems-cache # We don't push this cache as it's already rebuilt by `update-setup-test-env-cache`
- *node-modules-cache-push
- *assets-cache-push
- *assets-tmp-cache-push
.storybook-yarn-cache:
@ -245,7 +238,7 @@
.storybook-yarn-cache-push:
cache:
- *node-modules-cache # We don't push this cache as it's already rebuilt by `update-yarn-cache`
- *node-modules-cache # We don't push this cache as it's already rebuilt by `update-assets-compile-*-cache`
- *storybook-node-modules-cache-push
.use-pg11:

View File

@ -25,7 +25,7 @@ include:
- cd qa && bundle install
.review-qa-base:
image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-${RUBY_VERSION}:bundler-2.3-git-2.33-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23
image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-${RUBY_VERSION}:bundler-2.3-git-2.36-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23
extends:
- .use-docker-in-docker
- .bundle-base

View File

@ -856,6 +856,8 @@
.frontend:rules:minimal-default-rules:
rules:
- <<: *if-merge-request-approved
when: never
- <<: *if-automated-merge-request
when: never
- <<: *if-security-merge-request
@ -930,14 +932,16 @@
- <<: *if-merge-request-labels-run-all-jest
- <<: *if-merge-request-labels-frontend-and-feature-flag
- <<: *if-merge-request
changes: ["{package.json,yarn.lock}"]
changes: *frontend-dependency-patterns
- <<: *if-merge-request
changes: [".gitlab/ci/rules.gitlab-ci.yml", ".gitlab/ci/frontend.gitlab-ci.yml"]
- <<: *if-automated-merge-request
changes: *code-backstage-patterns
- <<: *if-security-merge-request
changes: *code-backstage-patterns
- <<: *if-default-branch-refs
- <<: *if-merge-request-not-approved
when: never
- <<: *if-default-refs
changes: *code-backstage-patterns
.frontend:rules:jest:minimal:
@ -950,7 +954,7 @@
- <<: *if-merge-request-labels-frontend-and-feature-flag
when: never
- <<: *if-merge-request
changes: ["{package.json,yarn.lock}"]
changes: *frontend-dependency-patterns
when: never
- <<: *if-merge-request
changes: [".gitlab/ci/rules.gitlab-ci.yml", ".gitlab/ci/frontend.gitlab-ci.yml"]
@ -964,18 +968,24 @@
- <<: *if-merge-request-labels-as-if-foss
- <<: *if-merge-request-labels-run-all-jest
- <<: *if-merge-request
changes: ["{package.json,yarn.lock}"]
changes: *frontend-dependency-patterns
- <<: *if-security-merge-request
changes: *code-backstage-patterns
- <<: *if-merge-request-not-approved
when: never
- <<: *if-merge-request
changes: *frontend-patterns-for-as-if-foss
.frontend:rules:jest:minimal:as-if-foss:
rules:
- !reference [".strict-ee-only-rules", rules]
- !reference [".frontend:rules:minimal-default-rules", rules]
- <<: *if-merge-request-labels-as-if-foss
when: never
- <<: *if-merge-request-labels-run-all-jest
when: never
- <<: *if-merge-request
changes: ["{package.json,yarn.lock}"]
changes: *frontend-dependency-patterns
when: never
- <<: *if-fork-merge-request
when: never

View File

@ -1,15 +1,13 @@
---
Rails/LexicallyScopedActionFilter:
# Offense count: 73
# Temporarily disabled due to too many offenses
Enabled: false
Details: grace period
Exclude:
- 'app/controllers/admin/groups_controller.rb'
- 'app/controllers/admin/hooks_controller.rb'
- 'app/controllers/clusters/base_controller.rb'
- 'app/controllers/clusters/clusters_controller.rb'
- 'app/controllers/concerns/enforces_two_factor_authentication.rb'
- 'app/controllers/concerns/integrations/actions.rb'
- 'app/controllers/concerns/multiple_boards_actions.rb'
- 'app/controllers/concerns/oauth_applications.rb'
- 'app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb'
- 'app/controllers/confirmations_controller.rb'
@ -17,14 +15,17 @@ Rails/LexicallyScopedActionFilter:
- 'app/controllers/groups/group_members_controller.rb'
- 'app/controllers/groups/milestones_controller.rb'
- 'app/controllers/groups/runners_controller.rb'
- 'app/controllers/groups/settings/repository_controller.rb'
- 'app/controllers/groups/uploads_controller.rb'
- 'app/controllers/groups_controller.rb'
- 'app/controllers/import/base_controller.rb'
- 'app/controllers/oauth/applications_controller.rb'
- 'app/controllers/passwords_controller.rb'
- 'app/controllers/projects/analytics/cycle_analytics/stages_controller.rb'
- 'app/controllers/projects/badges_controller.rb'
- 'app/controllers/projects/branches_controller.rb'
- 'app/controllers/projects/environments_controller.rb'
- 'app/controllers/projects/hooks_controller.rb'
- 'app/controllers/projects/incidents_controller.rb'
- 'app/controllers/projects/issue_links_controller.rb'
- 'app/controllers/projects/issues_controller.rb'
@ -36,6 +37,8 @@ Rails/LexicallyScopedActionFilter:
- 'app/controllers/projects/project_members_controller.rb'
- 'app/controllers/projects/prometheus/alerts_controller.rb'
- 'app/controllers/projects/releases_controller.rb'
- 'app/controllers/projects/settings/integration_hook_logs_controller.rb'
- 'app/controllers/projects/settings/merge_requests_controller.rb'
- 'app/controllers/projects/snippets_controller.rb'
- 'app/controllers/projects/tags_controller.rb'
- 'app/controllers/projects/todos_controller.rb'

View File

@ -297,6 +297,7 @@ export default {
data-testid="pipeline-form-ci-variable-value"
data-qa-selector="ci_variable_value_field"
class="gl-font-monospace!"
spellcheck="false"
/>
</gl-form-group>

View File

@ -275,6 +275,7 @@ export default {
data-testid="pipeline-form-ci-variable-value"
data-qa-selector="ci_variable_value_field"
class="gl-font-monospace!"
spellcheck="false"
/>
</gl-form-group>

View File

@ -471,8 +471,14 @@ export default {
},
fetchData(toggleTree = true) {
this.fetchDiffFilesMeta()
.then(({ real_size = 0 }) => {
this.diffFilesLength = parseInt(real_size, 10) || 0;
.then((data) => {
let realSize = 0;
if (data) {
realSize = data.real_size;
}
this.diffFilesLength = parseInt(realSize, 10) || 0;
if (toggleTree) {
this.setTreeDisplay();
}

View File

@ -5,7 +5,7 @@ import {
historyPushState,
scrollToElement,
} from '~/lib/utils/common_utils';
import { createAlert } from '~/flash';
import { createAlert, VARIANT_WARNING } from '~/flash';
import { diffViewerModes } from '~/ide/constants';
import axios from '~/lib/utils/axios_utils';
@ -229,9 +229,17 @@ export const fetchDiffFilesMeta = ({ commit, state }) => {
return data;
})
.catch(() => worker.terminate());
};
.catch((error) => {
worker.terminate();
if (error.response.status === httpStatusCodes.NOT_FOUND) {
createAlert({
message: __('Building your merge request. Wait a few moments, then refresh this page.'),
variant: VARIANT_WARNING,
});
}
});
};
export const fetchCoverageFiles = ({ commit, state }) => {
const coveragePoll = new Poll({
resource: {

View File

@ -0,0 +1,61 @@
<script>
import { GlModal } from '@gitlab/ui';
import { __, n__ } from '~/locale';
import {
DELETE_PACKAGES_MODAL_TITLE,
DELETE_PACKAGE_MODAL_PRIMARY_ACTION,
} from '~/packages_and_registries/package_registry/constants';
export default {
name: 'DeleteModal',
i18n: {
DELETE_PACKAGES_MODAL_TITLE,
},
components: {
GlModal,
},
props: {
itemsToBeDeleted: {
type: Array,
required: true,
},
},
computed: {
description() {
return n__(
'PackageRegistry|You are about to delete 1 package. This operation is irreversible.',
`PackageRegistry|You are about to delete %d packages. This operation is irreversible.`,
this.itemsToBeDeleted.length,
);
},
},
modal: {
packagesDeletePrimaryAction: {
text: DELETE_PACKAGE_MODAL_PRIMARY_ACTION,
attributes: [{ variant: 'danger' }, { category: 'primary' }],
},
cancelAction: {
text: __('Cancel'),
},
},
methods: {
show() {
this.$refs.deleteModal.show();
},
},
};
</script>
<template>
<gl-modal
ref="deleteModal"
size="sm"
modal-id="delete-packages-modal"
:action-primary="$options.modal.packagesDeletePrimaryAction"
:action-cancel="$options.modal.cancelAction"
:title="$options.i18n.DELETE_PACKAGES_MODAL_TITLE"
@primary="$emit('confirm')"
>
<span>{{ description }}</span>
</gl-modal>
</template>

View File

@ -2,6 +2,7 @@
import {
GlDropdown,
GlDropdownItem,
GlFormCheckbox,
GlIcon,
GlSprintf,
GlTooltipDirective,
@ -26,6 +27,7 @@ export default {
components: {
GlDropdown,
GlDropdownItem,
GlFormCheckbox,
GlIcon,
GlSprintf,
GlTruncate,
@ -45,6 +47,11 @@ export default {
type: Object,
required: true,
},
selected: {
type: Boolean,
default: false,
required: false,
},
},
computed: {
packageType() {
@ -90,7 +97,15 @@ export default {
</script>
<template>
<list-item data-testid="package-row">
<list-item data-testid="package-row" v-bind="$attrs">
<template #left-action>
<gl-form-checkbox
v-if="packageEntity.canDestroy"
class="gl-m-0"
:checked="selected"
@change="$emit('select')"
/>
</template>
<template #left-primary>
<div class="gl-display-flex gl-align-items-center gl-mr-3 gl-min-w-0">
<router-link
@ -168,12 +183,9 @@ export default {
category="tertiary"
no-caret
>
<gl-dropdown-item
data-testid="action-delete"
variant="danger"
@click="$emit('packageToDelete', packageEntity)"
>{{ $options.i18n.deletePackage }}</gl-dropdown-item
>
<gl-dropdown-item data-testid="action-delete" variant="danger" @click="$emit('delete')">{{
$options.i18n.deletePackage
}}</gl-dropdown-item>
</gl-dropdown>
</template>
</list-item>

View File

@ -1,6 +1,6 @@
<script>
import { GlAlert } from '@gitlab/ui';
import { s__, sprintf } from '~/locale';
import { s__, sprintf, n__ } from '~/locale';
import DeletePackageModal from '~/packages_and_registries/shared/components/delete_package_modal.vue';
import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
@ -48,6 +48,9 @@ export default {
};
},
computed: {
listTitle() {
return n__('%d package', '%d packages', this.list.length);
},
isListEmpty() {
return !this.list || this.list.length === 0;
},
@ -83,6 +86,14 @@ export default {
this.itemToBeDeleted = { ...item };
this.track(REQUEST_DELETE_PACKAGE_TRACKING_ACTION);
},
setItemsToBeDeleted(items) {
if (items.length === 1) {
const [item] = items;
this.setItemToBeDeleted(item);
return;
}
this.$emit('delete', items);
},
deleteItemConfirmation() {
this.$emit('package:delete', this.itemToBeDeleted);
this.track(DELETE_PACKAGE_TRACKING_ACTION);
@ -124,15 +135,22 @@ export default {
>
<registry-list
data-testid="packages-table"
:hidden-delete="true"
:is-loading="isLoading"
:items="list"
:pagination="pageInfo"
:title="listTitle"
@delete="setItemsToBeDeleted"
@prev-page="$emit('prev-page')"
@next-page="$emit('next-page')"
>
<template #default="{ item }">
<packages-list-row :package-entity="item" @packageToDelete="setItemToBeDeleted(item)" />
<template #default="{ selectItem, isSelected, item, first }">
<packages-list-row
:first="first"
:package-entity="item"
:selected="isSelected(item)"
@delete="setItemToBeDeleted(item)"
@select="selectItem(item)"
/>
</template>
</registry-list>

View File

@ -110,6 +110,13 @@ export const FETCH_PACKAGE_PIPELINES_ERROR_MESSAGE = s__(
export const FETCH_PACKAGE_METADATA_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while fetching the package metadata.',
);
export const DELETE_PACKAGES_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while deleting packages.',
);
export const DELETE_PACKAGES_SUCCESS_MESSAGE = s__('PackageRegistry|Packages deleted successfully');
export const DELETE_PACKAGES_MODAL_TITLE = s__('PackageRegistry|Delete packages');
export const DELETE_PACKAGE_MODAL_PRIMARY_ACTION = s__('PackageRegistry|Permanently delete');
export const DELETE_PACKAGE_SUCCESS_MESSAGE = s__('PackageRegistry|Package deleted successfully');
export const PACKAGE_REGISTRY_TITLE = __('Package Registry');

View File

@ -0,0 +1,5 @@
mutation destroyPackages($ids: [PackagesPackageID!]!) {
destroyPackages(input: { ids: $ids }) {
errors
}
}

View File

@ -1,5 +1,5 @@
<script>
import { GlBanner, GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
import { GlAlert, GlBanner, GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
import { createAlert, VARIANT_INFO } from '~/flash';
import { getCookie, historyReplaceState, parseBoolean, setCookie } from '~/lib/utils/common_utils';
import { s__ } from '~/locale';
@ -10,19 +10,23 @@ import {
GRAPHQL_PAGE_SIZE,
HIDE_PACKAGE_MIGRATION_SURVEY_COOKIE,
DELETE_PACKAGE_SUCCESS_MESSAGE,
DELETE_PACKAGES_ERROR_MESSAGE,
DELETE_PACKAGES_SUCCESS_MESSAGE,
EMPTY_LIST_HELP_URL,
PACKAGE_HELP_URL,
SURVEY_LINK,
} from '~/packages_and_registries/package_registry/constants';
import getPackagesQuery from '~/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql';
import destroyPackagesMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_packages.mutation.graphql';
import DeletePackage from '~/packages_and_registries/package_registry/components/functional/delete_package.vue';
import PackageTitle from '~/packages_and_registries/package_registry/components/list/package_title.vue';
import PackageSearch from '~/packages_and_registries/package_registry/components/list/package_search.vue';
import PackageList from '~/packages_and_registries/package_registry/components/list/packages_list.vue';
import DeleteModal from '~/packages_and_registries/package_registry/components/delete_modal.vue';
export default {
components: {
GlAlert,
GlBanner,
GlEmptyState,
GlLink,
@ -30,11 +34,14 @@ export default {
PackageList,
PackageTitle,
PackageSearch,
DeleteModal,
DeletePackage,
},
inject: ['emptyListIllustration', 'isGroupPage', 'fullPath'],
data() {
return {
alertVariables: null,
itemsToBeDeleted: [],
packages: {},
sort: '',
filters: {},
@ -114,6 +121,45 @@ export default {
historyReplaceState(cleanUrl);
}
},
async confirmDelete() {
const { itemsToBeDeleted } = this;
this.itemsToBeDeleted = [];
this.mutationLoading = true;
try {
const { data } = await this.$apollo.mutate({
mutation: destroyPackagesMutation,
variables: {
ids: itemsToBeDeleted.map((i) => i.id),
},
awaitRefetchQueries: true,
refetchQueries: [
{
query: getPackagesQuery,
variables: { ...this.queryVariables, first: GRAPHQL_PAGE_SIZE },
},
],
});
if (data?.destroyPackages?.errors[0]) {
throw new Error(data.destroyPackages.errors[0]);
}
this.showAlert({
variant: 'success',
message: DELETE_PACKAGES_SUCCESS_MESSAGE,
});
} catch {
this.showAlert({
variant: 'danger',
message: DELETE_PACKAGES_ERROR_MESSAGE,
});
} finally {
this.mutationLoading = false;
}
},
showDeletePackagesModal(toBeDeleted) {
this.itemsToBeDeleted = toBeDeleted;
this.$refs.deletePackagesModal.show();
},
handleSearchUpdate({ sort, filters }) {
this.sort = sort;
this.filters = { ...filters };
@ -151,6 +197,9 @@ export default {
updateQuery: this.updateQuery,
});
},
showAlert(obj) {
this.alertVariables = { ...obj };
},
},
i18n: {
widenFilters: s__('PackageRegistry|To widen your search, change or remove the filters above.'),
@ -175,6 +224,15 @@ export default {
<template>
<div>
<gl-alert
v-if="alertVariables"
:variant="alertVariables.variant"
class="gl-mt-5"
dismissible
@dismiss="alertVariables = null"
>
{{ alertVariables.message }}
</gl-alert>
<gl-banner
v-if="showSurveyBanner"
:title="$options.i18n.surveyBannerTitle"
@ -187,7 +245,7 @@ export default {
<p>{{ $options.i18n.surveyBannerDescription }}</p>
</gl-banner>
<package-title :help-url="$options.links.PACKAGE_HELP_URL" :count="packagesCount" />
<package-search @update="handleSearchUpdate" />
<package-search class="gl-mb-5" @update="handleSearchUpdate" />
<delete-package
:refetch-queries="refetchQueriesData"
@ -203,6 +261,7 @@ export default {
@prev-page="fetchPreviousPage"
@next-page="fetchNextPage"
@package:delete="deletePackage"
@delete="showDeletePackagesModal"
>
<template #empty-state>
<gl-empty-state :title="emptyStateTitle" :svg-path="emptyListIllustration">
@ -221,5 +280,11 @@ export default {
</package-list>
</template>
</delete-package>
<delete-modal
ref="deletePackagesModal"
:items-to-be-deleted="itemsToBeDeleted"
@confirm="confirmDelete"
/>
</div>
</template>

View File

@ -0,0 +1,16 @@
mutation updatePackageForwardingSettings($input: UpdateNamespacePackageSettingsInput!) {
updateNamespacePackageSettings(input: $input) {
packageSettings {
mavenPackageRequestsForwarding
lockMavenPackageRequestsForwarding
mavenPackageRequestsForwardingLocked
npmPackageRequestsForwarding
lockNpmPackageRequestsForwarding
npmPackageRequestsForwardingLocked
pypiPackageRequestsForwarding
lockPypiPackageRequestsForwarding
pypiPackageRequestsForwardingLocked
}
errors
}
}

View File

@ -124,7 +124,7 @@ export default {
</script>
<template>
<div class="gl-pt-2">
<div>
<gl-loading-icon v-if="$apollo.queries.pipeline.loading" />
<pipeline-mini-graph
v-else

View File

@ -45,7 +45,7 @@ export default {
</script>
<template>
<nav>
<nav class="search-filter">
<gl-nav vertical pills>
<gl-nav-item
v-for="(item, scope, index) in navigation"

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
return unless Gitlab::Runtime.application?
return unless Gitlab::Utils.to_boolean(ENV['GITLAB_MEMORY_WATCHDOG_ENABLED'])
return unless Gitlab::Utils.to_boolean(ENV['GITLAB_MEMORY_WATCHDOG_ENABLED'], default: Gitlab::Runtime.puma?)
Gitlab::Cluster::LifecycleEvents.on_worker_start do
watchdog = Gitlab::Memory::Watchdog.new

View File

@ -17,6 +17,7 @@ ActiveSupport::Inflector.inflections do |inflect|
award_emoji
ci_secure_file_registry
container_repository_registry
dependency_proxy_blob_registry
design_registry
event_log
file_registry

View File

@ -0,0 +1,9 @@
---
table_name: dependency_proxy_blob_states
classes:
- Geo::DependencyProxyBlobState
feature_categories:
- geo_replication
description: Separate table for dependency proxy blob verification states
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/101429
milestone: '15.6'

View File

@ -0,0 +1,49 @@
# frozen_string_literal: true
class CreateDependencyProxyBlobStates < Gitlab::Database::Migration[2.0]
VERIFICATION_STATE_INDEX_NAME = "index_dependency_proxy_blob_states_on_verification_state"
PENDING_VERIFICATION_INDEX_NAME = "index_dependency_proxy_blob_states_pending_verification"
FAILED_VERIFICATION_INDEX_NAME = "index_dependency_proxy_blob_states_failed_verification"
NEEDS_VERIFICATION_INDEX_NAME = "index_dependency_proxy_blob_states_needs_verification"
enable_lock_retries!
def up
table_comment = {
owner: 'group::geo',
description: 'Geo-specific table to store the verification state of DependencyProxy::Blob objects'
}
create_table :dependency_proxy_blob_states, id: false, comment: Gitlab::Json.dump(table_comment) do |t|
t.datetime_with_timezone :verification_started_at
t.datetime_with_timezone :verification_retry_at
t.datetime_with_timezone :verified_at
t.references :dependency_proxy_blob,
primary_key: true,
default: nil,
index: true,
foreign_key: { on_delete: :cascade }
t.integer :verification_state, default: 0, limit: 2, null: false
t.integer :verification_retry_count, default: 0, limit: 2, null: false
t.binary :verification_checksum, using: 'verification_checksum::bytea'
t.text :verification_failure, limit: 255
t.index :verification_state, name: VERIFICATION_STATE_INDEX_NAME
t.index :verified_at,
where: "(verification_state = 0)",
order: { verified_at: 'ASC NULLS FIRST' },
name: PENDING_VERIFICATION_INDEX_NAME
t.index :verification_retry_at,
where: "(verification_state = 3)",
order: { verification_retry_at: 'ASC NULLS FIRST' },
name: FAILED_VERIFICATION_INDEX_NAME
t.index :verification_state,
where: "(verification_state = 0 OR verification_state = 3)",
name: NEEDS_VERIFICATION_INDEX_NAME
end
end
def down
drop_table :dependency_proxy_blob_states
end
end

View File

@ -0,0 +1 @@
a3266078f4760f0f5a4c7a43669cea1170924f29d6867e712620c2234dbf13c6

View File

@ -14586,6 +14586,20 @@ CREATE SEQUENCE dast_sites_id_seq
ALTER SEQUENCE dast_sites_id_seq OWNED BY dast_sites.id;
CREATE TABLE dependency_proxy_blob_states (
verification_started_at timestamp with time zone,
verification_retry_at timestamp with time zone,
verified_at timestamp with time zone,
dependency_proxy_blob_id bigint NOT NULL,
verification_state smallint DEFAULT 0 NOT NULL,
verification_retry_count smallint DEFAULT 0 NOT NULL,
verification_checksum bytea,
verification_failure text,
CONSTRAINT check_8e4f76fffe CHECK ((char_length(verification_failure) <= 255))
);
COMMENT ON TABLE dependency_proxy_blob_states IS '{"owner":"group::geo","description":"Geo-specific table to store the verification state of DependencyProxy::Blob objects"}';
CREATE TABLE dependency_proxy_blobs (
id integer NOT NULL,
group_id integer NOT NULL,
@ -25558,6 +25572,9 @@ ALTER TABLE ONLY dast_site_validations
ALTER TABLE ONLY dast_sites
ADD CONSTRAINT dast_sites_pkey PRIMARY KEY (id);
ALTER TABLE ONLY dependency_proxy_blob_states
ADD CONSTRAINT dependency_proxy_blob_states_pkey PRIMARY KEY (dependency_proxy_blob_id);
ALTER TABLE ONLY dependency_proxy_blobs
ADD CONSTRAINT dependency_proxy_blobs_pkey PRIMARY KEY (id);
@ -28785,6 +28802,16 @@ CREATE UNIQUE INDEX index_dast_sites_on_project_id_and_url ON dast_sites USING b
CREATE UNIQUE INDEX index_dep_prox_manifests_on_group_id_file_name_and_status ON dependency_proxy_manifests USING btree (group_id, file_name, status);
CREATE INDEX index_dependency_proxy_blob_states_failed_verification ON dependency_proxy_blob_states USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
CREATE INDEX index_dependency_proxy_blob_states_needs_verification ON dependency_proxy_blob_states USING btree (verification_state) WHERE ((verification_state = 0) OR (verification_state = 3));
CREATE INDEX index_dependency_proxy_blob_states_on_dependency_proxy_blob_id ON dependency_proxy_blob_states USING btree (dependency_proxy_blob_id);
CREATE INDEX index_dependency_proxy_blob_states_on_verification_state ON dependency_proxy_blob_states USING btree (verification_state);
CREATE INDEX index_dependency_proxy_blob_states_pending_verification ON dependency_proxy_blob_states USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
CREATE INDEX index_dependency_proxy_blobs_on_group_id_and_file_name ON dependency_proxy_blobs USING btree (group_id, file_name);
CREATE INDEX index_dependency_proxy_blobs_on_group_id_status_read_at_id ON dependency_proxy_blobs USING btree (group_id, status, read_at, id);
@ -34099,6 +34126,9 @@ ALTER TABLE ONLY project_metrics_settings
ALTER TABLE ONLY prometheus_metrics
ADD CONSTRAINT fk_rails_4c8957a707 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY dependency_proxy_blob_states
ADD CONSTRAINT fk_rails_4cdbb92cbd FOREIGN KEY (dependency_proxy_blob_id) REFERENCES dependency_proxy_blobs(id) ON DELETE CASCADE;
ALTER TABLE ONLY scim_identities
ADD CONSTRAINT fk_rails_4d2056ebd9 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;

View File

@ -321,6 +321,16 @@ configuration option in `gitlab.yml`. These metrics are served from the
| `geo_ci_secure_files_verification_total` | Gauge | 15.3 | Number of secure files verifications tried on secondary | `url` |
| `geo_ci_secure_files_verified` | Gauge | 15.3 | Number of secure files verified on secondary | `url` |
| `geo_ci_secure_files_verification_failed` | Gauge | 15.3 | Number of secure files verifications failed on secondary | `url` |
| `geo_dependency_proxy_blob` | Gauge | 15.6 | Number of dependency proxy blobs on primary | |
| `geo_dependency_proxy_blob_checksum_total` | Gauge | 15.6 | Number of dependency proxy blobs tried to checksum on primary | |
| `geo_dependency_proxy_blob_checksummed` | Gauge | 15.6 | Number of dependency proxy blobs successfully checksummed on primary | |
| `geo_dependency_proxy_blob_checksum_failed` | Gauge | 15.6 | Number of dependency proxy blobs failed to calculate the checksum on primary | |
| `geo_dependency_proxy_blob_synced` | Gauge | 15.6 | Number of dependency proxy blobs synced on secondary | |
| `geo_dependency_proxy_blob_failed` | Gauge | 15.6 | Number of dependency proxy blobs failed to sync on secondary | |
| `geo_dependency_proxy_blob_registry` | Gauge | 15.6 | Number of dependency proxy blobs in the registry | |
| `geo_dependency_proxy_blob_verification_total` | Gauge | 15.6 | Number of dependency proxy blobs verifications tried on secondary | |
| `geo_dependency_proxy_blob_verified` | Gauge | 15.6 | Number of dependency proxy blobs verified on secondary | |
| `geo_dependency_proxy_blob_verification_failed` | Gauge | 15.6 | Number of dependency proxy blobs verifications failed on secondary | |
## Database load balancing metrics **(PREMIUM SELF)**

View File

@ -504,6 +504,19 @@ Example response:
"ci_secure_files_synced_in_percentage": "100.00%",
"ci_secure_files_verified_in_percentage": "100.00%",
"ci_secure_files_synced_missing_on_primary_count": 0,
"dependency_proxy_blobs_count": 5,
"dependency_proxy_blobs_checksum_total_count": 5,
"dependency_proxy_blobs_checksummed_count": 5,
"dependency_proxy_blobs_checksum_failed_count": 0,
"dependency_proxy_blobs_synced_count": 5,
"dependency_proxy_blobs_failed_count": 0,
"dependency_proxy_blobs_registry_count": 5,
"dependency_proxy_blobs_verification_total_count": 5,
"dependency_proxy_blobs_verified_count": 5,
"dependency_proxy_blobs_verification_failed_count": 0,
"dependency_proxy_blobs_synced_in_percentage": "100.00%",
"dependency_proxy_blobs_verified_in_percentage": "100.00%",
"dependency_proxy_blobs_synced_missing_on_primary_count": 0,
"container_repositories_count": 5,
"container_repositories_synced_count": 5,
"container_repositories_failed_count": 0,
@ -675,6 +688,19 @@ Example response:
"job_artifacts_synced_in_percentage": "100.00%",
"job_artifacts_verified_in_percentage": "100.00%",
"job_artifacts_synced_missing_on_primary_count": 0,
"dependency_proxy_blobs_count": 5,
"dependency_proxy_blobs_checksum_total_count": 5,
"dependency_proxy_blobs_checksummed_count": 5,
"dependency_proxy_blobs_checksum_failed_count": 0,
"dependency_proxy_blobs_synced_count": 5,
"dependency_proxy_blobs_failed_count": 0,
"dependency_proxy_blobs_registry_count": 5,
"dependency_proxy_blobs_verification_total_count": 5,
"dependency_proxy_blobs_verified_count": 5,
"dependency_proxy_blobs_verification_failed_count": 0,
"dependency_proxy_blobs_synced_in_percentage": "100.00%",
"dependency_proxy_blobs_verified_in_percentage": "100.00%",
"dependency_proxy_blobs_synced_missing_on_primary_count": 0,
"container_repositories_count": 5,
"container_repositories_synced_count": 5,
"container_repositories_failed_count": 0,
@ -856,6 +882,19 @@ Example response:
"ci_secure_files_synced_in_percentage": "100.00%",
"ci_secure_files_verified_in_percentage": "100.00%",
"ci_secure_files_synced_missing_on_primary_count": 0,
"dependency_proxy_blobs_count": 5,
"dependency_proxy_blobs_checksum_total_count": 5,
"dependency_proxy_blobs_checksummed_count": 5,
"dependency_proxy_blobs_checksum_failed_count": 0,
"dependency_proxy_blobs_synced_count": 5,
"dependency_proxy_blobs_failed_count": 0,
"dependency_proxy_blobs_registry_count": 5,
"dependency_proxy_blobs_verification_total_count": 5,
"dependency_proxy_blobs_verified_count": 5,
"dependency_proxy_blobs_verification_failed_count": 0,
"dependency_proxy_blobs_synced_in_percentage": "100.00%",
"dependency_proxy_blobs_verified_in_percentage": "100.00%",
"dependency_proxy_blobs_synced_missing_on_primary_count": 0,
"container_repositories_count": 5,
"container_repositories_synced_count": 5,
"container_repositories_failed_count": 0,

View File

@ -7283,6 +7283,29 @@ The edge type for [`DependencyProxyBlob`](#dependencyproxyblob).
| <a id="dependencyproxyblobedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="dependencyproxyblobedgenode"></a>`node` | [`DependencyProxyBlob`](#dependencyproxyblob) | The item at the end of the edge. |
#### `DependencyProxyBlobRegistryConnection`
The connection type for [`DependencyProxyBlobRegistry`](#dependencyproxyblobregistry).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="dependencyproxyblobregistryconnectionedges"></a>`edges` | [`[DependencyProxyBlobRegistryEdge]`](#dependencyproxyblobregistryedge) | A list of edges. |
| <a id="dependencyproxyblobregistryconnectionnodes"></a>`nodes` | [`[DependencyProxyBlobRegistry]`](#dependencyproxyblobregistry) | A list of nodes. |
| <a id="dependencyproxyblobregistryconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
#### `DependencyProxyBlobRegistryEdge`
The edge type for [`DependencyProxyBlobRegistry`](#dependencyproxyblobregistry).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="dependencyproxyblobregistryedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="dependencyproxyblobregistryedgenode"></a>`node` | [`DependencyProxyBlobRegistry`](#dependencyproxyblobregistry) | The item at the end of the edge. |
#### `DependencyProxyManifestConnection`
The connection type for [`DependencyProxyManifest`](#dependencyproxymanifest).
@ -11693,6 +11716,25 @@ Dependency proxy blob.
| <a id="dependencyproxyblobsize"></a>`size` | [`String!`](#string) | Size of the blob file. |
| <a id="dependencyproxyblobupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
### `DependencyProxyBlobRegistry`
Represents the Geo replication and verification state of a dependency_proxy_blob.
#### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="dependencyproxyblobregistrycreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp when the DependencyProxyBlobRegistry was created. |
| <a id="dependencyproxyblobregistrydependencyproxyblobid"></a>`dependencyProxyBlobId` | [`ID!`](#id) | ID of the Dependency Proxy Blob. |
| <a id="dependencyproxyblobregistryid"></a>`id` | [`ID!`](#id) | ID of the DependencyProxyBlobRegistry. |
| <a id="dependencyproxyblobregistrylastsyncfailure"></a>`lastSyncFailure` | [`String`](#string) | Error message during sync of the DependencyProxyBlobRegistry. |
| <a id="dependencyproxyblobregistrylastsyncedat"></a>`lastSyncedAt` | [`Time`](#time) | Timestamp of the most recent successful sync of the DependencyProxyBlobRegistry. |
| <a id="dependencyproxyblobregistryretryat"></a>`retryAt` | [`Time`](#time) | Timestamp after which the DependencyProxyBlobRegistry is resynced. |
| <a id="dependencyproxyblobregistryretrycount"></a>`retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the DependencyProxyBlobRegistry. |
| <a id="dependencyproxyblobregistrystate"></a>`state` | [`RegistryState`](#registrystate) | Sync state of the DependencyProxyBlobRegistry. |
| <a id="dependencyproxyblobregistryverificationretryat"></a>`verificationRetryAt` | [`Time`](#time) | Timestamp after which the DependencyProxyBlobRegistry is reverified. |
| <a id="dependencyproxyblobregistryverifiedat"></a>`verifiedAt` | [`Time`](#time) | Timestamp of the most recent successful verification of the DependencyProxyBlobRegistry. |
### `DependencyProxyImageTtlGroupPolicy`
Group-level Dependency Proxy TTL policy settings.
@ -12898,6 +12940,28 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="geonodecontainerrepositoryregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodecontainerrepositoryregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
##### `GeoNode.dependencyProxyBlobRegistries`
Find Dependency Proxy Blob registries on this Geo node. Ignored if `geo_dependency_proxy_blob_replication` feature flag is disabled.
WARNING:
**Introduced** in 15.6.
This feature is in Alpha. It can be changed or removed at any time.
Returns [`DependencyProxyBlobRegistryConnection`](#dependencyproxyblobregistryconnection).
This field returns a [connection](#connections). It accepts the
four standard [pagination arguments](#connection-pagination-arguments):
`before: String`, `after: String`, `first: Int`, `last: Int`.
###### Arguments
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="geonodedependencyproxyblobregistriesids"></a>`ids` | [`[ID!]`](#id) | Filters registries by their ID. |
| <a id="geonodedependencyproxyblobregistriesreplicationstate"></a>`replicationState` | [`ReplicationStateEnum`](#replicationstateenum) | Filters registries by their replication state. |
| <a id="geonodedependencyproxyblobregistriesverificationstate"></a>`verificationState` | [`VerificationStateEnum`](#verificationstateenum) | Filters registries by their verification state. |
##### `GeoNode.groupWikiRepositoryRegistries`
Find group wiki repository registries on this Geo node.

View File

@ -38,7 +38,7 @@ Example response:
"to_line": 10,
"applicable": true,
"applied": false,
"from_content": "This is an example\n",
"from_content": "This is an eaxmple\n",
"to_content": "This is an example\n"
}
```
@ -68,7 +68,7 @@ Example response:
"to_line": 10,
"applicable": true,
"applied": false,
"from_content": "This is an example\n",
"from_content": "This is an eaxmple\n",
"to_content": "This is an example\n"
}
{

View File

@ -52,11 +52,6 @@ good title can help communicate what the blueprint is and should be considered
as part of any review.
-->
<!--
Start the document by pasting an exact copy of the disclaimer found at:
https://docs.gitlab.com/ee/development/documentation/versions.html#legal-disclaimer-for-future-features
-->
<!--
For long pages, consider creating a table of contents.
The `[_TOC_]` function is not supported on docs.gitlab.com.

View File

@ -10,14 +10,6 @@ participating-stages: []
# CI/CD data time decay
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Summary
GitLab CI/CD is one of the most data and compute intensive components of GitLab.

View File

@ -7,14 +7,6 @@ description: 'Pipeline data partitioning design'
# Pipeline data partitioning design
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## What problem are we trying to solve?
We want to partition the CI/CD dataset, because some of the database tables are

View File

@ -10,14 +10,6 @@ participating-stages: []
# CI/CD pipeline components catalog
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Summary
## Goals

View File

@ -7,14 +7,6 @@ description: 'Improve scalability of GitLab CI/CD'
# CI/CD Scaling
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Summary
GitLab CI/CD is one of the most data and compute intensive components of GitLab.

View File

@ -10,14 +10,6 @@ participating-stages: []
# Cloud Native Build Logs
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
Cloud native and the adoption of Kubernetes has been recognised by GitLab to be
one of the top two biggest tailwinds that are helping us grow faster as a
company behind the project.

View File

@ -10,14 +10,6 @@ participating-stages: []
# GitLab Pages New Architecture
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
GitLab Pages is an important component of the GitLab product. It is mostly
being used to serve static content, and has a limited set of well defined
responsibilities. That being said, unfortunately it has become a blocker for

View File

@ -10,14 +10,6 @@ participating-stages: []
# Composable GitLab codebase - using Rails Engines
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
NOTE:
Due to our focus on improving the overall availability of GitLab.com and reducing tech debt, we do not have capacity to act on this blueprint. We will re-evaluate in Q1-FY23.

View File

@ -10,14 +10,6 @@ participating-stages: []
# Consolidating Groups and Projects
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
There are numerous features that exist exclusively within groups or
projects. The boundary between group and project features used to be clear.
However, there is growing demand to have group features within projects, and

View File

@ -10,14 +10,6 @@ participating-stages: []
# Container Registry Metadata Database
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Usage of the GitLab Container Registry
With the [Container Registry](https://gitlab.com/gitlab-org/container-registry) integrated into GitLab, every GitLab project can have its own space to store its Docker images. You can use the registry to build, push and share images using the Docker client, CI/CD or the GitLab API.

View File

@ -10,14 +10,6 @@ description: 'Learn how to scale operating on read-mostly data at scale'
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326037) in GitLab 14.0.
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document describes the *read-mostly* pattern introduced in the
[Database Scalability Working Group](https://about.gitlab.com/company/team/structure/working-groups/database-scalability/#read-mostly-data).
We discuss the characteristics of *read-mostly* data and propose best practices for GitLab development

View File

@ -10,14 +10,6 @@ description: 'Learn how to operate on large time-decay data'
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326035) in GitLab 14.0.
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document describes the *time-decay pattern* introduced in the
[Database Scalability Working Group](https://about.gitlab.com/company/team/structure/working-groups/database-scalability/#time-decay-data).
We discuss the characteristics of time-decay data, and propose best practices for GitLab development

View File

@ -7,14 +7,6 @@ description: 'Database Scalability / Limit table sizes'
# Database Scalability: Limit on-disk table size to < 100 GB for GitLab.com
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document is a proposal to work towards reducing and limiting table sizes on GitLab.com. We establish a **measurable target** by limiting table size to a certain threshold. This is used as an indicator to drive database focus and decision making. With GitLab.com growing, we continuously re-evaluate which tables need to be worked on to prevent or otherwise fix violations.
This is not meant to be a hard rule but rather a strong indication that work needs to be done to break a table apart or otherwise reduce its size.

View File

@ -10,14 +10,6 @@ participating-stages: []
# Database Testing
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
We have identified [common themes of reverted migrations](https://gitlab.com/gitlab-org/gitlab/-/issues/233391) and discovered failed migrations breaking in both production and staging even when successfully tested in a developer environment. We have also experienced production incidents even with successful testing in staging. These failures are quite expensive: they can have a significant effect on availability, block deployments, and generate incident escalations. These escalations must be triaged and either reverted or fixed forward. Often, this can take place without the original author's involvement due to time zones and/or the criticality of the escalation. With our increased deployment speeds and stricter uptime requirements, the need for improving database testing is critical, particularly earlier in the development process (shift left).
From a developer's perspective, it is hard, if not unfeasible, to validate a migration on a large enough dataset before it goes into production.

View File

@ -10,14 +10,6 @@ participating-stages: []
# Architectural discussion of feature flags
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
Usage of feature flags become crucial for the development of GitLab. The
feature flags are a convenient way to ship changes early, and safely rollout
them to wide audience ensuring that feature is stable and performant.

View File

@ -10,14 +10,6 @@ participating-stages: []
# GitLab to Kubernetes communication **(FREE)**
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
The goal of this document is to define how GitLab can communicate with Kubernetes
and in-cluster services through the GitLab agent.

View File

@ -10,14 +10,6 @@ participating-stages: []
# GraphQL API
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
[GraphQL](https://graphql.org/) is a data query and manipulation language for
APIs, and a runtime for fulfilling queries with existing data.

View File

@ -10,14 +10,6 @@ participating-stages: []
# Image resizing for avatars and content images
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
Currently, we are showing all uploaded images 1:1, which is of course not ideal. To improve performance greatly, add image resizing to the backend. There are two main areas of image resizing to consider; avatars and content images. The MVC for this implementation focuses on Avatars. Avatars requests consist of approximately 70% of total image requests. There is an identified set of sizes we intend to support which makes the scope of this first MVC very narrow. Content image resizing has many more considerations for size and features. It is entirely possible that we have two separate development efforts with the same goal of increasing performance via image resizing.
## MVC Avatar Resizing

View File

@ -10,14 +10,6 @@ participating-stages: []
# Object storage: `direct_upload` consolidation
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Abstract
GitLab stores three classes of user data: database records, Git

View File

@ -10,14 +10,6 @@ participating-stages: []
# Pods
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document is a work-in-progress and represents a very early state of the Pods design. Significant aspects are not documented, though we expect to add them in the future.
## Summary

View File

@ -5,14 +5,6 @@ comments: false
description: 'Pods: Git Access'
---
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document is a work-in-progress and represents a very early state of the
Pods design. Significant aspects are not documented, though we expect to add
them in the future. This is one possible architecture for Pods, and we intend to

View File

@ -5,14 +5,6 @@ comments: false
description: 'Pods architecture: Problem A'
---
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document is a work-in-progress and represents a very early state of the
Pods design. Significant aspects are not documented, though we expect to add
them in the future. This is one possible architecture for Pods, and we intend to

View File

@ -5,14 +5,6 @@ comments: false
description: 'Pods Stateless Router Proposal'
---
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document is a work-in-progress and represents a very early state of the
Pods design. Significant aspects are not documented, though we expect to add
them in the future. This is one possible architecture for Pods, and we intend to

View File

@ -5,14 +5,6 @@ comments: false
description: 'Pods Stateless Router Proposal'
---
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document is a work-in-progress and represents a very early state of the
Pods design. Significant aspects are not documented, though we expect to add
them in the future. This is one possible architecture for Pods, and we intend to

View File

@ -10,14 +10,6 @@ participating-stages: []
# Next Rate Limiting Architecture
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Summary
Introducing reasonable application limits is a very important step in any SaaS

View File

@ -10,14 +10,6 @@ participating-stages: []
# Next Runner Auto-scaling Architecture
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Summary
GitLab Runner is a core component of GitLab CI/CD. It makes it possible to run

View File

@ -7,14 +7,6 @@ description: 'Next Runner Token Architecture'
# Next GitLab Runner Token Architecture
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
## Summary
GitLab Runner is a core component of GitLab CI/CD that runs

View File

@ -10,14 +10,6 @@ participating-stages: []
# Work Items
DISCLAIMER:
This page contains information related to upcoming products, features, and functionality.
It is important to note that the information presented is for informational purposes only.
Please do not rely on this information for purchasing or planning purposes.
As with all projects, the items mentioned on this page are subject to change or delay.
The development, release, and timing of any products, features, or functionality remain at the
sole discretion of GitLab Inc.
This document is a work-in-progress. Some aspects are not documented, though we expect to add them in the future.
## Summary

View File

@ -85,7 +85,7 @@ In this mode, `jest` would resolve all the dependencies of related to the change
In addition, there are a few circumstances where we would always run the full Jest tests:
- when the `pipeline:run-all-jest` label is set on the merge request or is set by triage automation when the merge request is approved by any reviewer
- when the `pipeline:run-all-jest` label is set on the merge request
- when the merge request is created by an automation (for example, Gitaly update or MR targeting a stable branch)
- when the merge request is created in a security mirror
- when any CI configuration file is changed (for example, `.gitlab-ci.yml` or `.gitlab/ci/**/*`)

View File

@ -204,7 +204,7 @@ and included in `rules` definitions via [YAML anchors](../../ci/yaml/yaml_optimi
| `yaml-lint-patterns` | Only create job for YAML-related changes. |
| `docs-patterns` | Only create job for docs-related changes. |
| `frontend-dependency-patterns` | Only create job when frontend dependencies are updated (that is, `package.json`, and `yarn.lock`). changes. |
| `frontend-patterns` | Only create job for frontend-related changes. |
| `frontend-patterns-for-as-if-foss` | Only create job for frontend-related changes that have impact on FOSS. |
| `backend-patterns` | Only create job for backend-related changes. |
| `db-patterns` | Only create job for DB-related changes. |
| `backstage-patterns` | Only create job for backstage-related changes (that is, Danger, fixtures, RuboCop, specs). |

View File

@ -99,8 +99,8 @@ in the template you fetched to customize your configuration.
- To collaborate on Terraform code changes and Infrastructure-as-Code workflows, use the
[Terraform integration in merge requests](mr_integration.md).
- To manage GitLab resources like users, groups, and projects, use the
[GitLab Terraform provider](https://github.com/gitlabhq/terraform-provider-gitlab). It is released separately from GitLab
and its documentation is available on [the Terraform docs site](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs).
[GitLab Terraform provider](https://gitlab.com/gitlab-org/terraform-provider-gitlab).
The GitLab Terraform provider documentation is available on [the Terraform docs site](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs).
- [Create a new cluster on Amazon Elastic Kubernetes Service (EKS)](../clusters/connect/new_eks_cluster.md).
- [Create a new cluster on Google Kubernetes Engine (GKE)](../clusters/connect/new_gke_cluster.md).
- [Troubleshoot](troubleshooting.md) issues with GitLab and Terraform.

View File

@ -3,12 +3,12 @@
module API
module Entities
class Metadata < Grape::Entity
expose :version
expose :revision
expose :version, documentation: { type: 'string', example: '15.2-pre' }
expose :revision, documentation: { type: 'string', example: 'c401a659d0c' }
expose :kas do
expose :enabled, documentation: { type: 'boolean' }
expose :externalUrl
expose :version
expose :externalUrl, documentation: { type: 'string', example: 'grpc://gitlab.example.com:8150' }
expose :version, documentation: { type: 'string', example: '15.0.0' }
end
end
end

View File

@ -9,6 +9,8 @@ module API
before { authenticate! }
METADATA_TAGS = %w[metadata].freeze
feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
METADATA_QUERY = <<~EOF
@ -35,30 +37,13 @@ module API
end
end
desc 'Retrieve metadata information for this GitLab instance.' do
desc 'Retrieve metadata information for this GitLab instance' do
detail 'This feature was introduced in GitLab 15.2.'
success [
{
code: 200,
model: Entities::Metadata,
message: 'successful operation',
examples: {
successful_response: {
'value' => {
version: "15.0-pre",
revision: "c401a659d0c",
kas: {
enabled: true,
externalUrl: "grpc://gitlab.example.com:8150",
version: "15.0.0"
}
}
}
}
}
success Entities::Metadata
failure [
{ code: 401, message: 'Unauthorized' }
]
failure [{ code: 401, message: 'unauthorized operation' }]
tags %w[metadata]
tags METADATA_TAGS
end
get '/metadata' do
run_metadata_query
@ -66,31 +51,14 @@ module API
# Support the deprecated `/version` route.
# See https://gitlab.com/gitlab-org/gitlab/-/issues/366287
desc 'Get the version information of the GitLab instance.' do
desc 'Retrieves version information for the GitLab instance' do
detail 'This feature was introduced in GitLab 8.13 and deprecated in 15.5. ' \
'We recommend you instead use the Metadata API.'
success [
{
code: 200,
model: Entities::Metadata,
message: 'successful operation',
examples: {
'Example' => {
'value' => {
version: "15.0-pre",
revision: "c401a659d0c",
kas: {
enabled: true,
externalUrl: "grpc://gitlab.example.com:8150",
version: "15.0.0"
}
}
}
}
}
success Entities::Metadata
failure [
{ code: 401, message: 'Unauthorized' }
]
failure [{ code: 401, message: 'unauthorized operation' }]
tags %w[metadata]
tags METADATA_TAGS
end
get '/version' do

View File

@ -58,7 +58,7 @@ module API
project = find_project!(
::Gitlab::Jira::Dvcs.restore_full_path(**params.slice(:namespace, :project).symbolize_keys)
)
not_found! unless can?(current_user, :download_code, project)
not_found! unless can?(current_user, :read_code, project)
project
end

View File

@ -9,6 +9,10 @@ module Gitlab
puma_master_max_memory_mb: 950,
additional_puma_dev_max_memory_mb: 200)
# We are replacing PWK with Watchdog by using backward compatible RssMemoryLimit monitor by default.
# https://gitlab.com/groups/gitlab-org/-/epics/9119
return if Gitlab::Utils.to_boolean(ENV.fetch('GITLAB_MEMORY_WATCHDOG_ENABLED', true))
require 'puma_worker_killer'
PumaWorkerKiller.config do |config|

View File

@ -168,6 +168,7 @@ dast_site_profiles_pipelines: :gitlab_main
dast_sites: :gitlab_main
dast_site_tokens: :gitlab_main
dast_site_validations: :gitlab_main
dependency_proxy_blob_states: :gitlab_main
dependency_proxy_blobs: :gitlab_main
dependency_proxy_group_settings: :gitlab_main
dependency_proxy_image_ttl_group_policies: :gitlab_main

View File

@ -119,6 +119,13 @@ module Gitlab
connection = pool.connection
transaction_open = connection.transaction_open?
if attempt && attempt > 1
::Gitlab::Database::LoadBalancing::Logger.warn(
event: :read_write_retry,
message: 'A read_write block was retried because of connection error'
)
end
yield connection
rescue StandardError => e
# No leaking will happen on the final attempt. Leaks are caused by subsequent retries

View File

@ -13,6 +13,7 @@ module Gitlab
def create_event(issue_event)
attrs = {
importing: true,
user_id: author_id(issue_event),
label_id: label_finder.id_for(issue_event.label_title),
action: action(issue_event.event),

View File

@ -44,30 +44,30 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 0,
'cs_CZ' => 0,
'da_DK' => 37,
'da_DK' => 36,
'de' => 17,
'en' => 100,
'eo' => 0,
'es' => 36,
'es' => 35,
'fil_PH' => 0,
'fr' => 72,
'fr' => 85,
'gl_ES' => 0,
'id_ID' => 0,
'it' => 1,
'ja' => 31,
'ko' => 20,
'ja' => 30,
'ko' => 21,
'nb_NO' => 25,
'nl_NL' => 0,
'pl_PL' => 3,
'pt_BR' => 57,
'ro_RO' => 99,
'ru' => 26,
'pt_BR' => 58,
'ro_RO' => 98,
'ru' => 25,
'si_LK' => 11,
'tr_TR' => 11,
'uk' => 49,
'uk' => 52,
'zh_CN' => 98,
'zh_HK' => 1,
'zh_TW' => 99
'zh_TW' => 100
}.freeze
private_constant :TRANSLATION_LEVELS

View File

@ -343,6 +343,11 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
msgid "%d package"
msgid_plural "%d packages"
msgstr[0] ""
msgstr[1] ""
msgid "%d pending comment"
msgid_plural "%d pending comments"
msgstr[0] ""
@ -7198,6 +7203,9 @@ msgstr ""
msgid "BuildArtifacts|Loading artifacts"
msgstr ""
msgid "Building your merge request. Wait a few moments, then refresh this page."
msgstr ""
msgid "Built-in"
msgstr ""
@ -28913,6 +28921,9 @@ msgstr ""
msgid "PackageRegistry|Delete package version"
msgstr ""
msgid "PackageRegistry|Delete packages"
msgstr ""
msgid "PackageRegistry|Delete selected"
msgstr ""
@ -29047,6 +29058,9 @@ msgstr[1] ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
msgid "PackageRegistry|Packages deleted successfully"
msgstr ""
msgid "PackageRegistry|Permanently delete"
msgstr ""
@ -29101,6 +29115,9 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
msgid "PackageRegistry|Something went wrong while deleting packages."
msgstr ""
msgid "PackageRegistry|Something went wrong while deleting the package asset."
msgstr ""
@ -29172,6 +29189,11 @@ msgid_plural "PackageRegistry|You are about to delete %d assets. This operation
msgstr[0] ""
msgstr[1] ""
msgid "PackageRegistry|You are about to delete 1 package. This operation is irreversible."
msgid_plural "PackageRegistry|You are about to delete %d packages. This operation is irreversible."
msgstr[0] ""
msgstr[1] ""
msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?"
msgstr ""

View File

@ -118,7 +118,7 @@
"dateformat": "^5.0.1",
"deckar01-task_list": "^2.3.1",
"diff": "^3.4.0",
"dompurify": "^2.4.0",
"dompurify": "^2.4.1",
"dropzone": "^4.2.0",
"editorconfig": "^0.15.3",
"emoji-regex": "^10.0.0",

View File

@ -1,9 +1,9 @@
ARG DOCKER_VERSION=20.10.14
ARG CHROME_VERSION=103
ARG CHROME_VERSION=106
ARG QA_BUILD_TARGET=qa
ARG RUBY_VERSION=2.7
FROM registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bullseye-ruby-${RUBY_VERSION}:bundler-2.3-git-2.33-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23 AS qa
FROM registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bullseye-ruby-${RUBY_VERSION}:bundler-2.3-git-2.36-lfs-2.9-chrome-${CHROME_VERSION}-docker-${DOCKER_VERSION}-gcloud-383-kubectl-1.23 AS qa
LABEL maintainer="GitLab Quality Department <quality@gitlab.com>"
ENV DEBIAN_FRONTEND="noninteractive"

View File

@ -4,13 +4,20 @@ FactoryBot.define do
factory :dependency_proxy_blob, class: 'DependencyProxy::Blob' do
group
size { 1234 }
file { fixture_file_upload('spec/fixtures/dependency_proxy/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4.gz') }
file_name { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4.gz' }
status { :default }
after(:build) do |blob, _evaluator|
blob.file = fixture_file_upload('spec/fixtures/dependency_proxy/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4.gz')
end
trait :pending_destruction do
status { :pending_destruction }
end
trait :remote_store do
file_store { DependencyProxy::FileUploader::Store::REMOTE }
end
end
factory :dependency_proxy_manifest, class: 'DependencyProxy::Manifest' do

View File

@ -2,14 +2,13 @@
require 'spec_helper'
RSpec.describe 'Global search' do
RSpec.describe 'Global search', :js do
include AfterNextHelpers
let(:user) { create(:user) }
let(:project) { create(:project, namespace: user.namespace) }
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
before do
stub_feature_flags(search_page_vertical_nav: false)
project.add_maintainer(user)
sign_in(user)
end
@ -42,7 +41,7 @@ RSpec.describe 'Global search' do
end
end
it 'closes the dropdown on blur', :js do
it 'closes the dropdown on blur' do
find('#search').click
fill_in 'search', with: "a"
@ -59,7 +58,7 @@ RSpec.describe 'Global search' do
expect(page).to have_no_selector('#js-header-search')
end
it 'focuses search input when shortcut "s" is pressed', :js do
it 'focuses search input when shortcut "s" is pressed' do
expect(page).not_to have_selector('#search:focus')
find('body').native.send_key('s')
@ -74,7 +73,7 @@ RSpec.describe 'Global search' do
stub_feature_flags(new_header_search: true)
visit dashboard_projects_path
# intialize javascript loaded input search input field
# initialize javascript loaded input search input field
find('#search').click
find('body').click
end
@ -84,7 +83,7 @@ RSpec.describe 'Global search' do
expect(page).to have_selector('#js-header-search')
end
it 'focuses search input when shortcut "s" is pressed', :js do
it 'focuses search input when shortcut "s" is pressed' do
expect(page).not_to have_selector('#search:focus')
find('body').native.send_key('s')

View File

@ -38,6 +38,20 @@ RSpec.describe 'Merge request > User sees diff', :js do
end
end
context 'when linking to a line' do
let(:note) { create :diff_note_on_merge_request, project: project, noteable: merge_request }
let(:line) { note.diff_file.highlighted_diff_lines.last }
let(:line_code) { line.line_code }
before do
visit "#{diffs_project_merge_request_path(project, merge_request)}##{line_code}"
end
it 'shows the linked line' do
expect(page).to have_selector("[id='#{line_code}']", visible: true, obscured: false)
end
end
context 'when merge request has overflow' do
it 'displays warning' do
allow(Commit).to receive(:max_diff_options).and_return(max_files: 3)

View File

@ -2,11 +2,7 @@
require 'spec_helper'
RSpec.describe 'Search Snippets' do
before do
stub_feature_flags(search_page_vertical_nav: false)
end
RSpec.describe 'Search Snippets', :js do
it 'user searches for snippets by title' do
public_snippet = create(:personal_snippet, :public, title: 'Beginning and Middle')
private_snippet = create(:personal_snippet, :private, title: 'Middle and End')

View File

@ -183,11 +183,11 @@ describe('DiffsStoreActions', () => {
beforeEach(() => {
delete noFilesData.diff_files;
mock.onGet(endpointMetadata).reply(200, diffMetadata);
});
it('should fetch diff meta information', () => {
mock.onGet(endpointMetadata).reply(200, diffMetadata);
return testAction(
diffActions.fetchDiffFilesMeta,
{},
@ -206,6 +206,40 @@ describe('DiffsStoreActions', () => {
[],
);
});
it('should show a warning on 404 reponse', async () => {
mock.onGet(endpointMetadata).reply(404);
await testAction(
diffActions.fetchDiffFilesMeta,
{},
{ endpointMetadata, diffViewType: 'inline', showWhitespace: true },
[{ type: types.SET_LOADING, payload: true }],
[],
);
expect(createAlert).toHaveBeenCalledTimes(1);
expect(createAlert).toHaveBeenCalledWith({
message: expect.stringMatching(
'Building your merge request. Wait a few moments, then refresh this page.',
),
variant: 'warning',
});
});
it('should show no warning on any other status code', async () => {
mock.onGet(endpointMetadata).reply(500);
await testAction(
diffActions.fetchDiffFilesMeta,
{},
{ endpointMetadata, diffViewType: 'inline', showWhitespace: true },
[{ type: types.SET_LOADING, payload: true }],
[],
);
expect(createAlert).not.toHaveBeenCalled();
});
});
describe('fetchCoverageFiles', () => {

View File

@ -18,9 +18,7 @@ import VariablesJson from './json_tests/positive_tests/variables.json';
import DefaultNoAdditionalPropertiesJson from './json_tests/negative_tests/default_no_additional_properties.json';
import InheritDefaultNoAdditionalPropertiesJson from './json_tests/negative_tests/inherit_default_no_additional_properties.json';
import JobVariablesMustNotContainObjectsJson from './json_tests/negative_tests/job_variables_must_not_contain_objects.json';
import ReleaseAssetsLinksEmptyJson from './json_tests/negative_tests/release_assets_links_empty.json';
import ReleaseAssetsLinksInvalidLinkTypeJson from './json_tests/negative_tests/release_assets_links_invalid_link_type.json';
import ReleaseAssetsLinksMissingJson from './json_tests/negative_tests/release_assets_links_missing.json';
import ReleaseAssetsLinksJson from './json_tests/negative_tests/release_assets_links.json';
import RetryUnknownWhenJson from './json_tests/negative_tests/retry_unknown_when.json';
// YAML POSITIVE TEST
@ -35,38 +33,18 @@ import JobWhenYaml from './yaml_tests/positive_tests/job_when.yml';
// YAML NEGATIVE TEST
import ArtifactsNegativeYaml from './yaml_tests/negative_tests/artifacts.yml';
import CacheKeyNeative from './yaml_tests/negative_tests/cache.yml';
import IncludeNegativeYaml from './yaml_tests/negative_tests/include.yml';
import RulesNegativeYaml from './yaml_tests/negative_tests/rules.yml';
import VariablesInvalidSyntaxDescYaml from './yaml_tests/negative_tests/variables/invalid_syntax_desc.yml';
import VariablesWrongSyntaxUsageExpand from './yaml_tests/negative_tests/variables/wrong_syntax_usage_expand.yml';
import JobWhenNegativeYaml from './yaml_tests/negative_tests/job_when.yml';
import ProjectPathIncludeEmptyYaml from './yaml_tests/negative_tests/project_path/include/empty.yml';
import ProjectPathIncludeInvalidVariableYaml from './yaml_tests/negative_tests/project_path/include/invalid_variable.yml';
import ProjectPathIncludeLeadSlashYaml from './yaml_tests/negative_tests/project_path/include/leading_slash.yml';
import ProjectPathIncludeNoSlashYaml from './yaml_tests/negative_tests/project_path/include/no_slash.yml';
import ProjectPathIncludeTailSlashYaml from './yaml_tests/negative_tests/project_path/include/tailing_slash.yml';
import ProjectPathTriggerIncludeYaml from './yaml_tests/negative_tests/project_path/trigger/trigger_include.yml';
import ProjectPathTriggerMinimalEmptyYaml from './yaml_tests/negative_tests/project_path/trigger/minimal/empty.yml';
import ProjectPathTriggerMinimalInvalidVariableYaml from './yaml_tests/negative_tests/project_path/trigger/minimal/invalid_variable.yml';
import ProjectPathTriggerMinimalLeadSlashYaml from './yaml_tests/negative_tests/project_path/trigger/minimal/leading_slash.yml';
import ProjectPathTriggerMinimalNoSlashYaml from './yaml_tests/negative_tests/project_path/trigger/minimal/no_slash.yml';
import ProjectPathTriggerMinimalTailSlashYaml from './yaml_tests/negative_tests/project_path/trigger/minimal/tailing_slash.yml';
import ProjectPathTriggerProjectEmptyYaml from './yaml_tests/negative_tests/project_path/trigger/project/empty.yml';
import ProjectPathTriggerProjectInvalidVariableYaml from './yaml_tests/negative_tests/project_path/trigger/project/invalid_variable.yml';
import ProjectPathTriggerProjectLeadSlashYaml from './yaml_tests/negative_tests/project_path/trigger/project/leading_slash.yml';
import ProjectPathTriggerProjectNoSlashYaml from './yaml_tests/negative_tests/project_path/trigger/project/no_slash.yml';
import ProjectPathTriggerProjectTailSlashYaml from './yaml_tests/negative_tests/project_path/trigger/project/tailing_slash.yml';
import CacheKeyFilesNotArray from './yaml_tests/negative_tests/cache/key_files_not_an_array.yml';
import CacheKeyPrefixArray from './yaml_tests/negative_tests/cache/key_prefix_array.yml';
import CacheKeyWithDot from './yaml_tests/negative_tests/cache/key_with_dot.yml';
import CacheKeyWithMultipleDots from './yaml_tests/negative_tests/cache/key_with_multiple_dots.yml';
import CacheKeyWithSlash from './yaml_tests/negative_tests/cache/key_with_slash.yml';
import CachePathsNotAnArray from './yaml_tests/negative_tests/cache/paths_not_an_array.yml';
import CacheUntrackedString from './yaml_tests/negative_tests/cache/untracked_string.yml';
import CacheWhenInteger from './yaml_tests/negative_tests/cache/when_integer.yml';
import CacheWhenNotReservedKeyword from './yaml_tests/negative_tests/cache/when_not_reserved_keyword.yml';
import RulesNegativeYaml from './yaml_tests/negative_tests/rules.yml';
import TriggerNegative from './yaml_tests/negative_tests/trigger.yml';
import VariablesInvalidSyntaxDescYaml from './yaml_tests/negative_tests/variables/invalid_syntax_desc.yml';
import VariablesWrongSyntaxUsageExpand from './yaml_tests/negative_tests/variables/wrong_syntax_usage_expand.yml';
const ajv = new Ajv({
strictTypes: false,
@ -119,22 +97,12 @@ describe('negative tests', () => {
DefaultNoAdditionalPropertiesJson,
JobVariablesMustNotContainObjectsJson,
InheritDefaultNoAdditionalPropertiesJson,
ReleaseAssetsLinksEmptyJson,
ReleaseAssetsLinksInvalidLinkTypeJson,
ReleaseAssetsLinksMissingJson,
ReleaseAssetsLinksJson,
RetryUnknownWhenJson,
// YAML
ArtifactsNegativeYaml,
CacheKeyFilesNotArray,
CacheKeyPrefixArray,
CacheKeyWithDot,
CacheKeyWithMultipleDots,
CacheKeyWithSlash,
CachePathsNotAnArray,
CacheUntrackedString,
CacheWhenInteger,
CacheWhenNotReservedKeyword,
CacheKeyNeative,
IncludeNegativeYaml,
JobWhenNegativeYaml,
RulesNegativeYaml,
@ -145,17 +113,7 @@ describe('negative tests', () => {
ProjectPathIncludeLeadSlashYaml,
ProjectPathIncludeNoSlashYaml,
ProjectPathIncludeTailSlashYaml,
ProjectPathTriggerIncludeYaml,
ProjectPathTriggerMinimalEmptyYaml,
ProjectPathTriggerMinimalInvalidVariableYaml,
ProjectPathTriggerMinimalLeadSlashYaml,
ProjectPathTriggerMinimalNoSlashYaml,
ProjectPathTriggerMinimalTailSlashYaml,
ProjectPathTriggerProjectEmptyYaml,
ProjectPathTriggerProjectInvalidVariableYaml,
ProjectPathTriggerProjectLeadSlashYaml,
ProjectPathTriggerProjectNoSlashYaml,
ProjectPathTriggerProjectTailSlashYaml,
TriggerNegative,
}),
)('schema validates %s', (_, input) => {
// We construct a new "JSON" from each main key that is inside a

View File

@ -1,8 +1,10 @@
{
"karma": {
"inherit": {
"default": ["secrets"]
"default": [
"secrets"
]
},
"script": "karma"
}
}
}

View File

@ -1,7 +1,9 @@
{
"gitlab-ci-variables-object": {
"stage": "test",
"script": ["true"],
"script": [
"true"
],
"variables": {
"DEPLOY_ENVIRONMENT": {
"value": "staging",
@ -9,4 +11,4 @@
}
}
}
}
}

View File

@ -1,4 +1,24 @@
{
"gitlab-ci-release-assets-links-missing": {
"script": "dostuff",
"stage": "deploy",
"release": {
"description": "Created using the release-cli $EXTRA_DESCRIPTION",
"tag_name": "$CI_COMMIT_TAG",
"assets": {}
}
},
"gitlab-ci-release-assets-links-empty": {
"script": "dostuff",
"stage": "deploy",
"release": {
"description": "Created using the release-cli $EXTRA_DESCRIPTION",
"tag_name": "$CI_COMMIT_TAG",
"assets": {
"links": []
}
}
},
"gitlab-ci-release-assets-links-invalid-link-type": {
"script": "dostuff",
"stage": "deploy",
@ -21,4 +41,4 @@
}
}
}
}
}

View File

@ -1,13 +0,0 @@
{
"gitlab-ci-release-assets-links-empty": {
"script": "dostuff",
"stage": "deploy",
"release": {
"description": "Created using the release-cli $EXTRA_DESCRIPTION",
"tag_name": "$CI_COMMIT_TAG",
"assets": {
"links": []
}
}
}
}

View File

@ -1,11 +0,0 @@
{
"gitlab-ci-release-assets-links-missing": {
"script": "dostuff",
"stage": "deploy",
"release": {
"description": "Created using the release-cli $EXTRA_DESCRIPTION",
"tag_name": "$CI_COMMIT_TAG",
"assets": {}
}
}
}

View File

@ -6,4 +6,4 @@
"when": "gitlab-ci-retry-object-unknown-when"
}
}
}
}

View File

@ -0,0 +1,62 @@
cache-key-files-not-an-array:
script: echo "This job uses a cache."
cache:
key:
files: package.json
paths:
- vendor/ruby
- node_modules
cache-key-prefix-array:
script: echo "This job uses a cache."
cache:
key:
files:
- Gemfile.lock
prefix:
- binaries-cache-$CI_JOB_NAME
paths:
- binaries/
cache-key-with-.:
script: echo "This job uses a cache."
cache:
key: .
paths:
- binaries/
cache-key-with-multiple-.:
stage: test
script: echo "This job uses a cache."
cache:
key: ..
paths:
- binaries/
cache-key-with-/:
script: echo "This job uses a cache."
cache:
key: binaries-ca/che
paths:
- binaries/
cache-path-not-an-array:
script: echo "This job uses a cache."
cache:
key: binaries-cache
paths: binaries/*.apk
cache-untracked-string:
script: echo "This job uses a cache."
cache:
untracked: 'true'
when_integer:
script: echo "This job uses a cache."
cache:
when: 0
when_not_reserved_keyword:
script: echo "This job uses a cache."
cache:
when: 'never'

View File

@ -1,8 +0,0 @@
cache-key-files-not-an-array:
script: echo "This job uses a cache."
cache:
key:
files: package.json
paths:
- vendor/ruby
- node_modules

View File

@ -1,10 +0,0 @@
cache-key-prefix-array:
script: echo "This job uses a cache."
cache:
key:
files:
- Gemfile.lock
prefix:
- binaries-cache-$CI_JOB_NAME
paths:
- binaries/

View File

@ -1,6 +0,0 @@
cache-key-with-.:
script: echo "This job uses a cache."
cache:
key: .
paths:
- binaries/

View File

@ -1,7 +0,0 @@
cache-key-with-multiple-.:
stage: test
script: echo "This job uses a cache."
cache:
key: ..
paths:
- binaries/

View File

@ -1,6 +0,0 @@
cache-key-with-/:
script: echo "This job uses a cache."
cache:
key: binaries-ca/che
paths:
- binaries/

View File

@ -1,5 +0,0 @@
cache-path-not-an-array:
script: echo "This job uses a cache."
cache:
key: binaries-cache
paths: binaries/*.apk

View File

@ -1,4 +0,0 @@
cache-untracked-string:
script: echo "This job uses a cache."
cache:
untracked: 'true'

View File

@ -1,4 +0,0 @@
when_integer:
script: echo "This job uses a cache."
cache:
when: 0

View File

@ -1,4 +0,0 @@
when_not_reserved_keyword:
script: echo "This job uses a cache."
cache:
when: 'never'

Some files were not shown because too many files have changed in this diff Show More