Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									555b877303
								
							
						
					
					
						commit
						132aeb2a72
					
				|  | @ -332,6 +332,15 @@ | ||||||
|     PG_VERSION: "15" |     PG_VERSION: "15" | ||||||
|     REDIS_VERSION: "7.0" |     REDIS_VERSION: "7.0" | ||||||
| 
 | 
 | ||||||
|  | .use-pg16: | ||||||
|  |   extends: | ||||||
|  |     - .pg-base-variables | ||||||
|  |   services: | ||||||
|  |     - !reference [.db-services-with-auto-explain, services] | ||||||
|  |   variables: | ||||||
|  |     PG_VERSION: "16" | ||||||
|  |     REDIS_VERSION: "7.0" | ||||||
|  | 
 | ||||||
| .es7-services: | .es7-services: | ||||||
|   services: |   services: | ||||||
|     - !reference [.zoekt-services, services] |     - !reference [.zoekt-services, services] | ||||||
|  | @ -362,6 +371,14 @@ | ||||||
|     - !reference [.db-services-with-auto-explain, services] |     - !reference [.db-services-with-auto-explain, services] | ||||||
|     - !reference [.es7-services, services] |     - !reference [.es7-services, services] | ||||||
| 
 | 
 | ||||||
|  | .use-pg16-es7-ee: | ||||||
|  |   extends: | ||||||
|  |     - .use-pg16 | ||||||
|  |     - .zoekt-variables | ||||||
|  |   services: | ||||||
|  |     - !reference [.db-services-with-auto-explain, services] | ||||||
|  |     - !reference [.es7-services, services] | ||||||
|  | 
 | ||||||
| .es8-services: | .es8-services: | ||||||
|   services: |   services: | ||||||
|     - !reference [.zoekt-services, services] |     - !reference [.zoekt-services, services] | ||||||
|  | @ -400,6 +417,15 @@ | ||||||
|     - !reference [.db-services-with-auto-explain, services] |     - !reference [.db-services-with-auto-explain, services] | ||||||
|     - !reference [.es8-services, services] |     - !reference [.es8-services, services] | ||||||
| 
 | 
 | ||||||
|  | .use-pg16-es8-ee: | ||||||
|  |   extends: | ||||||
|  |     - .use-pg16 | ||||||
|  |     - .zoekt-variables | ||||||
|  |     - .es8-variables | ||||||
|  |   services: | ||||||
|  |     - !reference [.db-services-with-auto-explain, services] | ||||||
|  |     - !reference [.es8-services, services] | ||||||
|  | 
 | ||||||
| .os1-services: | .os1-services: | ||||||
|   services: |   services: | ||||||
|     - !reference [.zoekt-services, services] |     - !reference [.zoekt-services, services] | ||||||
|  | @ -431,6 +457,14 @@ | ||||||
|     - !reference [.db-services-with-auto-explain, services] |     - !reference [.db-services-with-auto-explain, services] | ||||||
|     - !reference [.os1-services, services] |     - !reference [.os1-services, services] | ||||||
| 
 | 
 | ||||||
|  | .use-pg16-opensearch1-ee: | ||||||
|  |   extends: | ||||||
|  |     - .use-pg16 | ||||||
|  |     - .zoekt-variables | ||||||
|  |   services: | ||||||
|  |     - !reference [.db-services-with-auto-explain, services] | ||||||
|  |     - !reference [.os1-services, services] | ||||||
|  | 
 | ||||||
| .os2-services: | .os2-services: | ||||||
|   services: |   services: | ||||||
|     - !reference [.zoekt-services, services] |     - !reference [.zoekt-services, services] | ||||||
|  | @ -462,6 +496,14 @@ | ||||||
|     - !reference [.db-services-with-auto-explain, services] |     - !reference [.db-services-with-auto-explain, services] | ||||||
|     - !reference [.os2-services, services] |     - !reference [.os2-services, services] | ||||||
| 
 | 
 | ||||||
|  | .use-pg16-opensearch2-ee: | ||||||
|  |   extends: | ||||||
|  |     - .use-pg16 | ||||||
|  |     - .zoekt-variables | ||||||
|  |   services: | ||||||
|  |     - !reference [.db-services-with-auto-explain, services] | ||||||
|  |     - !reference [.os2-services, services] | ||||||
|  | 
 | ||||||
| .use-pg14-clickhouse23: | .use-pg14-clickhouse23: | ||||||
|   extends: .use-pg14 |   extends: .use-pg14 | ||||||
|   services: |   services: | ||||||
|  |  | ||||||
|  | @ -952,6 +952,39 @@ rspec system pg15: | ||||||
|     - .rspec-base-pg15 |     - .rspec-base-pg15 | ||||||
|     - .rails:rules:default-branch-schedule-nightly--code-backstage |     - .rails:rules:default-branch-schedule-nightly--code-backstage | ||||||
|     - .rspec-system-parallel |     - .rspec-system-parallel | ||||||
|  | 
 | ||||||
|  | # PG16 | ||||||
|  | rspec migration pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-pg16 | ||||||
|  |     - .rspec-base-migration | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage | ||||||
|  |     - .rspec-migration-parallel | ||||||
|  | 
 | ||||||
|  | rspec background_migration pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-pg16 | ||||||
|  |     - .rspec-base-migration | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage | ||||||
|  |     - .rspec-background-migration-parallel | ||||||
|  | 
 | ||||||
|  | rspec unit pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-pg16 | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage | ||||||
|  |     - .rspec-unit-parallel | ||||||
|  | 
 | ||||||
|  | rspec integration pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-pg16 | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage | ||||||
|  |     - .rspec-integration-parallel | ||||||
|  | 
 | ||||||
|  | rspec system pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-pg16 | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage | ||||||
|  |     - .rspec-system-parallel | ||||||
| # EE/FOSS: default branch nightly scheduled jobs # | # EE/FOSS: default branch nightly scheduled jobs # | ||||||
| ########################################## | ########################################## | ||||||
| 
 | 
 | ||||||
|  | @ -1109,6 +1142,90 @@ rspec-ee system pg15 es8: | ||||||
|   extends: |   extends: | ||||||
|     - .rspec-ee-base-pg15-es8 |     - .rspec-ee-base-pg15-es8 | ||||||
|     - .rspec-ee-system-parallel |     - .rspec-ee-system-parallel | ||||||
|  | 
 | ||||||
|  | # PG16 | ||||||
|  | rspec-ee unit pg16 opensearch1: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-opensearch1 | ||||||
|  |     - .rspec-ee-unit-parallel | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  | 
 | ||||||
|  | rspec-ee unit pg16 opensearch2: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-opensearch2 | ||||||
|  |     - .rspec-ee-unit-parallel | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  | 
 | ||||||
|  | rspec-ee integration pg16 opensearch1: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-opensearch1 | ||||||
|  |     - .rspec-ee-integration-parallel | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  | 
 | ||||||
|  | rspec-ee integration pg16 opensearch2: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-opensearch2 | ||||||
|  |     - .rspec-ee-integration-parallel | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  | 
 | ||||||
|  | rspec-ee system pg16 opensearch1: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-opensearch1 | ||||||
|  |     - .rspec-ee-system-parallel | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  | 
 | ||||||
|  | rspec-ee system pg16 opensearch2: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-opensearch2 | ||||||
|  |     - .rspec-ee-system-parallel | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  | 
 | ||||||
|  | rspec-ee migration pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16 | ||||||
|  |     - .rspec-base-migration | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  |     - .rspec-ee-migration-parallel | ||||||
|  | 
 | ||||||
|  | rspec-ee background_migration pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16 | ||||||
|  |     - .rspec-base-migration | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  |     - .rspec-ee-background-migration-parallel | ||||||
|  | 
 | ||||||
|  | rspec-ee unit pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16 | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  |     - .rspec-ee-unit-parallel | ||||||
|  | 
 | ||||||
|  | rspec-ee unit pg16 es8: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-es8 | ||||||
|  |     - .rspec-ee-unit-parallel | ||||||
|  | 
 | ||||||
|  | rspec-ee integration pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16 | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  |     - .rspec-ee-integration-parallel | ||||||
|  | 
 | ||||||
|  | rspec-ee integration pg16 es8: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-es8 | ||||||
|  |     - .rspec-ee-integration-parallel | ||||||
|  | 
 | ||||||
|  | rspec-ee system pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16 | ||||||
|  |     - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only | ||||||
|  |     - .rspec-ee-system-parallel | ||||||
|  | 
 | ||||||
|  | rspec-ee system pg16 es8: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg16-es8 | ||||||
|  |     - .rspec-ee-system-parallel | ||||||
| # EE: default branch nightly scheduled jobs # | # EE: default branch nightly scheduled jobs # | ||||||
| ##################################### | ##################################### | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -187,6 +187,11 @@ include: | ||||||
|     - .rspec-base |     - .rspec-base | ||||||
|     - .use-pg15 |     - .use-pg15 | ||||||
| 
 | 
 | ||||||
|  | .rspec-base-pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base | ||||||
|  |     - .use-pg16 | ||||||
|  | 
 | ||||||
| .rspec-ee-base-pg13: | .rspec-ee-base-pg13: | ||||||
|   extends: |   extends: | ||||||
|     - .rspec-base |     - .rspec-base | ||||||
|  | @ -256,6 +261,29 @@ include: | ||||||
|     - .use-pg15-opensearch2-ee |     - .use-pg15-opensearch2-ee | ||||||
|     - .rails:rules:run-search-tests |     - .rails:rules:run-search-tests | ||||||
| 
 | 
 | ||||||
|  | .rspec-ee-base-pg16: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base | ||||||
|  |     - .use-pg16-es7-ee | ||||||
|  | 
 | ||||||
|  | .rspec-ee-base-pg16-es8: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base | ||||||
|  |     - .use-pg16-es8-ee | ||||||
|  |     - .rails:rules:run-search-tests | ||||||
|  | 
 | ||||||
|  | .rspec-ee-base-pg16-opensearch1: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base | ||||||
|  |     - .use-pg16-opensearch1-ee | ||||||
|  |     - .rails:rules:run-search-tests | ||||||
|  | 
 | ||||||
|  | .rspec-ee-base-pg16-opensearch2: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base | ||||||
|  |     - .use-pg16-opensearch2-ee | ||||||
|  |     - .rails:rules:run-search-tests | ||||||
|  | 
 | ||||||
| .db-job-base: | .db-job-base: | ||||||
|   extends: |   extends: | ||||||
|     - .rails-job-base |     - .rails-job-base | ||||||
|  |  | ||||||
|  | @ -219,7 +219,7 @@ templates-shellcheck: | ||||||
|     - .default-before_script |     - .default-before_script | ||||||
|     - .default-retry |     - .default-retry | ||||||
|     - .ruby-cache |     - .ruby-cache | ||||||
|     - .use-pg15 |     - .use-pg16 | ||||||
|   stage: lint |   stage: lint | ||||||
|   needs: |   needs: | ||||||
|     - setup-test-env |     - setup-test-env | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								Gemfile
								
								
								
								
							
							
						
						
									
										2
									
								
								Gemfile
								
								
								
								
							|  | @ -522,7 +522,7 @@ group :test do | ||||||
|   # Moved in `test` because https://gitlab.com/gitlab-org/gitlab/-/issues/217527 |   # Moved in `test` because https://gitlab.com/gitlab-org/gitlab/-/issues/217527 | ||||||
|   gem 'derailed_benchmarks', require: false # rubocop:todo Gemfile/MissingFeatureCategory |   gem 'derailed_benchmarks', require: false # rubocop:todo Gemfile/MissingFeatureCategory | ||||||
| 
 | 
 | ||||||
|   gem 'gitlab_quality-test_tooling', '~> 1.14.2', require: false, feature_category: :tooling |   gem 'gitlab_quality-test_tooling', '~> 1.15.0', require: false, feature_category: :tooling | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| gem 'octokit', '~> 8.0', feature_category: :importers | gem 'octokit', '~> 8.0', feature_category: :importers | ||||||
|  |  | ||||||
|  | @ -227,7 +227,7 @@ | ||||||
| {"name":"gitlab-styles","version":"11.0.0","platform":"ruby","checksum":"0dd8ec066ce9955ac51d3616c6bfded30f75bb526f39ff392ece6f43d5b9406b"}, | {"name":"gitlab-styles","version":"11.0.0","platform":"ruby","checksum":"0dd8ec066ce9955ac51d3616c6bfded30f75bb526f39ff392ece6f43d5b9406b"}, | ||||||
| {"name":"gitlab_chronic_duration","version":"0.12.0","platform":"ruby","checksum":"0d766944d415b5c831f176871ee8625783fc0c5bfbef2d79a3a616f207ffc16d"}, | {"name":"gitlab_chronic_duration","version":"0.12.0","platform":"ruby","checksum":"0d766944d415b5c831f176871ee8625783fc0c5bfbef2d79a3a616f207ffc16d"}, | ||||||
| {"name":"gitlab_omniauth-ldap","version":"2.2.0","platform":"ruby","checksum":"bb4d20acb3b123ed654a8f6a47d3fac673ece7ed0b6992edb92dca14bad2838c"}, | {"name":"gitlab_omniauth-ldap","version":"2.2.0","platform":"ruby","checksum":"bb4d20acb3b123ed654a8f6a47d3fac673ece7ed0b6992edb92dca14bad2838c"}, | ||||||
| {"name":"gitlab_quality-test_tooling","version":"1.14.2","platform":"ruby","checksum":"9ee343328d5e755b54d97729adc5a743abd83b05e9b28d9bbbe74f393b6cf658"}, | {"name":"gitlab_quality-test_tooling","version":"1.15.0","platform":"ruby","checksum":"33416dce2d6a686ea95643eb650a249e94f696731e7f7c5bc552b369b2ba0bb5"}, | ||||||
| {"name":"globalid","version":"1.1.0","platform":"ruby","checksum":"b337e1746f0c8cb0a6c918234b03a1ddeb4966206ce288fbb57779f59b2d154f"}, | {"name":"globalid","version":"1.1.0","platform":"ruby","checksum":"b337e1746f0c8cb0a6c918234b03a1ddeb4966206ce288fbb57779f59b2d154f"}, | ||||||
| {"name":"gon","version":"6.4.0","platform":"ruby","checksum":"e3a618d659392890f1aa7db420f17c75fd7d35aeb5f8fe003697d02c4b88d2f0"}, | {"name":"gon","version":"6.4.0","platform":"ruby","checksum":"e3a618d659392890f1aa7db420f17c75fd7d35aeb5f8fe003697d02c4b88d2f0"}, | ||||||
| {"name":"google-apis-androidpublisher_v3","version":"0.34.0","platform":"ruby","checksum":"d7e1d7dd92f79c498fe2082222a1740d788e022e660c135564b3fd299cab5425"}, | {"name":"google-apis-androidpublisher_v3","version":"0.34.0","platform":"ruby","checksum":"d7e1d7dd92f79c498fe2082222a1740d788e022e660c135564b3fd299cab5425"}, | ||||||
|  |  | ||||||
|  | @ -742,7 +742,7 @@ GEM | ||||||
|       omniauth (>= 1.3, < 3) |       omniauth (>= 1.3, < 3) | ||||||
|       pyu-ruby-sasl (>= 0.0.3.3, < 0.1) |       pyu-ruby-sasl (>= 0.0.3.3, < 0.1) | ||||||
|       rubyntlm (~> 0.5) |       rubyntlm (~> 0.5) | ||||||
|     gitlab_quality-test_tooling (1.14.2) |     gitlab_quality-test_tooling (1.15.0) | ||||||
|       activesupport (>= 6.1, < 7.1) |       activesupport (>= 6.1, < 7.1) | ||||||
|       amatch (~> 0.4.1) |       amatch (~> 0.4.1) | ||||||
|       gitlab (~> 4.19) |       gitlab (~> 4.19) | ||||||
|  | @ -1935,7 +1935,7 @@ DEPENDENCIES | ||||||
|   gitlab-utils! |   gitlab-utils! | ||||||
|   gitlab_chronic_duration (~> 0.12) |   gitlab_chronic_duration (~> 0.12) | ||||||
|   gitlab_omniauth-ldap (~> 2.2.0) |   gitlab_omniauth-ldap (~> 2.2.0) | ||||||
|   gitlab_quality-test_tooling (~> 1.14.2) |   gitlab_quality-test_tooling (~> 1.15.0) | ||||||
|   gon (~> 6.4.0) |   gon (~> 6.4.0) | ||||||
|   google-apis-androidpublisher_v3 (~> 0.34.0) |   google-apis-androidpublisher_v3 (~> 0.34.0) | ||||||
|   google-apis-cloudbilling_v1 (~> 0.21.0) |   google-apis-cloudbilling_v1 (~> 0.21.0) | ||||||
|  |  | ||||||
|  | @ -1418,6 +1418,7 @@ Input type: `AiActionInput` | ||||||
| | <a id="mutationaiactiongeneratedescription"></a>`generateDescription` | [`AiGenerateDescriptionInput`](#aigeneratedescriptioninput) | Input for generate_description AI action. | | | <a id="mutationaiactiongeneratedescription"></a>`generateDescription` | [`AiGenerateDescriptionInput`](#aigeneratedescriptioninput) | Input for generate_description AI action. | | ||||||
| | <a id="mutationaiactionresolvevulnerability"></a>`resolveVulnerability` | [`AiResolveVulnerabilityInput`](#airesolvevulnerabilityinput) | Input for resolve_vulnerability AI action. | | | <a id="mutationaiactionresolvevulnerability"></a>`resolveVulnerability` | [`AiResolveVulnerabilityInput`](#airesolvevulnerabilityinput) | Input for resolve_vulnerability AI action. | | ||||||
| | <a id="mutationaiactionsummarizecomments"></a>`summarizeComments` | [`AiSummarizeCommentsInput`](#aisummarizecommentsinput) | Input for summarize_comments AI action. | | | <a id="mutationaiactionsummarizecomments"></a>`summarizeComments` | [`AiSummarizeCommentsInput`](#aisummarizecommentsinput) | Input for summarize_comments AI action. | | ||||||
|  | | <a id="mutationaiactionsummarizenewmergerequest"></a>`summarizeNewMergeRequest` | [`AiSummarizeNewMergeRequestInput`](#aisummarizenewmergerequestinput) | Input for summarize_new_merge_request AI action. | | ||||||
| | <a id="mutationaiactionsummarizereview"></a>`summarizeReview` | [`AiSummarizeReviewInput`](#aisummarizereviewinput) | Input for summarize_review AI action. | | | <a id="mutationaiactionsummarizereview"></a>`summarizeReview` | [`AiSummarizeReviewInput`](#aisummarizereviewinput) | Input for summarize_review AI action. | | ||||||
| 
 | 
 | ||||||
| #### Fields | #### Fields | ||||||
|  | @ -34985,6 +34986,19 @@ see the associated mutation type above. | ||||||
| | ---- | ---- | ----------- | | | ---- | ---- | ----------- | | ||||||
| | <a id="aisummarizecommentsinputresourceid"></a>`resourceId` | [`AiModelID!`](#aimodelid) | Global ID of the resource to mutate. | | | <a id="aisummarizecommentsinputresourceid"></a>`resourceId` | [`AiModelID!`](#aimodelid) | Global ID of the resource to mutate. | | ||||||
| 
 | 
 | ||||||
|  | ### `AiSummarizeNewMergeRequestInput` | ||||||
|  | 
 | ||||||
|  | Summarize a new merge request based on two branches. Returns `null` if the `add_ai_summary_for_new_mr` feature flag is disabled. | ||||||
|  | 
 | ||||||
|  | #### Arguments | ||||||
|  | 
 | ||||||
|  | | Name | Type | Description | | ||||||
|  | | ---- | ---- | ----------- | | ||||||
|  | | <a id="aisummarizenewmergerequestinputresourceid"></a>`resourceId` | [`AiModelID!`](#aimodelid) | Global ID of the resource to mutate. | | ||||||
|  | | <a id="aisummarizenewmergerequestinputsourcebranch"></a>`sourceBranch` | [`String!`](#string) | Source branch of the changes. | | ||||||
|  | | <a id="aisummarizenewmergerequestinputsourceprojectid"></a>`sourceProjectId` | [`ID`](#id) | ID of the project where the changes are from. | | ||||||
|  | | <a id="aisummarizenewmergerequestinputtargetbranch"></a>`targetBranch` | [`String!`](#string) | Target branch of where the changes will be merged into. | | ||||||
|  | 
 | ||||||
| ### `AiSummarizeReviewInput` | ### `AiSummarizeReviewInput` | ||||||
| 
 | 
 | ||||||
| #### Arguments | #### Arguments | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ coach: | ||||||
| approvers: [] | approvers: [] | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
| Disclaimer: This blueprint requires more cross-functional alignment - [Confidence Level] --> Low | Disclaimer: This blueprint requires more cross-functional alignment - **Confidence Level:** Low | ||||||
| 
 | 
 | ||||||
| # Application Deployment with a Cellular Architecture | # Application Deployment with a Cellular Architecture | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -123,7 +123,7 @@ However, Service-Integration will establish certain necessary and optional requi | ||||||
| | ID | Required | Detail | Epic/Issue | Done? | | | ID | Required | Detail | Epic/Issue | Done? | | ||||||
| |---|---|---|---|---| | |---|---|---|---|---| | ||||||
| | `R100` | Required    | The platform should be easy to use: imagine Heroku with [GitLab Production Readiness-approved](https://handbook.gitlab.com/handbook/engineering/infrastructure/production/readiness/) defaults. | [Runway to [BETA] : Increased Adoption and Self Service](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/1115) | **{dotted-circle}** No | | | `R100` | Required    | The platform should be easy to use: imagine Heroku with [GitLab Production Readiness-approved](https://handbook.gitlab.com/handbook/engineering/infrastructure/production/readiness/) defaults. | [Runway to [BETA] : Increased Adoption and Self Service](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/1115) | **{dotted-circle}** No | | ||||||
| | `R110` | Required    | With the exception of an Infrastructure-led onboarding process, services are owned, deployed and managed by stage-group teams. In other words,services follow a “You Build It, You Run It” model of ownership.| [[Paused] Discussion: Tiered Support Model for Runway](https://gitlab.com/gitlab-com/gl-infra/platform/runway/team/-/issues/97) | **{dotted-circle}** No | | | `R110` | Required    | With the exception of an Infrastructure-led onboarding process, services are owned, deployed and managed by stage-group teams. In other words,services follow a "You Build It, You Run It" model of ownership.| [[Paused] Discussion: Tiered Support Model for Runway](https://gitlab.com/gitlab-com/gl-infra/platform/runway/team/-/issues/97) | **{dotted-circle}** No | | ||||||
| | `R120` | Required    | Programming-language agnostic: no requirements for services. Services should be packaged as container images.| [Runway to [BETA] : Increased Adoption and Self Service](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/1115) | **{dotted-circle}** No | | | `R120` | Required    | Programming-language agnostic: no requirements for services. Services should be packaged as container images.| [Runway to [BETA] : Increased Adoption and Self Service](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/1115) | **{dotted-circle}** No | | ||||||
| | `R130` | Recommended | Each service should be evaluated against the GitLab.com [Service Maturity Model](https://handbook.gitlab.com/handbook/engineering/infrastructure/service-maturity-model/).| [Discussion: Introduce an 'Infrastructure Well-Architected Service Framework'](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/2537) | **{dotted-circle}** No | | | `R130` | Recommended | Each service should be evaluated against the GitLab.com [Service Maturity Model](https://handbook.gitlab.com/handbook/engineering/infrastructure/service-maturity-model/).| [Discussion: Introduce an 'Infrastructure Well-Architected Service Framework'](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/2537) | **{dotted-circle}** No | | ||||||
| | `R140` | Recommended | Services using the platform have expedited production-readiness processes. {::nomarkdown}<ol><li>Production-readiness requirements graded by service maturity: low-traffic, low-maturity experimental services will have lower requirement thresholds than more mature services. </li><li> By default, the platform should provide services with defaults that would pass production-readiness review for the lowest service maturity-level. </li><li> At introduction, lowest maturity services can be deployed without production readiness, provided the meet certain automatically validated requirements. This removes Infrastructure gate-keeping from being a blocker to experimental service delivery.</li></ol>{:/} | | | | | `R140` | Recommended | Services using the platform have expedited production-readiness processes. {::nomarkdown}<ol><li>Production-readiness requirements graded by service maturity: low-traffic, low-maturity experimental services will have lower requirement thresholds than more mature services. </li><li> By default, the platform should provide services with defaults that would pass production-readiness review for the lowest service maturity-level. </li><li> At introduction, lowest maturity services can be deployed without production readiness, provided the meet certain automatically validated requirements. This removes Infrastructure gate-keeping from being a blocker to experimental service delivery.</li></ol>{:/} | | | | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ Keeping up with the latest version of Vue ensures that the GitLab frontend lever | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: GitLab is currently using Vue 2.x. | - **As of December 2023**: GitLab is currently using Vue 2.x. | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -26,11 +26,11 @@ Keeping up with the latest version of Vue ensures that the GitLab frontend lever | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
|  | @ -38,12 +38,12 @@ Keeping up with the latest version of Vue ensures that the GitLab frontend lever | ||||||
| 
 | 
 | ||||||
| ### State Management | ### State Management | ||||||
| 
 | 
 | ||||||
| When global state management is needed, it should happen in Apollo instead of Vuex or other state management libraries. See [https://docs.gitlab.com/ee/development/fe_guide/migrating_from_vuex.html](migrating_from_vuex.md) for more details regarding why and how we plan on migrating. | When global state management is needed, it should happen in Apollo instead of Vuex or other state management libraries. See [Migrating from Vuex](migrating_from_vuex.md) for more details regarding why and how we plan on migrating. | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -52,24 +52,24 @@ When global state management is needed, it should happen in Apollo instead of Vu | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ### HAML by default | ### HAML by default | ||||||
| 
 | 
 | ||||||
| We'll continue using HAML over Vue when appropriate. See [https://docs.gitlab.com/ee/development/fe_guide/vue.html#when-to-add-vue-application](vue.md#when-to-add-vue-application) on how to decide when Vue should be chosen. | We'll continue using HAML over Vue when appropriate. See [when to add Vue application](vue.md#when-to-add-vue-application) on how to decide when Vue should be chosen. | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -78,15 +78,15 @@ We'll continue using HAML over Vue when appropriate. See [https://docs.gitlab.co | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ### Complete removal of jQuery | ### Complete removal of jQuery | ||||||
| 
 | 
 | ||||||
|  | @ -94,8 +94,8 @@ In 2019 we committed to no longer use jQuery, however we have not prioritized fu | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -104,15 +104,15 @@ In 2019 we committed to no longer use jQuery, however we have not prioritized fu | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ### Dependencies management | ### Dependencies management | ||||||
| 
 | 
 | ||||||
|  | @ -120,8 +120,8 @@ Similar to keeping on the latest major version of Vue, we should try to keep as | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -130,15 +130,15 @@ Similar to keeping on the latest major version of Vue, we should try to keep as | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ## Best Practices | ## Best Practices | ||||||
| 
 | 
 | ||||||
|  | @ -168,8 +168,8 @@ For navigation between clusters, we can still rely on Rails routing. These cases | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -178,15 +178,15 @@ For navigation between clusters, we can still rely on Rails routing. These cases | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ### Reusable components | ### Reusable components | ||||||
| 
 | 
 | ||||||
|  | @ -203,8 +203,8 @@ This is currently under development. Follow the [GitLab Modular Monolith for FE] | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -213,15 +213,15 @@ This is currently under development. Follow the [GitLab Modular Monolith for FE] | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ### Migrate to PostCSS | ### Migrate to PostCSS | ||||||
| 
 | 
 | ||||||
|  | @ -229,8 +229,8 @@ SASS compilation takes almost half of the total frontend compilation time. This | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -239,15 +239,15 @@ SASS compilation takes almost half of the total frontend compilation time. This | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ## Collaboration and Tooling | ## Collaboration and Tooling | ||||||
| 
 | 
 | ||||||
|  | @ -257,8 +257,8 @@ We're early in the process of adding visual testing, but we should have a framew | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -267,15 +267,15 @@ We're early in the process of adding visual testing, but we should have a framew | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
| 
 | 
 | ||||||
| ### Accessibility testing | ### Accessibility testing | ||||||
| 
 | 
 | ||||||
|  | @ -283,8 +283,8 @@ In 2023 we determined the tooling for accessibility testing. We opted for axe-co | ||||||
| 
 | 
 | ||||||
| **Current Status** | **Current Status** | ||||||
| 
 | 
 | ||||||
| - **As of December 2023**: [Status] | - **As of December 2023**: (Status) | ||||||
| - **Progress**: [Brief description of progress] | - **Progress**: (Brief description of progress) | ||||||
| 
 | 
 | ||||||
| **Responsible Team** | **Responsible Team** | ||||||
| 
 | 
 | ||||||
|  | @ -293,12 +293,12 @@ In 2023 we determined the tooling for accessibility testing. We opted for axe-co | ||||||
| 
 | 
 | ||||||
| **Milestones and Timelines** | **Milestones and Timelines** | ||||||
| 
 | 
 | ||||||
| - [Key milestones, expected completions] | - (Key milestones, expected completions) | ||||||
| 
 | 
 | ||||||
| **Challenges and Dependencies** | **Challenges and Dependencies** | ||||||
| 
 | 
 | ||||||
| - [Any major challenges] | - (Any major challenges) | ||||||
| 
 | 
 | ||||||
| **Success Metrics** | **Success Metrics** | ||||||
| 
 | 
 | ||||||
| - [Potential metrics] | - (Potential metrics) | ||||||
|  |  | ||||||
|  | @ -681,7 +681,7 @@ This should let us: | ||||||
| Our test suite runs against PostgreSQL 14 as GitLab.com runs on PostgreSQL 14 and | Our test suite runs against PostgreSQL 14 as GitLab.com runs on PostgreSQL 14 and | ||||||
| [Omnibus defaults to PG14 for new installs and upgrades](../../administration/package_information/postgresql_versions.md). | [Omnibus defaults to PG14 for new installs and upgrades](../../administration/package_information/postgresql_versions.md). | ||||||
| 
 | 
 | ||||||
| We do run our test suite against PostgreSQL 14 on nightly scheduled pipelines. | We run our test suite against PostgreSQL 13, 14, 15 and 16 on nightly scheduled pipelines. | ||||||
| 
 | 
 | ||||||
| We also run our test suite against PostgreSQL 13 upon specific database library changes in merge requests and `main` pipelines (with the `rspec db-library-code pg13` job). | We also run our test suite against PostgreSQL 13 upon specific database library changes in merge requests and `main` pipelines (with the `rspec db-library-code pg13` job). | ||||||
| 
 | 
 | ||||||
|  | @ -694,7 +694,7 @@ We also run our test suite against PostgreSQL 13 upon specific database library | ||||||
| | `maintenance` scheduled pipelines for the `master` branch (every even-numbered hour at XX:05)    | 14 (default version), 13 for DB library changes | 3.1 (default version) | | | `maintenance` scheduled pipelines for the `master` branch (every even-numbered hour at XX:05)    | 14 (default version), 13 for DB library changes | 3.1 (default version) | | ||||||
| | `maintenance` scheduled pipelines for the `ruby3_0` branch (every odd-numbered hour at XX:40)    | 14 (default version), 13 for DB library changes | 3.0                   | | | `maintenance` scheduled pipelines for the `ruby3_0` branch (every odd-numbered hour at XX:40)    | 14 (default version), 13 for DB library changes | 3.0                   | | ||||||
| | `maintenance` scheduled pipelines for the `ruby3_2` branch (every odd-numbered hour at XX:10)    | 14 (default version), 13 for DB library changes | 3.2                   | | | `maintenance` scheduled pipelines for the `ruby3_2` branch (every odd-numbered hour at XX:10)    | 14 (default version), 13 for DB library changes | 3.2                   | | ||||||
| | `nightly` scheduled pipelines for the `master` branch                                            | 14 (default version), 13, 15                    | 3.1 (default version) | | | `nightly` scheduled pipelines for the `master` branch                                            | 14 (default version), 13, 15, 16                    | 3.1 (default version) | | ||||||
| 
 | 
 | ||||||
| For each current Ruby versions we're testing against with, we run | For each current Ruby versions we're testing against with, we run | ||||||
| maintenance scheduled pipelines every 2 hours on their respective `ruby\d_\d` | maintenance scheduled pipelines every 2 hours on their respective `ruby\d_\d` | ||||||
|  |  | ||||||
|  | @ -181,6 +181,8 @@ that are scoped to a single [configuration keyword](../../ci/yaml/index.md#job-k | ||||||
| | `.use-pg14-ee` | Same as `.use-pg14` but also use an `elasticsearch` service (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific version of the service). | | | `.use-pg14-ee` | Same as `.use-pg14` but also use an `elasticsearch` service (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific version of the service). | | ||||||
| | `.use-pg15` | Allows a job to use the `postgres` 15, `redis`, and `rediscluster` services (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific versions of the services). | | | `.use-pg15` | Allows a job to use the `postgres` 15, `redis`, and `rediscluster` services (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific versions of the services). | | ||||||
| | `.use-pg15-ee` | Same as `.use-pg15` but also use an `elasticsearch` service (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific version of the service). | | | `.use-pg15-ee` | Same as `.use-pg15` but also use an `elasticsearch` service (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific version of the service). | | ||||||
|  | | `.use-pg16` | Allows a job to use the `postgres` 16, `redis`, and `rediscluster` services (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific versions of the services). | | ||||||
|  | | `.use-pg16-ee` | Same as `.use-pg16` but also use an `elasticsearch` service (see [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml) for the specific version of the service). | | ||||||
| | `.use-kaniko` | Allows a job to use the `kaniko` tool to build Docker images. | | | `.use-kaniko` | Allows a job to use the `kaniko` tool to build Docker images. | | ||||||
| | `.as-if-foss` | Simulate the FOSS project by setting the `FOSS_ONLY='1'` CI/CD variable. | | | `.as-if-foss` | Simulate the FOSS project by setting the `FOSS_ONLY='1'` CI/CD variable. | | ||||||
| | `.use-docker-in-docker` | Allows a job to use Docker in Docker. For more details, see the [handbook about CI/CD configuration](https://handbook.gitlab.com/handbook/engineering/gitlab-repositories/#cicd-configuration). | | | `.use-docker-in-docker` | Allows a job to use Docker in Docker. For more details, see the [handbook about CI/CD configuration](https://handbook.gitlab.com/handbook/engineering/gitlab-repositories/#cicd-configuration). | | ||||||
|  |  | ||||||
|  | @ -54,7 +54,7 @@ Documentation and References: | ||||||
| 
 | 
 | ||||||
| #### AWS CodePipeline Integrations | #### AWS CodePipeline Integrations | ||||||
| 
 | 
 | ||||||
| [AWS CodePipeline Integration](https://docs.aws.amazon.com/codepipeline/latest/userguide/connections-gitlab.html) - by using GitLab as CodeStar Connections source for CodePipeline, additional AWS service integrations are available. [[12/28/2023](https://aws.amazon.com/about-aws/whats-new/2023/12/codepipeline-gitlab-self-managed/)] `[AWS Built]` | [AWS CodePipeline Integration](https://docs.aws.amazon.com/codepipeline/latest/userguide/connections-gitlab.html) - by using GitLab as CodeStar Connections source for CodePipeline, additional AWS service integrations are available. ([12/28/2023](https://aws.amazon.com/about-aws/whats-new/2023/12/codepipeline-gitlab-self-managed/)) `[AWS Built]` | ||||||
| 
 | 
 | ||||||
| AWS Services that are supported by an AWS CodePipeline integration: | AWS Services that are supported by an AWS CodePipeline integration: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -135,7 +135,7 @@ To create the **UX workflow** issue board: | ||||||
| 1. Clear the **Show the Open list** and **Show the Closed list** checkboxes. | 1. Clear the **Show the Open list** and **Show the Closed list** checkboxes. | ||||||
| 1. Select **Create board**. You should see an empty board. | 1. Select **Create board**. You should see an empty board. | ||||||
| 1. Create a list for the `Workflow::Ready for design` label: | 1. Create a list for the `Workflow::Ready for design` label: | ||||||
|    1. In the upper-left corner of the issue board page, select **Create list**. |    1. In the upper-right corner of the issue board page, select **Create list**. | ||||||
|    1. In the column that appears, from the **Value** dropdown list, select the `Workflow::Ready for design` label. |    1. In the column that appears, from the **Value** dropdown list, select the `Workflow::Ready for design` label. | ||||||
|    1. Select **Add to board**. |    1. Select **Add to board**. | ||||||
| 1. Repeat the previous step for labels `Workflow::Design` and `Workflow::Ready for development`. | 1. Repeat the previous step for labels `Workflow::Design` and `Workflow::Ready for development`. | ||||||
|  | @ -152,7 +152,7 @@ To create the **Frontend workflow** board: | ||||||
| 1. Next to **Labels**, select **Edit** and select the `Frontend` label. | 1. Next to **Labels**, select **Edit** and select the `Frontend` label. | ||||||
| 1. Select **Create board**. | 1. Select **Create board**. | ||||||
| 1. Create a list for the `Workflow::Ready for development` label: | 1. Create a list for the `Workflow::Ready for development` label: | ||||||
|    1. In the upper-left corner of the issue board page, select **Create list**. |    1. In the upper-right corner of the issue board page, select **Create list**. | ||||||
|    1. In the column that appeared, from the **Value** dropdown list, select the `Workflow::Ready for development` label. |    1. In the column that appeared, from the **Value** dropdown list, select the `Workflow::Ready for development` label. | ||||||
|    1. Select **Add to board**. |    1. Select **Add to board**. | ||||||
| 1. Repeat the previous step for labels `Workflow::In development` and `Workflow::Complete`. | 1. Repeat the previous step for labels `Workflow::In development` and `Workflow::Complete`. | ||||||
|  |  | ||||||
|  | @ -165,11 +165,11 @@ To set up your issue board: | ||||||
| 1. Select **Plan > Issue boards**. | 1. Select **Plan > Issue boards**. | ||||||
| 1. In the upper-left corner of the issue board page, select the dropdown list with the current board name. | 1. In the upper-left corner of the issue board page, select the dropdown list with the current board name. | ||||||
| 1. Select **Create new board**. | 1. Select **Create new board**. | ||||||
| 1. In the **Title field**, enter `Issue triage (by severity)`. | 1. In the **Title** field, enter `Issue triage (by severity)`. | ||||||
| 1. Keep the **Show the Open list** checkbox selected and clear the **Show the Closed list** one. | 1. Keep the **Show the Open list** checkbox selected and clear the **Show the Closed list** one. | ||||||
| 1. Select **Create board**. You should see an empty board. | 1. Select **Create board**. You should see an empty board. | ||||||
| 1. Create a list for the `severity::1` label: | 1. Create a list for the `severity::1` label: | ||||||
|    1. In the upper-left corner of the issue board page, select **Create list**. |    1. In the upper-right corner of the issue board page, select **Create list**. | ||||||
|    1. In the column that appears, from the **Value** dropdown list, select the `severity::1` label. |    1. In the column that appears, from the **Value** dropdown list, select the `severity::1` label. | ||||||
|    1. Select **Add to board**. |    1. Select **Add to board**. | ||||||
| 1. Repeat the previous step for labels `severity::2`, `severity::3`, and `severity::4`. | 1. Repeat the previous step for labels `severity::2`, `severity::3`, and `severity::4`. | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 17 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 34 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 39 KiB | 
|  | @ -0,0 +1,556 @@ | ||||||
|  | --- | ||||||
|  | stage: Plan | ||||||
|  | group: Project Management | ||||||
|  | info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | # Tutorial: Use GitLab to facilitate Scrum | ||||||
|  | 
 | ||||||
|  | DETAILS: | ||||||
|  | **Tier:** Premium, Ultimate | ||||||
|  | **Offering:** SaaS, self-managed | ||||||
|  | 
 | ||||||
|  | <!-- vale gitlab.FutureTense = NO --> | ||||||
|  | 
 | ||||||
|  | This tutorial provides step-by-step guidance on using agile planning and tracking features in GitLab | ||||||
|  | to facilitate core Scrum ceremonies and workflows. | ||||||
|  | By setting up groups, projects, boards, and other features in a deliberate way, teams can realize | ||||||
|  | enhanced transparency, collaboration, and delivery cadences. | ||||||
|  | 
 | ||||||
|  | According to Martin Fowler's [Agile Fluency Model](https://martinfowler.com/articles/agileFluency.html), teams practicing [Scrum](https://scrumguides.org/scrum-guide.html): | ||||||
|  | 
 | ||||||
|  | > ...think and plan in terms of the benefits their sponsors, customers, and users will see from their software. | ||||||
|  | 
 | ||||||
|  | They achieve this by demonstrating their progress monthly; regularly reflecting on improving their | ||||||
|  | processes and work habits to provide more business and customer value. | ||||||
|  | 
 | ||||||
|  | This tutorial covers the following topics: | ||||||
|  | 
 | ||||||
|  | - Setting up GitLab | ||||||
|  |   - Understand inheritance model in GitLab | ||||||
|  |   - Create your group | ||||||
|  |   - Create your projects | ||||||
|  |   - Create labels | ||||||
|  |   - Create an iteration cadence | ||||||
|  | - Managing your feature backlog | ||||||
|  |   - How to structure your work | ||||||
|  |   - Setup a release planning board | ||||||
|  |   - Write your first feature | ||||||
|  | - Managing your story backlog | ||||||
|  |   - Break down features into stories | ||||||
|  |   - Refine your story backlog | ||||||
|  | - Tracking sprint progress | ||||||
|  |   - Manage the workflow of stories in your sprint | ||||||
|  |   - View burndown/up charts for your sprint | ||||||
|  | - Facilitating other Scrum ceremonies in GitLab | ||||||
|  |   - Synchronous and asynchronous stand-up | ||||||
|  |   - Synchronous and asynchronous retrospective | ||||||
|  | - Advanced tips and tricks | ||||||
|  |   - Leverage issue templates | ||||||
|  |   - Decide on a story point scale | ||||||
|  |   - Measure velocity and lower your team's volatility | ||||||
|  | 
 | ||||||
|  | ## Setting up your groups and projects | ||||||
|  | 
 | ||||||
|  | To facilitate Scrum practices in GitLab, you first need to set up the foundational structure of groups | ||||||
|  | and projects. | ||||||
|  | You'll use groups to create boards and labels that can be inherited by projects nested under that group. | ||||||
|  | Projects will contain the issues and tasks that make up the actual work items for each sprint. | ||||||
|  | 
 | ||||||
|  | ### Understanding the inheritance model in GitLab | ||||||
|  | 
 | ||||||
|  | GitLab has a hierarchical structure where groups contain projects. | ||||||
|  | Settings and configurations applied at the group level cascade down to child projects, so you can | ||||||
|  | standardize labels, boards, and iterations across multiple projects: | ||||||
|  | 
 | ||||||
|  | ```mermaid | ||||||
|  | flowchart TD | ||||||
|  |     Group -->|Contains| Project | ||||||
|  |     Group -->|Contains| Epics | ||||||
|  |     Group -->|Contains| Labels | ||||||
|  |     Group -->|Contains| Boards | ||||||
|  |     Group -->|Contains| Iterations | ||||||
|  |     Project -->|Contains| Issues | ||||||
|  |     Labels .->|Cascades To| Project | ||||||
|  |     Issues .->|Rolls Up To| Group | ||||||
|  |     Iterations .->|Cascades To| Project | ||||||
|  |     Issues .->|Assigned To| Epics | ||||||
|  |     Issues .->|Visible In| Boards | ||||||
|  |     Issues .->|Assigned To| Iterations | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | - Groups contain one or more projects, epics, boards, labels, and iterations. | ||||||
|  |   User membership in groups cascades down to a group's projects. | ||||||
|  | - You can create boards and labels in a group or project. | ||||||
|  |   For this tutorial, you should create them in a group to facilitate standardized planning workflows | ||||||
|  |   and reporting across many projects in a single group. | ||||||
|  | - Any object that cascades down to a project can be associated with that project's issues, | ||||||
|  |   for example: you can apply labels from a group to issues. | ||||||
|  | 
 | ||||||
|  | ### Create your group | ||||||
|  | 
 | ||||||
|  | Create a dedicated group for your Scrum activities. | ||||||
|  | This will be the parent container for projects and configurations like boards and labels that you want | ||||||
|  | to be standardized across projects. | ||||||
|  | 
 | ||||||
|  | This group will be the primary location for the different activities during a typical Scrum cadence. | ||||||
|  | It will contain your boards, features (epics), story (issue) roll up, and labels. | ||||||
|  | 
 | ||||||
|  | To create a group: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New group**. | ||||||
|  | 1. Select **Create group**. | ||||||
|  | 1. In the **Group name** text box, enter the name of the group. For a list of words that cannot be used as group names, see | ||||||
|  |    [reserved names](../../user/reserved_names.md). | ||||||
|  | 1. In the **Group URL** text box, enter the path for the group used for the [namespace](../../user/namespace/index.md). | ||||||
|  | 1. Select the [**Visibility level**](../../user/public_access.md) of the group. | ||||||
|  | 1. Optional. To personalize your GitLab experience: | ||||||
|  |    - From the **Role** dropdown list, select your role. | ||||||
|  |    - For **Who will be using this group?**, select an option. | ||||||
|  |    - From the **What will you use this group for?** dropdown list, select an option. | ||||||
|  | 1. Optional. To invite members to the group, in the **Email 1** text box, enter the email address of the user you want to invite. To invite more users, select **Invite another member** and enter the user's email address. | ||||||
|  | 1. Select **Create group**. | ||||||
|  | 
 | ||||||
|  | ### Create your projects | ||||||
|  | 
 | ||||||
|  | In the group you created, create one or more projects. | ||||||
|  | Your project will contain the stories that roll up to your parent group. | ||||||
|  | 
 | ||||||
|  | To create a blank project: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, at the top, select **Create new** (**{plus}**) and **New project/repository**. | ||||||
|  | 1. Select **Create blank project**. | ||||||
|  | 1. Enter the project details: | ||||||
|  |    - In the **Project name** field, enter the name of your project. See the | ||||||
|  |      [limitations on project names](../../user/reserved_names.md). | ||||||
|  |    - In the **Project slug** field, enter the path to your project. The GitLab instance uses the | ||||||
|  |      slug as the URL path to the project. To change the slug, first enter the project name, | ||||||
|  |      then change the slug. | ||||||
|  |    - To modify the project's [viewing and access rights](../../user/public_access.md) for | ||||||
|  |      users, change the **Visibility Level**. | ||||||
|  |    - To create README file so that the Git repository is initialized, has a default branch, and | ||||||
|  |      can be cloned, select **Initialize repository with a README**. | ||||||
|  | 1. Select **Create project**. | ||||||
|  | 
 | ||||||
|  | ### Create scoped labels to support different phases of the Scrum lifecycle | ||||||
|  | 
 | ||||||
|  | Next, in the group you've created, you'll create labels to add to issues to categorize them. | ||||||
|  | 
 | ||||||
|  | The best tool for this is [scoped labels](../../user/project/labels.md#scoped-labels), which you | ||||||
|  | can use to set mutually exclusive attributes. | ||||||
|  | 
 | ||||||
|  | The double colon (`::`) in the name of a scoped label prevents two labels of the same scope being | ||||||
|  | used together. | ||||||
|  | For example, if you add the `status::in progress` label to an issue that already has `status::ready`, | ||||||
|  | the previous one is removed. | ||||||
|  | 
 | ||||||
|  | To create each label: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  | 1. Select **Manage > Labels**. | ||||||
|  | 1. Select **New label**. | ||||||
|  | 1. In the **Title** field, enter the name of the label. Start with `priority::now`. | ||||||
|  | 1. Optional. Select a color by selecting from the available colors, or enter a hex color value for | ||||||
|  |    a specific color in the **Background color** field. | ||||||
|  | 1. Select **Create label**. | ||||||
|  | 
 | ||||||
|  | Repeat these steps to create all the labels you'll need: | ||||||
|  | 
 | ||||||
|  | - **Priority:** You will use these on an epic board to facilitate feature-level release prioritization. | ||||||
|  |   - `priority::now` | ||||||
|  |   - `priority::next` | ||||||
|  |   - `priority::later` | ||||||
|  | - **Status:** You will use these labels on an issue board to understand a story's current step in the | ||||||
|  |   overall development lifecycle. | ||||||
|  |   - `status::triage` | ||||||
|  |   - `status::refine` | ||||||
|  |   - `status::ready` | ||||||
|  |   - `status::in progress` | ||||||
|  |   - `status::in review` | ||||||
|  |   - `status::acceptance` | ||||||
|  |   - `status::done` | ||||||
|  | - **Type:** You will use these labels to represent the different types of work typically pulled into a single iteration: | ||||||
|  |   - `type::story` | ||||||
|  |   - `type::bug` | ||||||
|  |   - `type::mantainence` | ||||||
|  | 
 | ||||||
|  | ### Create an iteration cadence | ||||||
|  | 
 | ||||||
|  | In GitLab, sprints are called iterations. | ||||||
|  | Iteration cadences contain the individual, sequential iteration timeboxes for planning and reporting | ||||||
|  | on your issues. | ||||||
|  | Similar to labels, iterations cascade down your group, subgroup, and project hierarchy. | ||||||
|  | That's why you'll create the iteration cadence in the group you've created. | ||||||
|  | 
 | ||||||
|  | Prerequisites: | ||||||
|  | 
 | ||||||
|  | - You must have at least the Reporter role for a group. | ||||||
|  | 
 | ||||||
|  | To create an iteration cadence: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  | 1. Select **Plan > Iterations**. | ||||||
|  | 1. Select **New iteration cadence**. | ||||||
|  | 1. Enter the title and description of the iteration cadence. | ||||||
|  | 1. Make sure the **Enable automatic scheduling** checkbox is selected. | ||||||
|  | 1. Complete the required fields to use automatic scheduling. | ||||||
|  |    - Select the automation start date of the iteration cadence. Iterations are scheduled to | ||||||
|  |      begin on the same day of the week as the day of the week of the start date. | ||||||
|  |    - From the **Duration** dropdown list, select **2**. | ||||||
|  |    - From the **Upcoming iterations** dropdown list, select **4**. | ||||||
|  |    - Select the **Enable roll over** checkbox. | ||||||
|  | 1. Select **Create cadence**. The cadence list page opens. | ||||||
|  | 
 | ||||||
|  | With your iteration cadence configured this way: | ||||||
|  | 
 | ||||||
|  | - Each sprint is two weeks in length. | ||||||
|  | - GitLab automatically creates four sprints in the future. | ||||||
|  | - Incomplete issues from one sprint are automatically reassigned to the next sprint when the current sprint is closed. | ||||||
|  | 
 | ||||||
|  | You can also disable **Automatic scheduling** and | ||||||
|  | [manually create and manage iterations](../../user/group/iterations/index.md#create-an-iteration-manually) in your cadence. | ||||||
|  | 
 | ||||||
|  | ## Managing your feature backlog | ||||||
|  | 
 | ||||||
|  | A feature backlog captures ideas and desired functionality in the form of epics. | ||||||
|  | As you refine this backlog, epics will be prioritized to flow into upcoming sprints. | ||||||
|  | This section covers creating an epic board to facilitate backlog management and writing your first | ||||||
|  | feature epic. | ||||||
|  | 
 | ||||||
|  | ### Decide on a way to structure your work | ||||||
|  | 
 | ||||||
|  | GitLab is extensible to support different flavors of backlog management. | ||||||
|  | For this tutorial, we will structure our deliverables in the following way: | ||||||
|  | 
 | ||||||
|  | ```mermaid | ||||||
|  | flowchart TD | ||||||
|  |     Epic["Feature (Epic)"] --> Issue["Job Story (Issue)"] | ||||||
|  |     Issue --> Task["Implementation Step (Task)"] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | - An epic represents a feature that a team can deliver in a single iteration. | ||||||
|  | - Each epic will contain many | ||||||
|  |   [job stories](https://medium.com/@umang.soni/moving-from-user-role-based-approach-to-problem-statement-based-approach-for-product-development-18b2d2395e5). | ||||||
|  |   - A story should provide tangible customer value, contain explicit acceptance criteria, and be small | ||||||
|  |     enough that an individual can complete it in one or two days. | ||||||
|  |   - You should be able to complete four to ten stories as a team per sprint. | ||||||
|  | - While there are many strategies for splitting features, a great strategy is to | ||||||
|  |   [vertically slice](https://www.agilerant.info/vertical-slicing-to-boost-software-value/) stories | ||||||
|  |   into discrete, standalone stories a user must take to accomplish their goal. | ||||||
|  | 
 | ||||||
|  |   While you might not be able to ship a single story to your customers, your team should be able to | ||||||
|  |   test and interact with each story by using a feature flag on production or in a staging environment. | ||||||
|  |   Not only does this help provide stakeholders visibility into the story's progress, but also is a | ||||||
|  |   mechanism to break down more complex features into approachable development goals. | ||||||
|  | - Depending on the complexity of the stories, you can use tasks to break down stories into discrete | ||||||
|  |   implementation steps developers need to take to complete the story. | ||||||
|  | 
 | ||||||
|  | In terms of time horizons, target the following guidelines to sizing and scoping work items: | ||||||
|  | 
 | ||||||
|  | - A **feature** can be completed in a single iteration. | ||||||
|  | - A **story** can be completed in a few days. | ||||||
|  | - A **task** can be completed in a few hours to a day. | ||||||
|  | 
 | ||||||
|  | #### Example: Vertically slicing a feature | ||||||
|  | 
 | ||||||
|  | Here's an example of breaking a feature into vertically sliced job stories based on the end user's | ||||||
|  | journey: | ||||||
|  | 
 | ||||||
|  | ```mermaid | ||||||
|  | Epic["Epic: When using the application, I need to create an <br> account, so that I can use the application features"] --> Issue1["Issue: When creating my account, I need to specify my email address,<br> so that I can receive future updates from the application"] | ||||||
|  |     Epic --> Issue2["Issue: When creating my account, I need to <br>specify a password, so that my account remains secure"] | ||||||
|  |     Epic --> Issue3["Issue: When creating my account and entering the required info, I need to <br>finalize creating my account, so that I can login"] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You've taken the feature of an unmodified account sign-up for an application and broke it down into | ||||||
|  | three discrete stories: | ||||||
|  | 
 | ||||||
|  | 1. Entering an email address. | ||||||
|  | 1. Entering a password. | ||||||
|  | 1. Selecting a button to execute the account creation. | ||||||
|  | 
 | ||||||
|  | After you have broken down a feature into stories, you can further break down the story into discrete | ||||||
|  | implementation steps: | ||||||
|  | 
 | ||||||
|  | ```mermaid | ||||||
|  | flowchart TD | ||||||
|  |   Issue1["Issue: When creating my account, I need to specify my email address,<br> so that I can receive future updates from the application"] | ||||||
|  |   Issue1 --> Task2["Task: Backend - Validate email formatting"] | ||||||
|  |   Issue1 --> Task3["Task: Backend - API endpoint to accept POST request from client"] | ||||||
|  |   Issue1 --> Task4["Task: Frontend - Display email input"] | ||||||
|  |   Issue1 --> Task5["Task: Frontend - Display error message when validation fails"] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Set up a release planning board | ||||||
|  | 
 | ||||||
|  | You've defined your deliverables structure. | ||||||
|  | The next step is to create an epic board that you will use to develop and maintain your feature backlog. | ||||||
|  | 
 | ||||||
|  | To create a new epic board: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  | 1. Select **Plan > Epic boards**. | ||||||
|  | 1. In the upper-left corner, select the dropdown list with the current board name. | ||||||
|  | 1. Select **Create new board**. | ||||||
|  | 1. Enter the new board's title: `Release Planning`. | ||||||
|  | 1. Select **Create board**. | ||||||
|  | 
 | ||||||
|  | Next, [create lists](../../user/group/epics/epic_boards.md#create-a-new-list) for the `priority::later`, | ||||||
|  | `priority::next`, and `priority::now` labels. | ||||||
|  | 
 | ||||||
|  | To create a new list: | ||||||
|  | 
 | ||||||
|  | 1. In the upper-right corner of your board, select **Create list**. | ||||||
|  | 1. In the **New list** column expand the **Select a label** dropdown list and select the label to use as | ||||||
|  |    list scope. | ||||||
|  | 1. Select **Add to board**. | ||||||
|  | 
 | ||||||
|  | You'll use these lists to facilitate moving features through your board from left to right. | ||||||
|  | 
 | ||||||
|  | Use each list in your release planning board to represent the following time horizons: | ||||||
|  | 
 | ||||||
|  | - **Open:** Features that are not yet ready for prioritization. | ||||||
|  | - **Later:** Features that will be prioritized into a later release. | ||||||
|  | - **Next:** Features tentatively planned for the next release. | ||||||
|  | - **Now:** Features prioritized for your current release. | ||||||
|  | - **Closed:** Features that have been completed or canceled. | ||||||
|  | 
 | ||||||
|  | ### Create your first epic | ||||||
|  | 
 | ||||||
|  | Next, create a new epic in the `priority::now` list: | ||||||
|  | 
 | ||||||
|  | 1. On the top of the **`priority::now`** list, select the **New epic** (**{plus}**) icon. | ||||||
|  | 1. Enter the new epic's title: | ||||||
|  | 
 | ||||||
|  |    ```plaintext | ||||||
|  |    When using the application, I need to create an account, so that I can use the application features. | ||||||
|  |    ``` | ||||||
|  | 
 | ||||||
|  | 1. Select **Create epic**. | ||||||
|  | 
 | ||||||
|  | When you complete this step, your board should look like this: | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | 
 | ||||||
|  | You can now use the **Release Planning** board to quickly build your backlog. | ||||||
|  | 
 | ||||||
|  | Stub out many features and prioritize them into the **Now**, **Next**, **Later** lists. | ||||||
|  | Next, spend some time to further break down each story into stories and tasks. | ||||||
|  | 
 | ||||||
|  | To reorder feature epics in a list or across lists, drag the epic cards. | ||||||
|  | You can also [move cards to the top or bottom](../../user/group/epics/epic_boards.md#move-an-epic-to-the-start-of-the-list) of a list. | ||||||
|  | 
 | ||||||
|  | ## Managing your story backlog | ||||||
|  | 
 | ||||||
|  | When you have features defined as epics, the next step is to break down those features into granular, | ||||||
|  | vertical slices as issues. | ||||||
|  | You will then refine and sequence those issues across iterations on a dedicated backlog board. | ||||||
|  | 
 | ||||||
|  | ### Break down features into stories | ||||||
|  | 
 | ||||||
|  | Break features into vertically sliced stories ahead of time to have an efficient sprint planning meeting. | ||||||
|  | In the previous step, you created your first feature. | ||||||
|  | Let's break that down into stories. | ||||||
|  | 
 | ||||||
|  | To create your first stories: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  | 1. Select **Plan > Epic boards**. | ||||||
|  | 1. In the upper-left corner, make sure the dropdown list with the current board name shows **Release Planning**. | ||||||
|  |    If not, from the dropdown list, select that board. | ||||||
|  | 1. Open an epic by clicking the title of the epic card. | ||||||
|  | 1. In the **Child issues and epics** section, select **Add > Add a new issue**. | ||||||
|  | 1. Enter the following title for the issue: | ||||||
|  | 
 | ||||||
|  |    ```plaintext | ||||||
|  |    When creating my account, I need to specify my email address so that I can receive future updates from the application | ||||||
|  |    ``` | ||||||
|  | 
 | ||||||
|  | 1. From the **Project** dropdown list, select the project where you want to create the issue. | ||||||
|  | 1. Select **Create issue**. | ||||||
|  | 1. Repeat this process for the other two vertical slices: | ||||||
|  | 
 | ||||||
|  |    ```plaintext | ||||||
|  |    When creating my account, I need to specify a password so that my account remains secure | ||||||
|  |    ``` | ||||||
|  | 
 | ||||||
|  |    ```plaintext | ||||||
|  |    When creating my account and entering the required information, I need to finalize creating my account so that I can log in | ||||||
|  |    ``` | ||||||
|  | 
 | ||||||
|  | ### Refine your story backlog | ||||||
|  | 
 | ||||||
|  | In the previous step, you broke down a feature into the necessary user stories to complete the feature. | ||||||
|  | Next, set up an issue board to serve as your canonical location for managing and refining your story backlog. | ||||||
|  | 
 | ||||||
|  | In your group, create a new issue board titled **Backlog**. | ||||||
|  | You will use this board to sequence and schedule your stories into upcoming sprints (iterations): | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  | 1. Select **Plan > Issue boards**. | ||||||
|  | 1. In the upper-left corner, select the dropdown list with the current board name. | ||||||
|  | 1. Select **Create new board**. | ||||||
|  | 1. Enter the new board's title: `Backlog`. | ||||||
|  | 1. Select **Create board**. | ||||||
|  | 
 | ||||||
|  | After you've created the board, create a new list for each upcoming iteration: | ||||||
|  | 
 | ||||||
|  | 1. In the upper-right corner of the issue board page, select **Create list**. | ||||||
|  | 1. In the column that appears, under **Scope**, select **Iteration**. | ||||||
|  | 1. From the **Value** dropdown list, select one of the iterations. | ||||||
|  | 1. Select **Add to board**. | ||||||
|  | 1. Repeat the previous step for the other upcoming iterations. | ||||||
|  | 
 | ||||||
|  | Then, when an iteration is over, you should [remove the completed iteration list](../../user/project/issue_board.md#remove-a-list) | ||||||
|  | and add a new list for the new future iteration that was automatically created based on your cadence settings. | ||||||
|  | 
 | ||||||
|  | At this point, stories haven't been estimated or refined into tasks. | ||||||
|  | Mark them for refinement: | ||||||
|  | 
 | ||||||
|  | 1. [Select each issue's card](../../user/project/issue_board.md#edit-an-issue) in the board and apply the `status::refine` label: | ||||||
|  |    1. In the **Labels** section of the sidebar, select **Edit**. | ||||||
|  |    1. From the **Assign labels** list, select the `status::refine` label. | ||||||
|  |    1. Select **X** next to **Assign labels** or select any area outside the label section. | ||||||
|  | 1. Drag the three stories into the desired upcoming sprint to assign the stories to the corresponding sprint timebox. | ||||||
|  | 
 | ||||||
|  | By this point in the tutorial, your **Backlog** board should look like this: | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | 
 | ||||||
|  | In practice, you will use this board to sequence many stories into upcoming iterations. | ||||||
|  | When your backlog grows, and you have dozens of stories spanning multiple features, it can be helpful | ||||||
|  | to enable [**Group by epic**](../../user/project/issue_board.md#group-issues-in-swimlanes) so you can | ||||||
|  | view stories related to their corresponding feature epic. | ||||||
|  | When stories are grouped, it's easier to sequence them into upcoming sprints. | ||||||
|  | 
 | ||||||
|  | ### Sprint planning ceremony | ||||||
|  | 
 | ||||||
|  | With the backlog prepared, it's time to plan the upcoming sprint. | ||||||
|  | You can use synchronous and asynchronous ways to facilitate sprint planning meetings in GitLab. | ||||||
|  | 
 | ||||||
|  | #### Synchronous planning | ||||||
|  | 
 | ||||||
|  | When it's time for your sprint planning ceremony, pull up the **Backlog** board with the team and | ||||||
|  | work through each story. | ||||||
|  | You should start planning for your next sprint on the last day of your current sprint. | ||||||
|  | While discussing each issue: | ||||||
|  | 
 | ||||||
|  | - Review and collaborate on the acceptance criteria. | ||||||
|  |   You can capture this in the issue's description by using checklists or list items. | ||||||
|  | - Further [break down the story into tasks](../../user/tasks.md#create-a-task) for each implementation step. | ||||||
|  | - Estimate the issue's story point effort or complexity and set this value in the issue's **Weight** field. | ||||||
|  | - After the team is satisfied with the scope of the issue and agrees on the story point value, | ||||||
|  |   apply the `status::ready` label to the issue: | ||||||
|  | 
 | ||||||
|  |   1. In the **Labels** section of the sidebar, select **Edit**. | ||||||
|  |   1. From the **Assign labels** list, select the `status::ready` label. | ||||||
|  |   1. Select **X** next to **Assign labels** or select any area outside the label section. | ||||||
|  | 
 | ||||||
|  | After you've cycled through all the issues in the upcoming iteration, you're done with sprint planning! | ||||||
|  | 
 | ||||||
|  | Remember to incorporate your team's velocity into your sprint commitment. | ||||||
|  | You can find the total number of story points (weight) allocated to each sprint at the top of each iteration list. | ||||||
|  | It's also worth making sure story points that will likely roll over from the previous sprint. | ||||||
|  | 
 | ||||||
|  | #### Asynchronous planning | ||||||
|  | 
 | ||||||
|  | Instead of holding a synchronous meeting, use an issue to run your sprint planning. | ||||||
|  | 
 | ||||||
|  | Given the nature of asynchronous sprint planning, you should start this a few days before the end of | ||||||
|  | the current sprint. | ||||||
|  | Provide all team members the appropriate time to contribute and collaborate. | ||||||
|  | 
 | ||||||
|  | 1. Open the **Backlog** issue board: | ||||||
|  |    1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  |    1. Select **Plan > Issue boards**. | ||||||
|  |    1. In the upper-left corner, select the dropdown list with the current board name. | ||||||
|  |    1. Select **Backlog**. | ||||||
|  | 1. In the list for the upcoming sprint, select **Create new issue** (**{plus-square}**). | ||||||
|  | 1. Enter the issue's title: `Release Planning`. | ||||||
|  | 1. Select **Create issue**. | ||||||
|  | 1. Open the issue and create a discussion thread for each story assigned to the upcoming sprint. | ||||||
|  | 
 | ||||||
|  |    Append `+` to the issue URL to automatically unfurl the title. | ||||||
|  |    Append `+s` to the issue URL to automatically unfurl the title, milestone, and assignees. | ||||||
|  |    You can use the following template for these threads to create checkboxes: | ||||||
|  | 
 | ||||||
|  |    ```markdown | ||||||
|  |    ## https://gitlab.example.com/my-group/application-b/-/issues/5+ | ||||||
|  | 
 | ||||||
|  |    - [ ] Acceptance criteria defined | ||||||
|  |    - [ ] Weight set | ||||||
|  |    - [ ] Implementation steps (tasks) created | ||||||
|  |    ``` | ||||||
|  | 
 | ||||||
|  |    For example: | ||||||
|  | 
 | ||||||
|  |     | ||||||
|  | 
 | ||||||
|  | 1. After every story has a thread, edit the issue description and [mention each team member](../../user/discussions/index.md#mentions). | ||||||
|  |    Mentioning team members automatically creates a to-do item for them in their respective [to-do lists](../../user/todos.md). | ||||||
|  | 1. Then, asynchronously, before the start of the upcoming sprint, team members should: | ||||||
|  | 
 | ||||||
|  |    - Discuss each issue, ask questions, and collaborate to align on the acceptance criteria for each planned issue. | ||||||
|  |    - Use a reaction emoji such as `:one:`, `:two:`, and `:three:` to cast their vote on what the story point (weight) should be. | ||||||
|  |      If team members set different story point values, it's an excellent opportunity to discuss further until there is consensus. | ||||||
|  |      You can also average all the various reactions to align on what the story point will be. | ||||||
|  |    - Break down vertical slices (issues) into implementation steps (tasks). | ||||||
|  | 
 | ||||||
|  | 1. As each story discussion concludes, update the issue with any changes to the acceptance criteria | ||||||
|  |    and set the story point value in the **Weight** field. | ||||||
|  | 1. After the story is updated, add the `status::ready` label to each issue. | ||||||
|  | 1. Then, to signal the planning for that vertical slice has been completed, | ||||||
|  |    [resolve each discussion thread](../../user/discussions/index.md#resolve-a-thread) in the planning issue. | ||||||
|  | 
 | ||||||
|  | ## Tracking sprint progress | ||||||
|  | 
 | ||||||
|  | To visualize and manage the work during a sprint, teams can create a dedicated issue board representing | ||||||
|  | the current sprint's scope. | ||||||
|  | This board provides transparency into the team's progress and any potential blockers. | ||||||
|  | Teams can also use iteration analytics for additional visibility through burndown charts. | ||||||
|  | 
 | ||||||
|  | ### Create a board for your current sprint | ||||||
|  | 
 | ||||||
|  | In your group, create a new issue board titled **Current Sprint**: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  | 1. Select **Plan > Issue boards**. | ||||||
|  | 1. In the upper-left corner, select the dropdown list with the current board name. | ||||||
|  | 1. Select **Create new board**. | ||||||
|  | 1. Enter the new board's title: `Current Sprint`. | ||||||
|  | 1. Next to **Scope**, select **Expand**. | ||||||
|  | 1. Next to **Iteration**, select **Edit**. | ||||||
|  | 1. Below your iteration cadence, select **Current**. | ||||||
|  | 1. Select **Create board**. | ||||||
|  | 
 | ||||||
|  | The board is now filtered only to show issues assigned to the current iteration. | ||||||
|  | Use it to visualize the team's progress in the active sprint. | ||||||
|  | 
 | ||||||
|  | Next, create label lists for all the statuses: | ||||||
|  | 
 | ||||||
|  | 1. In the upper-right corner of the issue board page, select **Create list**. | ||||||
|  | 1. In the column that appears, under **Scope**, select **Label**. | ||||||
|  | 1. From the **Value** dropdown list, select one of the labels: | ||||||
|  | 
 | ||||||
|  |    - `status::refine`: The issue needs further refinement before being developed. | ||||||
|  |    - `status::ready`: The issue is ready for development. | ||||||
|  |    - `status::in progress`: The issue is in development. | ||||||
|  |    - `status::review`: The issue's corresponding MRs are going through code review. | ||||||
|  |    - `status::acceptance`: The issue is ready for stakeholder acceptance and QA testing. | ||||||
|  |    - `status::done`: The issue's acceptance criteria have been satisfied. | ||||||
|  | 
 | ||||||
|  | 1. Select **Add to board**. | ||||||
|  | 1. Repeat the previous steps for the other labels. | ||||||
|  | 
 | ||||||
|  | Then, as the sprint progresses, drag issues to different lists to change their `status::` label. | ||||||
|  | 
 | ||||||
|  | ### View burndown and burnup charts for your sprint | ||||||
|  | 
 | ||||||
|  | It can be helpful to review the iteration report during the sprint. | ||||||
|  | Iteration reports provide progress metrics and burndown and burnup charts. | ||||||
|  | 
 | ||||||
|  | To view your iteration report: | ||||||
|  | 
 | ||||||
|  | 1. On the left sidebar, select **Search or go to** and find your group. | ||||||
|  | 1. Select **Plan > Iterations** and select an iteration cadence. | ||||||
|  | 1. Select an iteration. | ||||||
|  | @ -44,7 +44,7 @@ SAST supports the following official analyzers: | ||||||
| <html> | <html> | ||||||
| <small>Footnotes: | <small>Footnotes: | ||||||
|   <ol> |   <ol> | ||||||
|     <li>These analyzers were [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/431123) in GitLab 16.9</a> and are planned for removal in 17.0. The <a href="https://gitlab.com/gitlab-org/security-products/analyzers/semgrep">Semgrep analyzer</a> is proposed as their replacement.</li> |     <li>These analyzers were <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/431123">deprecated</a> in GitLab 16.9 and are planned for removal in 17.0. The <a href="https://gitlab.com/gitlab-org/security-products/analyzers/semgrep">Semgrep analyzer</a> is proposed as their replacement.</li> | ||||||
|   </ol> |   </ol> | ||||||
| </small> | </small> | ||||||
| </html> | </html> | ||||||
|  |  | ||||||
|  | @ -86,9 +86,7 @@ For more information about our plans for language support in SAST, see the [cate | ||||||
|     <li>The SpotBugs-based analyzer supports <a href="https://gradle.org/">Gradle</a>, <a href="https://maven.apache.org/">Maven</a>, and <a href="https://www.scala-sbt.org/">SBT</a>. It can also be used with variants like the <a href="https://docs.gradle.org/current/userguide/gradle_wrapper.html">Gradle wrapper</a>, <a href="https://grails.org/">Grails</a>, and the <a href="https://github.com/takari/maven-wrapper">Maven wrapper</a>. However, SpotBugs has <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/350801">limitations</a> when used against <a href="https://ant.apache.org/">Ant</a>-based projects. You should use the Semgrep-based analyzer for Ant-based Java or Scala projects.</li> |     <li>The SpotBugs-based analyzer supports <a href="https://gradle.org/">Gradle</a>, <a href="https://maven.apache.org/">Maven</a>, and <a href="https://www.scala-sbt.org/">SBT</a>. It can also be used with variants like the <a href="https://docs.gradle.org/current/userguide/gradle_wrapper.html">Gradle wrapper</a>, <a href="https://grails.org/">Grails</a>, and the <a href="https://github.com/takari/maven-wrapper">Maven wrapper</a>. However, SpotBugs has <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/350801">limitations</a> when used against <a href="https://ant.apache.org/">Ant</a>-based projects. You should use the Semgrep-based analyzer for Ant-based Java or Scala projects.</li> | ||||||
|   </ol> |   </ol> | ||||||
|   <ol> |   <ol> | ||||||
|     <li> |     <li> These analyzers were <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/431123">deprecated in GitLab 16.9</a> and are planned for removal in 17.0. The <a href="https://gitlab.com/gitlab-org/security-products/analyzers/semgrep">Semgrep analyzer</a> is proposed as their replacement.</li> | ||||||
|       These analyzers were <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/431123">deprecated in GitLab 16.9</a> and are planned for removal in 17.0. The <a href="https://gitlab.com/gitlab-org/security-products/analyzers/semgrep">Semgrep analyzer</a> is proposed as their replacement.</li> |  | ||||||
|     </li> |  | ||||||
|   </ol> |   </ol> | ||||||
| </html> | </html> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -10,6 +10,9 @@ DETAILS: | ||||||
| **Tier:** Premium, Ultimate | **Tier:** Premium, Ultimate | ||||||
| **Offering:** GitLab.com, self-managed, GitLab Dedicated. GitLab Duo Pro required. | **Offering:** GitLab.com, self-managed, GitLab Dedicated. GitLab Duo Pro required. | ||||||
| 
 | 
 | ||||||
|  | NOTE: | ||||||
|  | GitLab Duo Code Suggestions requires [GitLab 16.8](https://about.gitlab.com/releases/2024/01/18/gitlab-16-8-released/) and newer. Earlier GitLab versions not supported. | ||||||
|  | 
 | ||||||
| > - [Introduced support for Google Vertex AI Codey APIs](https://gitlab.com/groups/gitlab-org/-/epics/10562) in GitLab 16.1. | > - [Introduced support for Google Vertex AI Codey APIs](https://gitlab.com/groups/gitlab-org/-/epics/10562) in GitLab 16.1. | ||||||
| > - [Removed support for GitLab native model](https://gitlab.com/groups/gitlab-org/-/epics/10752) in GitLab 16.2. | > - [Removed support for GitLab native model](https://gitlab.com/groups/gitlab-org/-/epics/10752) in GitLab 16.2. | ||||||
| > - [Introduced support for Code Generation](https://gitlab.com/gitlab-org/gitlab/-/issues/415583) in GitLab 16.3. | > - [Introduced support for Code Generation](https://gitlab.com/gitlab-org/gitlab/-/issues/415583) in GitLab 16.3. | ||||||
|  |  | ||||||
|  | @ -9,27 +9,27 @@ module Gitlab | ||||||
|       GITLAB_HOSTED_RUNNER = 'gitlab-hosted' |       GITLAB_HOSTED_RUNNER = 'gitlab-hosted' | ||||||
|       SELF_HOSTED_RUNNER = 'self-hosted' |       SELF_HOSTED_RUNNER = 'self-hosted' | ||||||
| 
 | 
 | ||||||
|       def self.for_build(build, aud: DEFAULT_AUD, wlif: nil) |       def self.for_build(build, aud: DEFAULT_AUD, target_audience: nil) | ||||||
|         new(build, ttl: build.metadata_timeout, aud: aud, wlif: wlif).encoded |         new(build, ttl: build.metadata_timeout, aud: aud, target_audience: target_audience).encoded | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def initialize(build, ttl:, aud:, wlif:) |       def initialize(build, ttl:, aud:, target_audience:) | ||||||
|         super(build, ttl: ttl) |         super(build, ttl: ttl) | ||||||
| 
 | 
 | ||||||
|         @aud = aud |         @aud = aud | ||||||
|         @wlif = wlif |         @target_audience = target_audience | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       private |       private | ||||||
| 
 | 
 | ||||||
|       attr_reader :aud, :wlif |       attr_reader :aud, :target_audience | ||||||
| 
 | 
 | ||||||
|       def reserved_claims |       def reserved_claims | ||||||
|         super.merge({ |         super.merge({ | ||||||
|           iss: Gitlab.config.gitlab.url, |           iss: Gitlab.config.gitlab.url, | ||||||
|           sub: "project_path:#{project.full_path}:ref_type:#{ref_type}:ref:#{source_ref}", |           sub: "project_path:#{project.full_path}:ref_type:#{ref_type}:ref:#{source_ref}", | ||||||
|           aud: aud, |           aud: aud, | ||||||
|           wlif: wlif |           target_audience: target_audience | ||||||
|         }.compact) |         }.compact) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ RSpec.describe Gitlab::Ci::JwtV2, feature_category: :secrets_management do | ||||||
|   let(:pipeline) { build_stubbed(:ci_pipeline, ref: 'auto-deploy-2020-03-19') } |   let(:pipeline) { build_stubbed(:ci_pipeline, ref: 'auto-deploy-2020-03-19') } | ||||||
|   let(:runner) { build_stubbed(:ci_runner) } |   let(:runner) { build_stubbed(:ci_runner) } | ||||||
|   let(:aud) { described_class::DEFAULT_AUD } |   let(:aud) { described_class::DEFAULT_AUD } | ||||||
|   let(:wlif) { nil } |   let(:target_audience) { nil } | ||||||
| 
 | 
 | ||||||
|   let(:build) do |   let(:build) do | ||||||
|     build_stubbed( |     build_stubbed( | ||||||
|  | @ -27,7 +27,7 @@ RSpec.describe Gitlab::Ci::JwtV2, feature_category: :secrets_management do | ||||||
|     ) |     ) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   subject(:ci_job_jwt_v2) { described_class.new(build, ttl: 30, aud: aud, wlif: wlif) } |   subject(:ci_job_jwt_v2) { described_class.new(build, ttl: 30, aud: aud, target_audience: target_audience) } | ||||||
| 
 | 
 | ||||||
|   it { is_expected.to be_a Gitlab::Ci::Jwt } |   it { is_expected.to be_a Gitlab::Ci::Jwt } | ||||||
| 
 | 
 | ||||||
|  | @ -61,16 +61,16 @@ RSpec.describe Gitlab::Ci::JwtV2, feature_category: :secrets_management do | ||||||
|         expect(payload[:aud]).to eq('AWS') |         expect(payload[:aud]).to eq('AWS') | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'does not use wlif claim in the payload' do |       it 'does not use target_audience claim in the payload' do | ||||||
|         expect(payload.include?(:wlif)).to be_falsey |         expect(payload.include?(:target_audience)).to be_falsey | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when given an wlif claim' do |     context 'when given an target_audience claim' do | ||||||
|       let(:wlif) { '//iam.googleapis.com/foo' } |       let(:target_audience) { '//iam.googleapis.com/foo' } | ||||||
| 
 | 
 | ||||||
|       it 'uses specified wlif in the payload' do |       it 'uses specified target_audience in the payload' do | ||||||
|         expect(payload[:wlif]).to eq(wlif) |         expect(payload[:target_audience]).to eq(target_audience) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue