diff --git a/app/assets/javascripts/projects/new_v2/components/shared_project_creation_fields.vue b/app/assets/javascripts/projects/new_v2/components/shared_project_creation_fields.vue
index b66eabdc53de313556b440a08b7616c3582cfe44..a480eba1063bebad9fa7e78acb5b1964acbe66a8 100644
--- a/app/assets/javascripts/projects/new_v2/components/shared_project_creation_fields.vue
+++ b/app/assets/javascripts/projects/new_v2/components/shared_project_creation_fields.vue
@@ -1,13 +1,18 @@
@@ -71,17 +85,21 @@ export default {
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+ {{ content }}
+
+
+
+
+
+
diff --git a/app/assets/javascripts/projects/new_v2/form_constants.js b/app/assets/javascripts/projects/new_v2/form_constants.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0000e26344061e91822d6b67e376be6e0cdfa62
--- /dev/null
+++ b/app/assets/javascripts/projects/new_v2/form_constants.js
@@ -0,0 +1,64 @@
+import { s__ } from '~/locale';
+
+export const K8S_OPTION = {
+ value: 'kubernetes',
+ text: s__('DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)'),
+};
+
+export const DEPLOYMENT_TARGET_SELECTIONS = [
+ K8S_OPTION,
+ {
+ value: 'managed_container_runtime',
+ text: s__('DeploymentTarget|Managed container runtime (Fargate, Cloud Run, DigitalOcean App)'),
+ },
+ {
+ value: 'self_managed_container_runtime',
+ text: s__(
+ 'DeploymentTarget|Self-managed container runtime (Podman, Docker Swarm, Docker Compose)',
+ ),
+ },
+ {
+ value: 'heroku',
+ text: s__('DeploymentTarget|Heroku'),
+ },
+ {
+ value: 'virtual_machine',
+ text: s__('DeploymentTarget|Virtual machine (for example, EC2)'),
+ },
+ {
+ value: 'mobile_app_store',
+ text: s__('DeploymentTarget|Mobile app store'),
+ },
+ {
+ value: 'registry',
+ text: s__('DeploymentTarget|Registry (package or container)'),
+ },
+ {
+ value: 'infrastructure_provider',
+ text: s__('DeploymentTarget|Infrastructure provider (Terraform, Cloudformation, and so on)'),
+ },
+ {
+ value: 'serverless_backend',
+ text: s__('DeploymentTarget|Serverless backend (Lambda, Cloud functions)'),
+ },
+ {
+ value: 'edge_computing',
+ text: s__('DeploymentTarget|Edge Computing (e.g. Cloudflare Workers)'),
+ },
+ {
+ value: 'web_deployment_platform',
+ text: s__('DeploymentTarget|Web Deployment Platform (Netlify, Vercel, Gatsby)'),
+ },
+ {
+ value: 'gitlab_pages',
+ text: s__('DeploymentTarget|GitLab Pages'),
+ },
+ {
+ value: 'other_hosting_service',
+ text: s__('DeploymentTarget|Other hosting service'),
+ },
+ {
+ value: 'no_deployment',
+ text: s__('DeploymentTarget|No deployment planned'),
+ },
+];
diff --git a/spec/frontend/projects/new_v2/components/shared_project_creation_fields_spec.js b/spec/frontend/projects/new_v2/components/shared_project_creation_fields_spec.js
index 03b7626f06d1ed1caf77349eaf2ba20e1201f75e..3ea8a1b4bd7febfa1ed873deeb87b0881d67cb01 100644
--- a/spec/frontend/projects/new_v2/components/shared_project_creation_fields_spec.js
+++ b/spec/frontend/projects/new_v2/components/shared_project_creation_fields_spec.js
@@ -1,8 +1,9 @@
import { nextTick } from 'vue';
-import { GlFormInput } from '@gitlab/ui';
+import { GlFormInput, GlFormSelect } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import SharedProjectCreationFields from '~/projects/new_v2/components/shared_project_creation_fields.vue';
import NewProjectDestinationSelect from '~/projects/new_v2/components/project_destination_select.vue';
+import { DEPLOYMENT_TARGET_SELECTIONS } from '~/projects/new_v2/form_constants';
describe('Project creation form fields component', () => {
let wrapper;
@@ -23,6 +24,7 @@ describe('Project creation form fields component', () => {
},
stubs: {
GlFormInput,
+ GlFormSelect,
},
});
};
@@ -34,6 +36,19 @@ describe('Project creation form fields component', () => {
const findProjectNameInput = () => wrapper.findByTestId('project-name-input');
const findProjectSlugInput = () => wrapper.findByTestId('project-slug-input');
const findNamespaceSelect = () => wrapper.findComponent(NewProjectDestinationSelect);
+ const findDeploymentTargetSelect = () => wrapper.findByTestId('deployment-target-select');
+ const findKubernetesHelpLink = () => wrapper.findByTestId('kubernetes-help-link');
+
+ describe('target select', () => {
+ it('renders the optional deployment target select', () => {
+ expect(findDeploymentTargetSelect().exists()).toBe(true);
+ expect(findKubernetesHelpLink().exists()).toBe(false);
+ });
+
+ it('has all the options', () => {
+ expect(findDeploymentTargetSelect().props('options')).toEqual(DEPLOYMENT_TARGET_SELECTIONS);
+ });
+ });
it('updates project slug according to a project name', async () => {
// NOTE: vue3 test needs the .setValue(value) and the vm.$emit('input'),