Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
4279dbc29c
commit
2eafcb0673
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
mutation destroyPackages($ids: [PackagesPackageID!]!) {
|
||||
destroyPackages(input: { ids: $ids }) {
|
||||
errors
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
mutation updatePackageForwardingSettings($input: UpdateNamespacePackageSettingsInput!) {
|
||||
updateNamespacePackageSettings(input: $input) {
|
||||
packageSettings {
|
||||
mavenPackageRequestsForwarding
|
||||
lockMavenPackageRequestsForwarding
|
||||
mavenPackageRequestsForwardingLocked
|
||||
npmPackageRequestsForwarding
|
||||
lockNpmPackageRequestsForwarding
|
||||
npmPackageRequestsForwardingLocked
|
||||
pypiPackageRequestsForwarding
|
||||
lockPypiPackageRequestsForwarding
|
||||
pypiPackageRequestsForwardingLocked
|
||||
}
|
||||
errors
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1 @@
|
|||
a3266078f4760f0f5a4c7a43669cea1170924f29d6867e712620c2234dbf13c6
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)**
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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/**/*`)
|
||||
|
|
|
|||
|
|
@ -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). |
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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', () => {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -9,4 +9,4 @@
|
|||
"name": "test"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
{
|
||||
"karma": {
|
||||
"inherit": {
|
||||
"default": ["secrets"]
|
||||
"default": [
|
||||
"secrets"
|
||||
]
|
||||
},
|
||||
"script": "karma"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
{
|
||||
"gitlab-ci-variables-object": {
|
||||
"stage": "test",
|
||||
"script": ["true"],
|
||||
"script": [
|
||||
"true"
|
||||
],
|
||||
"variables": {
|
||||
"DEPLOY_ENVIRONMENT": {
|
||||
"value": "staging",
|
||||
|
|
@ -9,4 +11,4 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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": []
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,4 +6,4 @@
|
|||
"when": "gitlab-ci-retry-object-unknown-when"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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'
|
||||
|
|
@ -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
|
||||
|
|
@ -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/
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
cache-key-with-.:
|
||||
script: echo "This job uses a cache."
|
||||
cache:
|
||||
key: .
|
||||
paths:
|
||||
- binaries/
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
cache-key-with-multiple-.:
|
||||
stage: test
|
||||
script: echo "This job uses a cache."
|
||||
cache:
|
||||
key: ..
|
||||
paths:
|
||||
- binaries/
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
cache-key-with-/:
|
||||
script: echo "This job uses a cache."
|
||||
cache:
|
||||
key: binaries-ca/che
|
||||
paths:
|
||||
- binaries/
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
cache-path-not-an-array:
|
||||
script: echo "This job uses a cache."
|
||||
cache:
|
||||
key: binaries-cache
|
||||
paths: binaries/*.apk
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
cache-untracked-string:
|
||||
script: echo "This job uses a cache."
|
||||
cache:
|
||||
untracked: 'true'
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
when_integer:
|
||||
script: echo "This job uses a cache."
|
||||
cache:
|
||||
when: 0
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
when_not_reserved_keyword:
|
||||
script: echo "This job uses a cache."
|
||||
cache:
|
||||
when: 'never'
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
trigger-minimal:
|
||||
trigger: ''
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
trigger-minimal:
|
||||
trigger: 'slug#'
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
trigger-minimal:
|
||||
trigger: '/slug'
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
trigger-minimal:
|
||||
trigger: 'slug'
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
trigger-minimal:
|
||||
trigger: 'slug/'
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue