diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml index 5d17fad0c47..ba49ddfce9d 100644 --- a/.gitlab/ci/global.gitlab-ci.yml +++ b/.gitlab/ci/global.gitlab-ci.yml @@ -181,6 +181,15 @@ - *node-modules-cache-push - *assets-cache-push +.use-pg11: + image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36" + services: + - name: postgres:11.6 + command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] + - name: redis:5.0-alpine + variables: + POSTGRES_HOST_AUTH_METHOD: trust + .use-pg12: image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36" services: @@ -190,6 +199,17 @@ variables: POSTGRES_HOST_AUTH_METHOD: trust +.use-pg11-ee: + image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36" + services: + - name: postgres:11.6 + command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] + - name: redis:5.0-alpine + - name: elasticsearch:7.11.1 + command: ["elasticsearch", "-E", "discovery.type=single-node"] + variables: + POSTGRES_HOST_AUTH_METHOD: trust + .use-pg12-ee: image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36" services: diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index c4d393eb16c..b74c8ebf575 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -58,6 +58,11 @@ - !reference [.base-script, script] - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag level:migration" +.rspec-base-pg11: + extends: + - .rspec-base + - .use-pg11 + .rspec-base-pg12: extends: - .rspec-base @@ -70,6 +75,11 @@ - .use-pg12 needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests"] +.rspec-ee-base-pg11: + extends: + - .rspec-base + - .use-pg11-ee + .rspec-ee-base-pg12: extends: - .rspec-base @@ -81,6 +91,11 @@ - !reference [.base-script, script] - rspec_paralellized_job "--tag ~quarantine --tag geo" +.rspec-ee-base-geo-pg11: + extends: + - .rspec-ee-base-geo + - .use-pg11-ee + .rspec-ee-base-geo-pg12: extends: - .rspec-ee-base-geo @@ -277,6 +292,16 @@ rspec system pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-and-foss-system:minimal +# Dedicated job to test DB library code against PG11. +# Note that these are already tested against PG12 in the `rspec unit pg12` / `rspec-ee unit pg12` jobs. +rspec db-library-code pg11: + extends: + - .rspec-base-pg11 + - .rails:rules:ee-and-foss-db-library-code + script: + - !reference [.base-script, script] + - rspec_db_library_code + rspec fast_spec_helper: extends: - .rspec-base-pg12 @@ -637,6 +662,80 @@ db:rollback geo: # EE: default refs (MRs, default branch, schedules) jobs # ################################################## +########################################## +# EE/FOSS: default branch nightly scheduled jobs # +rspec migration pg11: + extends: + - .rspec-base-pg11 + - .rspec-base-migration + - .rails:rules:default-branch-schedule-nightly--code-backstage + - .rspec-migration-parallel + +rspec unit pg11: + extends: + - .rspec-base-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage + - .rspec-unit-parallel + +rspec integration pg11: + extends: + - .rspec-base-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage + - .rspec-integration-parallel + +rspec system pg11: + extends: + - .rspec-base-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage + - .rspec-system-parallel +# EE/FOSS: default branch nightly scheduled jobs # +########################################## + +##################################### +# EE: default branch nightly scheduled jobs # +rspec-ee migration pg11: + extends: + - .rspec-ee-base-pg11 + - .rspec-base-migration + - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only + - .rspec-ee-migration-parallel + +rspec-ee unit pg11: + extends: + - .rspec-ee-base-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only + - .rspec-ee-unit-parallel + +rspec-ee integration pg11: + extends: + - .rspec-ee-base-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only + - .rspec-ee-integration-parallel + +rspec-ee system pg11: + extends: + - .rspec-ee-base-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only + - .rspec-ee-system-parallel + +rspec-ee unit pg11 geo: + extends: + - .rspec-ee-base-geo-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only + - .rspec-ee-unit-geo-parallel + +rspec-ee integration pg11 geo: + extends: + - .rspec-ee-base-geo-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only + +rspec-ee system pg11 geo: + extends: + - .rspec-ee-base-geo-pg11 + - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only +# EE: default branch nightly scheduled jobs # +##################################### + ################################################## # EE: Canonical MR pipelines rspec fail-fast: diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index b6b02e5ce0e..ad59f7f93a8 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -c50b0080e9996e5db5eb4d75dfc3811618812798 +56aaf62b7d7045b9f6bdcd25566c005e5eca72fd diff --git a/Gemfile b/Gemfile index c8f3d5c6855..d6461e5f028 100644 --- a/Gemfile +++ b/Gemfile @@ -402,7 +402,7 @@ group :development, :test do end group :development, :test, :danger do - gem 'gitlab-dangerfiles', '~> 2.0.0', require: false + gem 'gitlab-dangerfiles', '~> 2.1.2', require: false end group :development, :test, :coverage do diff --git a/Gemfile.lock b/Gemfile.lock index fc257672822..323353d61ce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -451,7 +451,7 @@ GEM terminal-table (~> 1.5, >= 1.5.1) gitlab-chronic (0.10.5) numerizer (~> 0.2) - gitlab-dangerfiles (2.0.0) + gitlab-dangerfiles (2.1.2) danger-gitlab gitlab-experiment (0.5.4) activesupport (>= 3.0) @@ -1474,7 +1474,7 @@ DEPENDENCIES gitaly (~> 13.12.0.pre.rc1) github-markup (~> 1.7.0) gitlab-chronic (~> 0.10.5) - gitlab-dangerfiles (~> 2.0.0) + gitlab-dangerfiles (~> 2.1.2) gitlab-experiment (~> 0.5.4) gitlab-fog-azure-rm (~> 1.1.1) gitlab-fog-google (~> 1.13) diff --git a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue index bc1e401d373..77ec1f1af47 100644 --- a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue +++ b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue @@ -93,7 +93,7 @@ export default { placement="top" class="trigger-description gl-display-flex" > -
{{ item.description }}
+
{{ item.description }}
{{ __("You don't have any recent searches") }}
-
+
{{ @@ -184,7 +184,7 @@ export default { > /
-
+
-
+
-
+
{{ s__('ciReport|Fixed:') }} {{ issueName }} diff --git a/app/assets/javascripts/runner/constants.js b/app/assets/javascripts/runner/constants.js index d47efc85eff..a57d18ba745 100644 --- a/app/assets/javascripts/runner/constants.js +++ b/app/assets/javascripts/runner/constants.js @@ -10,6 +10,7 @@ export const RUNNER_ENTITY_TYPE = 'Ci::Runner'; // - Used for URL params names // - GlFilteredSearch tokens type +export const PARAM_KEY_SEARCH = 'search'; export const PARAM_KEY_STATUS = 'status'; export const PARAM_KEY_RUNNER_TYPE = 'runner_type'; export const PARAM_KEY_SORT = 'sort'; diff --git a/app/assets/javascripts/runner/graphql/get_runners.query.graphql b/app/assets/javascripts/runner/graphql/get_runners.query.graphql index 84b7e2547f5..45df9c625a6 100644 --- a/app/assets/javascripts/runner/graphql/get_runners.query.graphql +++ b/app/assets/javascripts/runner/graphql/get_runners.query.graphql @@ -6,6 +6,7 @@ query getRunners( $after: String $first: Int $last: Int + $search: String $status: CiRunnerStatus $type: CiRunnerType $sort: CiRunnerSort @@ -15,6 +16,7 @@ query getRunners( after: $after first: $first last: $last + search: $search status: $status type: $type sort: $sort diff --git a/app/assets/javascripts/runner/runner_list/runner_list_app.vue b/app/assets/javascripts/runner/runner_list/runner_list_app.vue index d53774709ba..b4eacb911a2 100644 --- a/app/assets/javascripts/runner/runner_list/runner_list_app.vue +++ b/app/assets/javascripts/runner/runner_list/runner_list_app.vue @@ -12,7 +12,7 @@ import { fromUrlQueryToSearch, fromSearchToUrl, fromSearchToVariables, -} from './filtered_search_utils'; +} from './runner_search_utils'; export default { components: { diff --git a/app/assets/javascripts/runner/runner_list/filtered_search_utils.js b/app/assets/javascripts/runner/runner_list/runner_search_utils.js similarity index 50% rename from app/assets/javascripts/runner/runner_list/filtered_search_utils.js rename to app/assets/javascripts/runner/runner_list/runner_search_utils.js index 2303dd587e1..e45972b81db 100644 --- a/app/assets/javascripts/runner/runner_list/filtered_search_utils.js +++ b/app/assets/javascripts/runner/runner_list/runner_search_utils.js @@ -1,5 +1,12 @@ import { queryToObject, setUrlParams } from '~/lib/utils/url_utility'; import { + filterToQueryObject, + processFilters, + urlQueryToFilter, + prepareTokens, +} from '~/vue_shared/components/filtered_search_bar/filtered_search_utils'; +import { + PARAM_KEY_SEARCH, PARAM_KEY_STATUS, PARAM_KEY_RUNNER_TYPE, PARAM_KEY_SORT, @@ -10,30 +17,6 @@ import { RUNNER_PAGE_SIZE, } from '../constants'; -const getValuesFromFilters = (paramKey, filters) => { - return filters - .filter(({ type, value }) => type === paramKey && value.operator === '=') - .map(({ value }) => value.data); -}; - -const getFilterFromParams = (paramKey, params) => { - const value = params[paramKey]; - if (!value) { - return []; - } - - const values = Array.isArray(value) ? value : [value]; - return values.map((data) => { - return { - type: paramKey, - value: { - data, - operator: '=', - }, - }; - }); -}; - const getPaginationFromParams = (params) => { const page = parseInt(params[PARAM_KEY_PAGE], 10); const after = params[PARAM_KEY_AFTER]; @@ -55,10 +38,13 @@ export const fromUrlQueryToSearch = (query = window.location.search) => { const params = queryToObject(query, { gatherArrays: true }); return { - filters: [ - ...getFilterFromParams(PARAM_KEY_STATUS, params), - ...getFilterFromParams(PARAM_KEY_RUNNER_TYPE, params), - ], + filters: prepareTokens( + urlQueryToFilter(query, { + filterNamesAllowList: [PARAM_KEY_STATUS, PARAM_KEY_RUNNER_TYPE], + filteredSearchTermKey: PARAM_KEY_SEARCH, + legacySpacesDecode: false, + }), + ), sort: params[PARAM_KEY_SORT] || DEFAULT_SORT, pagination: getPaginationFromParams(params), }; @@ -68,37 +54,44 @@ export const fromSearchToUrl = ( { filters = [], sort = null, pagination = {} }, url = window.location.href, ) => { - const urlParams = { - [PARAM_KEY_STATUS]: getValuesFromFilters(PARAM_KEY_STATUS, filters), - [PARAM_KEY_RUNNER_TYPE]: getValuesFromFilters(PARAM_KEY_RUNNER_TYPE, filters), + const filterParams = { + // Defaults + [PARAM_KEY_SEARCH]: null, + [PARAM_KEY_STATUS]: [], + [PARAM_KEY_RUNNER_TYPE]: [], + // Current filters + ...filterToQueryObject(processFilters(filters), { + filteredSearchTermKey: PARAM_KEY_SEARCH, + }), }; - if (sort && sort !== DEFAULT_SORT) { - urlParams[PARAM_KEY_SORT] = sort; - } + const isDefaultSort = sort !== DEFAULT_SORT; + const isFirstPage = pagination?.page === 1; + const otherParams = { + // Sorting & Pagination + [PARAM_KEY_SORT]: isDefaultSort ? sort : null, + [PARAM_KEY_PAGE]: isFirstPage ? null : pagination.page, + [PARAM_KEY_BEFORE]: isFirstPage ? null : pagination.before, + [PARAM_KEY_AFTER]: isFirstPage ? null : pagination.after, + }; - // Remove pagination params for first page - if (pagination?.page === 1) { - urlParams[PARAM_KEY_PAGE] = null; - urlParams[PARAM_KEY_BEFORE] = null; - urlParams[PARAM_KEY_AFTER] = null; - } else { - urlParams[PARAM_KEY_PAGE] = pagination.page; - urlParams[PARAM_KEY_BEFORE] = pagination.before; - urlParams[PARAM_KEY_AFTER] = pagination.after; - } - - return setUrlParams(urlParams, url, false, true, true); + return setUrlParams({ ...filterParams, ...otherParams }, url, false, true, true); }; export const fromSearchToVariables = ({ filters = [], sort = null, pagination = {} } = {}) => { const variables = {}; + const queryObj = filterToQueryObject(processFilters(filters), { + filteredSearchTermKey: PARAM_KEY_SEARCH, + }); + + variables.search = queryObj[PARAM_KEY_SEARCH]; + // TODO Get more than one value when GraphQL API supports OR for "status" - [variables.status] = getValuesFromFilters(PARAM_KEY_STATUS, filters); + [variables.status] = queryObj[PARAM_KEY_STATUS] || []; // TODO Get more than one value when GraphQL API supports OR for "runner type" - [variables.type] = getValuesFromFilters(PARAM_KEY_RUNNER_TYPE, filters); + [variables.type] = queryObj[PARAM_KEY_RUNNER_TYPE] || []; if (sort) { variables.sort = sort; diff --git a/app/assets/javascripts/search/topbar/components/app.vue b/app/assets/javascripts/search/topbar/components/app.vue index 2439ab55923..a490adbc11a 100644 --- a/app/assets/javascripts/search/topbar/components/app.vue +++ b/app/assets/javascripts/search/topbar/components/app.vue @@ -48,7 +48,7 @@ export default {