Repository: Azure/draft
Pull request #191 (2023-03-06 17:37:01)

adding flag variable to create command
# Description

Added repeatable flag '--variable' to create command for passing additional in-line arguments

Fixes # (issue)
Feature # (details)

## Type of change

Please delete options that are not relevant.

- [x] New feature (non-breaking change which adds functionality)

# How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration. Is it a  breaking change which will impact consuming tool(s).

- [x] unit test

# Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream modules



squillace: I would have thought we'd retain the `--set` switch (or similar properties) for anyone who knows what they want to do. If it's not `--set`, it should be something. :-)
bacongobbler: Advanced users can use `helm install`, which is exactly what `draft init` does anyways. They'll just need to fend for themselves for the time being until we can come up with a better overall init system that encompasses most cloud providers.
alexpilotti: Would it make sense to add an usage sample in the documentation using helm install?
I think it would be useful for people looking at more advanced use cases, especially for those not very familiar with helm yet. 
squillace: +1. Problem here is that new users do not necessarily know what draft is and is not using helm for, whereas "advanced users" will already understand this. So how to do this has to be documented _somewhere_. :-)
alexpilotti: There are also new users not familiar with draft / helm with "advanced" use cases: e.g. setting a custom Docker registry or an ingress base domain.
bacongobbler: With the proposed solution in #202, we envision a bundled .msi that would install minikube, the in-cluster registry, ingress, helm and draft on the cluster. That would cover the 90th percentile of users that just want to start writing applications for kubernetes. In those use cases, no unattended scripting would be necessary.

For advanced uses cases that encompass a certain cloud provider or some form of CI automation (the 10th percentile), we still haven't come up with a solid solution yet. It might involve publishing official chart releases of draft along with a set of documentation for the time being, but I'd also like to get a solid answer for "how do I get this running on Azure". Right now it's not clear what is the best path forward.
squillace: Let us all chew.
bacongobbler: Reposting a response I posted on an email thread a few weeks ago:

> Adding on to why `--set` was removed...

> Nobody should have to learn how Docker handles authentication against registries at a low level. Many users were having trouble and it made for a horrible Out of the Box experience. At least we’re at a state where most users can install Draft without falling on their own two feet ;)

> Right now, I want to leave `draft init` as it is and focus on the developer experience side of things (what Draft is actually trying to solve). I’m hoping that either the community will come up with a better solution than we can, or that we eventually solve the problem in the future (but before v1.0). That being said, we are still actively thinking of ways on how we can improve the installation experience.
pyronicide: As the draftd chart is embedded in install.go, I couldn't find a repeatable way to use helm install. Instead, here's a very simple script that just fills out `draft init` in an unattended way.

https://gist.github.com/pyronicide/9cd7e92c448f529ec15808d404cb16b8
bacongobbler: @pyronicide the draft chart is also available in the source code: https://github.com/Azure/draft/tree/master/chart
bacongobbler: Also @pyronicide that is exactly the example I was looking for, so thank you! It is possible to use `draft init` in unattended scripts so long as you pipe in the values through stdin.
pyronicide: @bacongobbler totally! I just get scared when I see something in code *and* somewhere else (if only because I consistently forget to update things in two places). My other, larger, problem is that I'm lazy and wanted the chart hosted in a repo somewhere =)
bacongobbler: We already use go-bindata to auto-generate the go code for packs, so we might be able to apply the same practice for the chart installer. I'l file a ticket to track that. Regardless nice work! 👍 
bacongobbler: closing as there have been a few proposed solutions here.

Patch:
diff --git a/.github/workflows/integration-linux.yml b/.github/workflows/integration-linux.yml
index 567256c..6f0ff33 100644
--- a/.github/workflows/integration-linux.yml
+++ b/.github/workflows/integration-linux.yml
@@ -42,7 +42,7 @@ jobs:
           with:
             repository: gambtho/go_echo
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/gomodule/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -50,6 +50,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l gomodule --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   gomodule-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -175,7 +183,7 @@ jobs:
         with:
           repository: gambtho/go_echo
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/gomodule/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -183,6 +191,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l gomodule --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   gomodule-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -299,7 +315,7 @@ jobs:
           with:
             repository: gambtho/go_echo
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/gomodule/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -307,6 +323,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l gomodule --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   gomodule-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -456,7 +480,7 @@ jobs:
           with:
             repository: davidgamero/go-echo-no-mod
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/go/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -464,6 +488,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l go --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   go-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -589,7 +621,7 @@ jobs:
         with:
           repository: davidgamero/go-echo-no-mod
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/go/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -597,6 +629,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l go --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   go-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -713,7 +753,7 @@ jobs:
           with:
             repository: davidgamero/go-echo-no-mod
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/go/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -721,6 +761,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l go --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   go-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -870,7 +918,7 @@ jobs:
           with:
             repository: OliverMKing/flask-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/python/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -878,6 +926,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l python --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   python-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -1003,7 +1059,7 @@ jobs:
         with:
           repository: OliverMKing/flask-hello-world
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/python/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -1011,6 +1067,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l python --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   python-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -1127,7 +1191,7 @@ jobs:
           with:
             repository: OliverMKing/flask-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/python/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -1135,6 +1199,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l python --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   python-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -1284,7 +1356,7 @@ jobs:
           with:
             repository: OliverMKing/tiny-http-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/rust/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -1292,6 +1364,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l rust --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   rust-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -1417,7 +1497,7 @@ jobs:
         with:
           repository: OliverMKing/tiny-http-hello-world
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/rust/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -1425,6 +1505,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l rust --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   rust-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -1541,7 +1629,7 @@ jobs:
           with:
             repository: OliverMKing/tiny-http-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/rust/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -1549,6 +1637,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l rust --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   rust-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -1698,7 +1794,7 @@ jobs:
           with:
             repository: davidgamero/express-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/javascript/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -1706,6 +1802,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l javascript --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   javascript-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -1831,7 +1935,7 @@ jobs:
         with:
           repository: davidgamero/express-hello-world
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/javascript/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -1839,6 +1943,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l javascript --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   javascript-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -1955,7 +2067,7 @@ jobs:
           with:
             repository: davidgamero/express-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/javascript/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -1963,6 +2075,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l javascript --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   javascript-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -2112,7 +2232,7 @@ jobs:
           with:
             repository: OliverMKing/ruby-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/ruby/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -2120,6 +2240,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l ruby --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   ruby-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -2245,7 +2373,7 @@ jobs:
         with:
           repository: OliverMKing/ruby-hello-world
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/ruby/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -2253,6 +2381,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l ruby --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   ruby-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -2369,7 +2505,7 @@ jobs:
           with:
             repository: OliverMKing/ruby-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/ruby/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -2377,6 +2513,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l ruby --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   ruby-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -2526,7 +2670,7 @@ jobs:
           with:
             repository: imiller31/csharp-simple-web-app
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/csharp/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -2534,6 +2678,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l csharp --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   csharp-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -2659,7 +2811,7 @@ jobs:
         with:
           repository: imiller31/csharp-simple-web-app
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/csharp/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -2667,6 +2819,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l csharp --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   csharp-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -2783,7 +2943,7 @@ jobs:
           with:
             repository: imiller31/csharp-simple-web-app
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/csharp/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -2791,6 +2951,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l csharp --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   csharp-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -2940,7 +3108,7 @@ jobs:
           with:
             repository: imiller31/simple-java-server
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/java/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -2948,6 +3116,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l java --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   java-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -3073,7 +3249,7 @@ jobs:
         with:
           repository: imiller31/simple-java-server
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/java/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -3081,6 +3257,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l java --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   java-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -3197,7 +3381,7 @@ jobs:
           with:
             repository: imiller31/simple-java-server
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/java/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -3205,6 +3389,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l java --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   java-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -3354,7 +3546,7 @@ jobs:
           with:
             repository: imiller31/simple-gradle-server
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/gradle/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -3362,6 +3554,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l gradle --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   gradle-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -3487,7 +3687,7 @@ jobs:
         with:
           repository: imiller31/simple-gradle-server
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/gradle/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -3495,6 +3695,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l gradle --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   gradle-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -3611,7 +3819,7 @@ jobs:
           with:
             repository: imiller31/simple-gradle-server
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/gradle/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -3619,6 +3827,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l gradle --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   gradle-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -3768,7 +3984,7 @@ jobs:
           with:
             repository: OliverMKing/swift-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/swift/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -3776,6 +3992,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l swift --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   swift-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -3901,7 +4125,7 @@ jobs:
         with:
           repository: OliverMKing/swift-hello-world
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/swift/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -3909,6 +4133,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l swift --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   swift-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -4025,7 +4257,7 @@ jobs:
           with:
             repository: OliverMKing/swift-hello-world
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/swift/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -4033,6 +4265,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l swift --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   swift-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -4182,7 +4422,7 @@ jobs:
           with:
             repository: bfoley13/ErlangExample
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/erlang/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -4190,6 +4430,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l erlang --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   erlang-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -4315,7 +4563,7 @@ jobs:
         with:
           repository: bfoley13/ErlangExample
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/erlang/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -4323,6 +4571,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l erlang --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   erlang-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -4439,7 +4695,7 @@ jobs:
           with:
             repository: bfoley13/ErlangExample
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/erlang/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -4447,6 +4703,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l erlang --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   erlang-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -4596,7 +4860,7 @@ jobs:
           with:
             repository: imiller31/clojure-simple-http
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/clojure/helm.yaml             -d ./langtest/ --skip-file-detection
@@ -4604,6 +4868,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l clojure --skip-file-detection --deploy-type helm             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   clojure-helm-create-update:
     runs-on: ubuntu-latest
     services:
@@ -4729,7 +5001,7 @@ jobs:
         with:
           repository: imiller31/clojure-simple-http
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -c ./test/integration/clojure/kustomize.yaml           -d ./langtest/ --skip-file-detection
@@ -4737,6 +5009,14 @@ jobs:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json           create -d ./langtest/ -l clojure --skip-file-detection --deploy-type kustomize           --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   clojure-kustomize-create-update:
     runs-on: ubuntu-latest
     services:
@@ -4853,7 +5133,7 @@ jobs:
           with:
             repository: imiller31/clojure-simple-http
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -c ./test/integration/clojure/manifest.yaml             -d ./langtest/ --skip-file-detection
@@ -4861,6 +5141,14 @@ jobs:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json             create -d ./langtest/ -l clojure --skip-file-detection --deploy-type manifests             --variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   clojure-manifests-create:
     runs-on: ubuntu-latest
     services:
diff --git a/cmd/create.go b/cmd/create.go
index 0416a58..57dcbd5 100644
--- a/cmd/create.go
+++ b/cmd/create.go
@@ -10,6 +10,7 @@ import (
 	"github.com/manifoldco/promptui"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
+	"golang.org/x/exp/maps"
 	"gopkg.in/yaml.v3"
 
 	"github.com/Azure/draft/pkg/config"
@@ -27,18 +28,21 @@ import (
 // ErrNoLanguageDetected is raised when `draft create` does not detect source
 // code for linguist to classify, or if there are no packs available for the detected languages.
 var ErrNoLanguageDetected = errors.New("no supported languages were detected")
+var flagVariablesMap = make(map[string]string)
 
 const LANGUAGE_VARIABLE = "LANGUAGE"
 const TWO_SPACES = "  "
 
 type createCmd struct {
-	appName string
-	lang    string
-	dest    string
+	appName    string
+	lang       string
+	dest       string
+	deployType string
 
 	dockerfileOnly    bool
 	deploymentOnly    bool
 	skipFileDetection bool
+	flagVariables     []string
 
 	createConfigPath string
 	createConfig     *CreateConfig
@@ -70,9 +74,11 @@ func newCreateCmd() *cobra.Command {
 	f.StringVarP(&cc.appName, "app", "a", "", "specify the name of the helm release")
 	f.StringVarP(&cc.lang, "language", "l", "", "specify the language used to create the Kubernetes deployment")
 	f.StringVarP(&cc.dest, "destination", "d", ".", "specify the path to the project directory")
+	f.StringVarP(&cc.deployType, "deploy-type", "", ".", "specify deployement type (eg. helm, kustomize, manifests)")
 	f.BoolVar(&cc.dockerfileOnly, "dockerfile-only", false, "only create Dockerfile in the project directory")
 	f.BoolVar(&cc.deploymentOnly, "deployment-only", false, "only create deployment files in the project directory")
 	f.BoolVar(&cc.skipFileDetection, "skip-file-detection", false, "skip file detection step")
+	f.StringArrayVarP(&cc.flagVariables, "variable", "", []string{}, "pass additional variables using repeated --variable flag")
 
 	return cmd
 }
@@ -101,6 +107,16 @@ func (cc *createCmd) initConfig() error {
 
 func (cc *createCmd) run() error {
 	log.Debugf("config: %s", cc.createConfigPath)
+
+	for _, flagVar := range cc.flagVariables {
+		flagVarName, flagVarValue, ok := strings.Cut(flagVar, "=")
+		if !ok {
+			return fmt.Errorf("invalid variable format: %s", flagVar)
+		}
+		flagVariablesMap[flagVarName] = flagVarValue
+		log.Debugf("flag variable %s=%s", flagVarName, flagVarValue)
+	}
+
 	var dryRunRecorder *dryrunpkg.DryRunRecorder
 	if dryRun {
 		dryRunRecorder = dryrunpkg.NewDryRunRecorder()
@@ -142,53 +158,57 @@ func (cc *createCmd) detectLanguage() (*config.DraftConfig, string, error) {
 	var langs []*linguist.Language
 	var err error
 	if cc.createConfig.LanguageType == "" {
-		log.Info("--- Detecting Language ---")
-		langs, err = linguist.ProcessDir(cc.dest)
-		log.Debugf("linguist.ProcessDir(%v) result:\n\nError: %v", cc.dest, err)
-		if err != nil {
-			return nil, "", fmt.Errorf("there was an error detecting the language: %s", err)
-		}
-		for _, lang := range langs {
-			log.Debugf("%s:\t%f (%s)", lang.Language, lang.Percent, lang.Color)
-			// For now let's check here for weird stuff like go module support
-			if lang.Language == "Go" {
-				hasGo = true
-
-				selection := &promptui.Select{
-					Label: "Linguist detected Go, do you use Go Modules?",
-					Items: []string{"yes", "no"},
-				}
-
-				_, selectResponse, err := selection.Run()
-				if err != nil {
-					return nil, "", err
-				}
-
-				hasGoMod = strings.EqualFold(selectResponse, "yes")
+		if cc.lang != "" {
+			cc.createConfig.LanguageType = cc.lang
+		} else {
+			log.Info("--- Detecting Language ---")
+			langs, err = linguist.ProcessDir(cc.dest)
+			log.Debugf("linguist.ProcessDir(%v) result:\n\nError: %v", cc.dest, err)
+			if err != nil {
+				return nil, "", fmt.Errorf("there was an error detecting the language: %s", err)
 			}
+			for _, lang := range langs {
+				log.Debugf("%s:\t%f (%s)", lang.Language, lang.Percent, lang.Color)
+				// For now let's check here for weird stuff like go module support
+				if lang.Language == "Go" {
+					hasGo = true
+
+					selection := &promptui.Select{
+						Label: "Linguist detected Go, do you use Go Modules?",
+						Items: []string{"yes", "no"},
+					}
+
+					_, selectResponse, err := selection.Run()
+					if err != nil {
+						return nil, "", err
+					}
+
+					hasGoMod = strings.EqualFold(selectResponse, "yes")
+				}
 
-			if lang.Language == "Java" {
+				if lang.Language == "Java" {
 
-				selection := &promptui.Select{
-					Label: "Linguist detected Java, are you using maven or gradle?",
-					Items: []string{"gradle", "maven"},
-				}
+					selection := &promptui.Select{
+						Label: "Linguist detected Java, are you using maven or gradle?",
+						Items: []string{"gradle", "maven"},
+					}
 
-				_, selectResponse, err := selection.Run()
-				if err != nil {
-					return nil, "", err
-				}
+					_, selectResponse, err := selection.Run()
+					if err != nil {
+						return nil, "", err
+					}
 
-				if selectResponse == "gradle" {
-					lang.Language = "Gradle"
+					if selectResponse == "gradle" {
+						lang.Language = "Gradle"
+					}
 				}
 			}
-		}
 
-		log.Debugf("detected %d langs", len(langs))
+			log.Debugf("detected %d langs", len(langs))
 
-		if len(langs) == 0 {
-			return nil, "", ErrNoLanguageDetected
+			if len(langs) == 0 {
+				return nil, "", ErrNoLanguageDetected
+			}
 		}
 	}
 
@@ -231,7 +251,7 @@ func (cc *createCmd) generateDockerfile(langConfig *config.DraftConfig, lowerLan
 	var inputs map[string]string
 	var err error
 	if cc.createConfig.LanguageVariables == nil {
-		inputs, err = prompts.RunPromptsFromConfig(langConfig)
+		inputs, err = prompts.RunPromptsFromConfigWithSkips(langConfig, maps.Keys(flagVariablesMap))
 		if err != nil {
 			return err
 		}
@@ -248,6 +268,8 @@ func (cc *createCmd) generateDockerfile(langConfig *config.DraftConfig, lowerLan
 		}
 	}
 
+	maps.Copy(inputs, flagVariablesMap)
+
 	if err = cc.supportedLangs.CreateDockerfileForLanguage(lowerLang, inputs, cc.templateWriter); err != nil {
 		return fmt.Errorf("there was an error when creating the Dockerfile for language %s: %w", cc.createConfig.LanguageType, err)
 	}
@@ -262,6 +284,7 @@ func (cc *createCmd) createDeployment() error {
 	var deployType string
 	var customInputs map[string]string
 	var err error
+
 	if cc.createConfig.DeployType != "" {
 		deployType = strings.ToLower(cc.createConfig.DeployType)
 		deployConfig := d.GetConfig(deployType)
@@ -274,23 +297,29 @@ func (cc *createCmd) createDeployment() error {
 		}
 
 	} else {
-		selection := &promptui.Select{
-			Label: "Select k8s Deployment Type",
-			Items: []string{"helm", "kustomize", "manifests"},
-		}
+		if cc.deployType == "" {
+			selection := &promptui.Select{
+				Label: "Select k8s Deployment Type",
+				Items: []string{"helm", "kustomize", "manifests"},
+			}
 
-		_, deployType, err = selection.Run()
-		if err != nil {
-			return err
+			_, deployType, err = selection.Run()
+			if err != nil {
+				return err
+			}
+		} else {
+			deployType = cc.deployType
 		}
 
 		deployConfig := d.GetConfig(deployType)
-		customInputs, err = prompts.RunPromptsFromConfig(deployConfig)
+		customInputs, err = prompts.RunPromptsFromConfigWithSkips(deployConfig, maps.Keys(flagVariablesMap))
 		if err != nil {
 			return err
 		}
 	}
 
+	maps.Copy(customInputs, flagVariablesMap)
+
 	if cc.templateVariableRecorder != nil {
 		for k, v := range customInputs {
 			cc.templateVariableRecorder.Record(k, v)
@@ -419,7 +448,7 @@ func validateConfigInputsToPrompts(required []config.BuilderVar, provided []User
 
 	for _, variable := range required {
 		if _, ok := customInputs[variable.Name]; !ok {
-			return nil, fmt.Errorf("config missing language variable: %s with description: %s", variable.Name, variable.Description)
+			return nil, fmt.Errorf("config missing required variable: %s with description: %s", variable.Name, variable.Description)
 		}
 	}
 


Test patch:
diff --git a/cmd/create_test.go b/cmd/create_test.go
index c088745..74a14f8 100644
--- a/cmd/create_test.go
+++ b/cmd/create_test.go
@@ -4,6 +4,8 @@ import (
 	"fmt"
 	"io/ioutil"
 	"os"
+	"path"
+	"path/filepath"
 	"strings"
 	"testing"
 
@@ -21,7 +23,7 @@ func TestRun(t *testing.T) {
 	mockCC := &createCmd{}
 	mockCC.createConfig = &CreateConfig{}
 	mockCC.dest = "./.."
-	mockCC.createConfig.DeployType = "helm"
+	mockCC.createConfig.DeployType = ""
 	mockCC.createConfig.LanguageVariables = []UserInputs{}
 	mockCC.createConfig.DeployVariables = []UserInputs{}
 	mockPortInput := UserInputs{Name: "PORT", Value: "8080"}
@@ -29,7 +31,8 @@ func TestRun(t *testing.T) {
 	mockCC.createConfig.DeployVariables = append(mockCC.createConfig.DeployVariables, mockPortInput, mockAppNameInput)
 	mockCC.createConfig.LanguageVariables = append(mockCC.createConfig.LanguageVariables, mockPortInput)
 	mockCC.templateWriter = &writers.LocalFSWriter{}
-
+	flagVariablesMap = map[string]string{"PORT": "8080", "APPNAME": "testingCreateCommand", "VERSION": "1.18", "SERVICEPORT": "8080", "NAMESPACE": "testNamespace", "IMAGENAME": "testImage", "IMAGETAG": "latest"}
+	deployTypes := []string{"helm", "kustomize", "manifests"}
 	oldDockerfile, _ := ioutil.ReadFile("./../Dockerfile")
 	oldDockerignore, _ := ioutil.ReadFile("./../.dockerignore")
 
@@ -42,8 +45,18 @@ func TestRun(t *testing.T) {
 	err = mockCC.generateDockerfile(detectedLang, lowerLang)
 	assert.True(t, err == nil)
 
-	err = mockCC.createDeployment()
+	//when language variables are passed in --variable flag
+	mockCC.createConfig.LanguageVariables = nil
+	mockCC.lang = "go"
+	detectedLang, lowerLang, err = mockCC.mockDetectLanguage()
+	assert.False(t, detectedLang == nil)
+	assert.False(t, lowerLang == "")
 	assert.True(t, err == nil)
+	err = mockCC.generateDockerfile(detectedLang, lowerLang)
+	println(err)
+	assert.True(t, err == nil)
+
+	//Write back old Dockerfile
 	err = ioutil.WriteFile("./../Dockerfile", oldDockerfile, 0644)
 	if err != nil {
 		t.Error(err)
@@ -54,7 +67,42 @@ func TestRun(t *testing.T) {
 		t.Error(err)
 	}
 
-	os.RemoveAll("./../charts")
+	for _, deployType := range deployTypes {
+		//deployment variables passed through --variable flag
+		mockCC.deployType = deployType
+		err = mockCC.createDeployment()
+		assert.True(t, err == nil)
+		//check if deployment files have been created
+		err, deploymentFiles := getAllDeploymentFiles(path.Join("../template/deployments", mockCC.deployType))
+		assert.Nil(t, err)
+		for _, fileName := range deploymentFiles {
+			_, err = os.Stat(fileName)
+			assert.True(t, err == nil)
+		}
+
+		os.RemoveAll("./../charts")
+		os.RemoveAll("./../base")
+		os.RemoveAll("./../overlays")
+		os.RemoveAll("./../manifests")
+
+		//deployment variables passed through createConfig
+		mockCC.createConfig.DeployType = deployType
+		err = mockCC.createDeployment()
+		assert.True(t, err == nil)
+		//check if deployment files have been created
+		err, deploymentFiles = getAllDeploymentFiles(path.Join("../template/deployments", mockCC.createConfig.DeployType))
+		assert.Nil(t, err)
+		for _, fileName := range deploymentFiles {
+			_, err = os.Stat(fileName)
+			assert.True(t, err == nil)
+		}
+		mockCC.createConfig.DeployType = ""
+
+		os.RemoveAll("./../charts")
+		os.RemoveAll("./../base")
+		os.RemoveAll("./../overlays")
+		os.RemoveAll("./../manifests")
+	}
 }
 
 func TestInitConfig(t *testing.T) {
@@ -106,20 +154,24 @@ func (mcc *createCmd) mockDetectLanguage() (*config.DraftConfig, string, error)
 	var err error
 
 	if mcc.createConfig.LanguageType == "" {
-		langs, err = linguist.ProcessDir(mcc.dest)
-		log.Debugf("linguist.ProcessDir(%v) result:\n\nError: %v", mcc.dest, err)
-		if err != nil {
-			return nil, "", fmt.Errorf("there was an error detecting the language: %s", err)
-		}
+		if mcc.lang != "" {
+			mcc.createConfig.LanguageType = mcc.lang
+		} else {
+			langs, err = linguist.ProcessDir(mcc.dest)
+			log.Debugf("linguist.ProcessDir(%v) result:\n\nError: %v", mcc.dest, err)
+			if err != nil {
+				return nil, "", fmt.Errorf("there was an error detecting the language: %s", err)
+			}
 
-		for _, lang := range langs {
-			log.Debugf("%s:\t%f (%s)", lang.Language, lang.Percent, lang.Color)
-		}
+			for _, lang := range langs {
+				log.Debugf("%s:\t%f (%s)", lang.Language, lang.Percent, lang.Color)
+			}
 
-		log.Debugf("detected %d langs", len(langs))
+			log.Debugf("detected %d langs", len(langs))
 
-		if len(langs) == 0 {
-			return nil, "", ErrNoLanguageDetected
+			if len(langs) == 0 {
+				return nil, "", ErrNoLanguageDetected
+			}
 		}
 	}
 
@@ -154,3 +206,19 @@ func (mcc *createCmd) mockDetectLanguage() (*config.DraftConfig, string, error)
 	}
 	return nil, "", ErrNoLanguageDetected
 }
+
+func getAllDeploymentFiles(src string) (error, []string) {
+	deploymentFiles := []string{}
+	err := filepath.Walk(src,
+		func(path string, info os.FileInfo, err error) error {
+			if err != nil {
+				return err
+			}
+			filePath := strings.ReplaceAll(path, src, "./..")
+			if info.Name() != "draft.yaml" {
+				deploymentFiles = append(deploymentFiles, filePath)
+			}
+			return nil
+		})
+	return err, deploymentFiles
+}
diff --git a/test/gen_integration.sh b/test/gen_integration.sh
index b7a7ca5..81249f4 100755
--- a/test/gen_integration.sh
+++ b/test/gen_integration.sh
@@ -110,6 +110,7 @@ do
     imagename="host.minikube.internal:5001/testapp"
     # addon integration testing vars
     ingress_test_args="-a webapp_routing --variable ingress-tls-cert-keyvault-uri=test.cert.keyvault.uri --variable ingress-use-osm-mtls=true --variable ingress-host=host1"
+    create_config_args="--variable PORT=8080 --variable APPNAME=testingCreateCommand --variable VERSION=1.11 --variable BUILDERVERSION=1.11 --variable SERVICEPORT=8080 --variable NAMESPACE=testNamespace --variable IMAGENAME=testImage --variable IMAGETAG=latest"
     echo "Adding $lang with port $port"
 
     mkdir ./integration/$lang
@@ -195,7 +196,7 @@ languageVariables:
           with:
             repository: $repo
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json \
@@ -205,6 +206,16 @@ languageVariables:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json \
+            create -d ./langtest/ -l $lang --skip-file-detection --deploy-type helm \
+            $create_config_args
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   $helm_create_update_job_name:
     runs-on: ubuntu-latest
     services:
@@ -335,7 +346,7 @@ languageVariables:
         with:
           repository: $repo
           path: ./langtest
-      - name: Execute Dry Run
+      - name: Execute Dry Run with config file
         run: |
           mkdir -p test/temp
           ./draft --dry-run --dry-run-file test/temp/dry-run.json \
@@ -345,6 +356,16 @@ languageVariables:
         run: |
           npm install -g ajv-cli@5.0.0
           ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+      - name: Execute Dry Run with variables passed through flag 
+        run: |
+          mkdir -p test/temp
+          ./draft --dry-run --dry-run-file test/temp/dry-run.json \
+          create -d ./langtest/ -l $lang --skip-file-detection --deploy-type kustomize \
+          $create_config_args
+      - name: Validate JSON
+        run: |
+          npm install -g ajv-cli@5.0.0
+          ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   $kustomize_create_update_job_name:
     runs-on: ubuntu-latest
     services:
@@ -466,7 +487,7 @@ languageVariables:
           with:
             repository: $repo
             path: ./langtest
-        - name: Execute Dry Run
+        - name: Execute Dry Run with config file
           run: |
             mkdir -p test/temp
             ./draft --dry-run --dry-run-file test/temp/dry-run.json \
@@ -476,6 +497,16 @@ languageVariables:
           run: |
             npm install -g ajv-cli@5.0.0
             ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
+        - name: Execute Dry Run with variables passed through flag 
+          run: |
+            mkdir -p test/temp
+            ./draft --dry-run --dry-run-file test/temp/dry-run.json \
+            create -d ./langtest/ -l $lang --skip-file-detection --deploy-type manifests \
+            $create_config_args
+        - name: Validate JSON
+          run: |
+            npm install -g ajv-cli@5.0.0
+            ajv validate -s test/dry_run_schema.json -d test/temp/dry-run.json
   $lang-manifests-create:
     runs-on: ubuntu-latest
     services:
@@ -755,4 +786,4 @@ echo "
       needs: [ $( paste -sd ',' $manifest_workflow_names_file) ]
       steps:
         - run: echo "manifest integrations passed"
-" >> ../.github/workflows/integration-linux.yml
+" >> ../.github/workflows/integration-linux.yml
\ No newline at end of file