diff --git a/CHANGELOG.md b/CHANGELOG.md index d69c8279d..a4f1e6e8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # RELEASE NOTES +## [0.5.8] - 2020-03-17 + +### Added + +- `spk setup` improvements + +### Changed + +- Fixed bug where Azure Pipelines would fail due to Helm 3 installation + ## [0.5.7] - 2020-03-10 ### Added diff --git a/docs/commands/data.json b/docs/commands/data.json index 45bbbee79..93c8a5a46 100644 --- a/docs/commands/data.json +++ b/docs/commands/data.json @@ -26,7 +26,7 @@ "description": "Path to the file that contains answers to the questions." } ], - "markdown": "## Description\n\nThis command assists in creating resources in Azure DevOps so that you can get\nstarted with using Bedrock. It creates\n\n1. An Azure DevOps project.\n\nBy Default, it runs in an interactive mode where you are prompted for answers\nfor a few questions\n\n1. Azure DevOps Organization Name\n2. Azure DevOps Project Name, the project to be created.\n3. Azure DevOps Personal Access Token. The token needs to have these permissions\n 1. Read and write projects.\n 2. Read and write codes.\n4. To create a sample application Repo\n 1. If Yes, a Azure Service Principal is needed. You have 2 options\n 1. have the command line tool to create it. Azure command line tool shall\n be used\n 2. provide the Service Principal Id, Password and Tenant Id.\n\nIt can also run in a non interactive mode by providing a file that contains\nanswers to the above questions.\n\n```\nspk setup --file \n```\n\nContent of this file is as follow\n\n```\nazdo_org_name=\nazdo_project_name=\nazdo_pat=\naz_create_app=\naz_create_sp=\naz_sp_id=\naz_sp_password=\naz_sp_tenant=\n```\n\n`azdo_project_name` is optional and default value is `BedrockRocks`.\n\nThe followings shall be created\n\n1. A working directory, `quick-start-env`\n2. Project shall not be created if it already exists.\n3. A Git Repo, `quick-start-hld`, it shall be deleted and recreated if it\n already exists.\n 1. And initial commit shall be made to this repo\n4. A Git Repo, `quick-start-manifest`, it shall be deleted and recreated if it\n already exists.\n 1. And initial commit shall be made to this repo\n5. A High Level Definition (HLD) to Manifest pipeline.\n6. A Service Principal (if requested)\n\n## Setup log\n\nA `setup.log` file is created after running this command. This file contains\ninformation about what are created and the execution status (completed or\nincomplete). This file will not be created if input validation failed.\n\n## Note\n\nTo remove the service principal that it is created by the tool, you can do the\nfollowings:\n\n1. Get the identifier from `setup.log` (look for `az_sp_id`)\n2. run on terminal `az ad sp delete --id `\n" + "markdown": "## Description\n\nThis command assists in creating resources in Azure DevOps so that you can get\nstarted with using Bedrock. It creates\n\n1. An Azure DevOps project.\n\nBy Default, it runs in an interactive mode where you are prompted for answers\nfor a few questions\n\n1. Azure DevOps Organization Name\n2. Azure DevOps Project Name, the project to be created.\n3. Azure DevOps Personal Access Token. The token needs to have these permissions\n 1. Read and write projects.\n 2. Read and write codes.\n4. To create a sample application Repo\n 1. If Yes, a Azure Service Principal is needed. You have 2 options\n 1. have the command line tool to create it. Azure command line tool shall\n be used\n 2. provide the Service Principal Id, Password and Tenant Id.\n 2. Subscription Id is automatically retrieved with the Service Principal\n credential. In case, there are two or more subscriptions, you will be\n prompt to select one of them.\n 3. Create a resource group, `quick-start-rg` if it does not exist.\n 4. Create a Azure Container Registry, `quickStartACR` in resource group,\n `quick-start-rg` if it does not exist.\n\nIt can also run in a non interactive mode by providing a file that contains\nanswers to the above questions.\n\n```\nspk setup --file \n```\n\nContent of this file is as follow\n\n```\nazdo_org_name=\nazdo_project_name=\nazdo_pat=\naz_create_app=\naz_create_sp=\naz_sp_id=\naz_sp_password=\naz_sp_tenant=\n```\n\n`azdo_project_name` is optional and default value is `BedrockRocks`.\n\nThe followings shall be created\n\n1. A working directory, `quick-start-env`\n2. Project shall not be created if it already exists.\n3. A Git Repo, `quick-start-hld`, it shall be deleted and recreated if it\n already exists.\n 1. And initial commit shall be made to this repo\n4. A Git Repo, `quick-start-manifest`, it shall be deleted and recreated if it\n already exists.\n 1. And initial commit shall be made to this repo\n5. A High Level Definition (HLD) to Manifest pipeline.\n6. A Service Principal (if requested)\n\n## Setup log\n\nA `setup.log` file is created after running this command. This file contains\ninformation about what are created and the execution status (completed or\nincomplete). This file will not be created if input validation failed.\n\n## Note\n\nTo remove the service principal that it is created by the tool, you can do the\nfollowings:\n\n1. Get the identifier from `setup.log` (look for `az_sp_id`)\n2. run on terminal `az ad sp delete --id `\n" }, "deployment create": { "command": "create", diff --git a/docs/commands/data0.5.8.json b/docs/commands/data0.5.8.json new file mode 100644 index 000000000..93c8a5a46 --- /dev/null +++ b/docs/commands/data0.5.8.json @@ -0,0 +1,676 @@ +{ + "init": { + "command": "init", + "alias": "i", + "description": "Initialize the spk tool for the first time.", + "options": [ + { + "arg": "-f, --file ", + "description": "Path to the config file." + }, + { + "arg": "-i, --interactive", + "description": "Interactive mode.", + "defaultValue": false + } + ], + "markdown": "This command creates a configuration file, `config.yaml` in a folder `.spk`\nunder your home directory. There are two options for creating this file\n\n1. an interactive mode where you have to answer a few questions; and\n2. you provide a `yaml` file and this `yaml` will be copied to the target\n location.\n\n## Interactive mode\n\nThe command line tool attempts to read `config.yaml` in a folder `.spk` under\nyour home directory. Configuration values shall be read from it if it exists.\nAnd these values shall be default values for the questions. Otherwise, there\nshall be no default values. These are the questions\n\n1. Organization Name of Azure dev-op account\n2. Project Name of Azure dev-op account\n3. Personal Access Token (guides)\n\nThis tool shall verify these values by making an API call to Azure dev-op. They\nshall be written to `config.yaml` regardless the verification is successful or\nnot.\n\n> Note: In the event that you do not have internet connection, this verification\n> shall not be possible\n\n## Example\n\n```\nspk init --interactive\n```\n\nor\n\n```\nspk init --file myConfig.yaml\n```\n" + }, + "setup": { + "command": "setup", + "alias": "s", + "description": "An interactive command to setup resources in azure and azure dev-ops", + "options": [ + { + "arg": "-f, --file ", + "description": "Path to the file that contains answers to the questions." + } + ], + "markdown": "## Description\n\nThis command assists in creating resources in Azure DevOps so that you can get\nstarted with using Bedrock. It creates\n\n1. An Azure DevOps project.\n\nBy Default, it runs in an interactive mode where you are prompted for answers\nfor a few questions\n\n1. Azure DevOps Organization Name\n2. Azure DevOps Project Name, the project to be created.\n3. Azure DevOps Personal Access Token. The token needs to have these permissions\n 1. Read and write projects.\n 2. Read and write codes.\n4. To create a sample application Repo\n 1. If Yes, a Azure Service Principal is needed. You have 2 options\n 1. have the command line tool to create it. Azure command line tool shall\n be used\n 2. provide the Service Principal Id, Password and Tenant Id.\n 2. Subscription Id is automatically retrieved with the Service Principal\n credential. In case, there are two or more subscriptions, you will be\n prompt to select one of them.\n 3. Create a resource group, `quick-start-rg` if it does not exist.\n 4. Create a Azure Container Registry, `quickStartACR` in resource group,\n `quick-start-rg` if it does not exist.\n\nIt can also run in a non interactive mode by providing a file that contains\nanswers to the above questions.\n\n```\nspk setup --file \n```\n\nContent of this file is as follow\n\n```\nazdo_org_name=\nazdo_project_name=\nazdo_pat=\naz_create_app=\naz_create_sp=\naz_sp_id=\naz_sp_password=\naz_sp_tenant=\n```\n\n`azdo_project_name` is optional and default value is `BedrockRocks`.\n\nThe followings shall be created\n\n1. A working directory, `quick-start-env`\n2. Project shall not be created if it already exists.\n3. A Git Repo, `quick-start-hld`, it shall be deleted and recreated if it\n already exists.\n 1. And initial commit shall be made to this repo\n4. A Git Repo, `quick-start-manifest`, it shall be deleted and recreated if it\n already exists.\n 1. And initial commit shall be made to this repo\n5. A High Level Definition (HLD) to Manifest pipeline.\n6. A Service Principal (if requested)\n\n## Setup log\n\nA `setup.log` file is created after running this command. This file contains\ninformation about what are created and the execution status (completed or\nincomplete). This file will not be created if input validation failed.\n\n## Note\n\nTo remove the service principal that it is created by the tool, you can do the\nfollowings:\n\n1. Get the identifier from `setup.log` (look for `az_sp_id`)\n2. run on terminal `az ad sp delete --id `\n" + }, + "deployment create": { + "command": "create", + "alias": "c", + "description": "Insert the deployment in storage from pipelines", + "options": [ + { + "arg": "-k, --access-key ", + "description": "Access key of the storage account" + }, + { + "arg": "-n, --name ", + "description": "Name of the storage account" + }, + { + "arg": "-p, --partition-key ", + "description": "Partition key for the storage account" + }, + { + "arg": "-t, --table-name ", + "description": "Name of table in storage account" + }, + { + "arg": "--p1 ", + "description": "Identifier for the first pipeline" + }, + { + "arg": "--image-tag ", + "description": "Image tag" + }, + { + "arg": "--commit-id ", + "description": "Commit Id in source repository" + }, + { + "arg": "--service ", + "description": "Service name" + }, + { + "arg": "--p2 ", + "description": "Identifier for the second pipeline" + }, + { + "arg": "--hld-commit-id ", + "description": "Commit id in HLD repository" + }, + { + "arg": "--env ", + "description": "Release environment name", + "defaultValue": "" + }, + { + "arg": "--p3 ", + "description": "Identifier for the third pipeline" + }, + { + "arg": "--pr ", + "description": "Pull request identifier for a PR opened/closed in the HLD" + }, + { + "arg": "--manifest-commit-id ", + "description": "Commit Id in the manifest repository" + }, + { + "arg": "--repository ", + "description": "URL of the repository (SRC, HLD, Manifest)" + } + ] + }, + "deployment dashboard": { + "command": "dashboard", + "alias": "d", + "description": "Launch the service introspection dashboard", + "options": [ + { + "arg": "-p, --port ", + "description": "Port to launch the dashboard on", + "defaultValue": "4040" + }, + { + "arg": "-r, --remove-all", + "description": "Removes previously launched instances of the dashboard", + "defaultValue": false + } + ], + "markdown": "## Description\n\nThis command launches the Service Introspection Dashboard for your current\nconfiguration. It requires `docker` to be installed on your machine in order to\nwork.\n" + }, + "deployment get": { + "command": "get", + "alias": "g", + "description": "Get the list of deployments and filter with these options: service name, environment, build ID, commit ID, container image tag.", + "options": [ + { + "arg": "-b, --build-id ", + "description": "Filter by the build ID of the source repository", + "defaultValue": "" + }, + { + "arg": "-c, --commit-id ", + "description": "Filter by a commit ID from the source repository", + "defaultValue": "" + }, + { + "arg": "-d, --deployment-id ", + "description": "Filter by the deployment ID of the source repository", + "defaultValue": "" + }, + { + "arg": "-i, --image-tag ", + "description": "Filter by a container image tag", + "defaultValue": "" + }, + { + "arg": "-e, --env ", + "description": "Filter by environment name", + "defaultValue": "" + }, + { + "arg": "-s, --service ", + "description": "Filter by service name", + "defaultValue": "" + }, + { + "arg": "-t, --top ", + "description": "Return only top N most recent deployments", + "defaultValue": "" + }, + { + "arg": "-O, --output ", + "description": "Output the information one of the following: normal, wide, JSON", + "defaultValue": "normal" + }, + { + "arg": "-w, --watch", + "description": "Watch the deployments for a live view", + "defaultValue": false + } + ], + "markdown": "## Description\n\nThis commands retrieves the list of deployments by service name, release\nenvironment, build ID, commit ID, or container image tag.\n" + }, + "deployment onboard": { + "command": "onboard", + "alias": "o", + "description": "Onboard to use the service introspection tool. This will create a storage account if it does not exist in your Azure subscription in the give resource group.", + "options": [ + { + "arg": "-s, --storage-account-name ", + "description": "Azure storage account name", + "required": true + }, + { + "arg": "-t, --storage-table-name ", + "description": "Azure storage table name", + "required": true + }, + { + "arg": "-l, --storage-location ", + "description": "Azure location to create new storage account when it does not exist" + }, + { + "arg": "-r, --storage-resource-group-name ", + "description": "Name of the resource group to create new storage account when it does not exist", + "required": true + }, + { + "arg": "-k, --key-vault-name ", + "description": "Name of the Azure key vault" + }, + { + "arg": "--service-principal-id ", + "description": "Azure service principal id with `contributor` role in Azure Resource Group", + "required": true + }, + { + "arg": "--service-principal-password ", + "description": "The Azure service principal password", + "required": true + }, + { + "arg": "--tenant-id ", + "description": "The Azure AD tenant id of service principal", + "required": true + }, + { + "arg": "--subscription-id ", + "description": "The Azure subscription id", + "required": true + } + ], + "markdown": "## Description\n\nPrepare storage for the service introspection tool. This will create a storage\naccount if it does not already exist in your subscription in the given\n`resource-group`. The storage table will also be created in a newly created or\nin an existing storage account if it does not exist already. When the Azure Key\nVault argument is specified, a secret with Azure storage access key will be\ncreated. Otherwise, the storage access key will need to be specified in\nenvironment variables manually.\n\nSee\n[Prerequisites](https://github.com/CatalystCode/spk/blob/master/guides/service-introspection.md#prerequisites)\n" + }, + "deployment validate": { + "command": "validate", + "alias": "v", + "description": "Validate the configuration and storage account are correct.", + "options": [ + { + "arg": "-s, --self-test", + "description": "Run a test for the configured storage account. This will write test data and delete the test data. For more information on the behavior, please check the online documentation.", + "defaultValue": false + } + ] + }, + "hld init": { + "command": "init", + "alias": "i", + "description": "Initialize High Level Definition repository. Add manifest-generation.yaml file to working directory/repository if it does not already exist.", + "options": [ + { + "arg": "--git-push", + "description": "SPK CLI will try to commit and push these changes to a new origin/branch.", + "required": false, + "defaultValue": false + }, + { + "arg": "--default-component-git ", + "description": "The default hld repository's component's git repository url.", + "required": false, + "defaultValue": "https://github.com/microsoft/fabrikate-definitions.git" + }, + { + "arg": "--default-component-name ", + "description": "The default hld repository's component's name.", + "required": false, + "defaultValue": "traefik2" + }, + { + "arg": "--default-component-path ", + "description": "The default hld repository's component's path.", + "required": false, + "defaultValue": "definitions/traefik2" + } + ], + "markdown": "## Description\n\nInitializes the HLD repository by creating the pipeline\n`manifest-generation.yaml` file, and the default `component.yaml` for\n[fabrikate](https://github.com/microsoft/fabrikate) to consume, if each does not\nalready exist.\n\nThe created `component.yaml` will be populated with a traefik2 definition by\ndefault:\n\n```\nname: default-component\nsubcomponents:\n - name: traefik2\n method: git\n source: 'https://github.com/microsoft/fabrikate-definitions.git'\n path: definitions/traefik2\n```\n\nHowever, you can set a another fabrikate definition to be added instead via the\n`--default-component-*` flags.\n" + }, + "hld install-manifest-pipeline": { + "command": "install-manifest-pipeline", + "alias": "p", + "description": "Install the manifest generation pipeline to your Azure DevOps instance. Default values are set in spk-config.yaml and can be loaded via spk init or overriden via option flags.", + "options": [ + { + "arg": "-n, --pipeline-name ", + "description": "Name of the pipeline to be created", + "defaultValue": "" + }, + { + "arg": "-a, --personal-access-token ", + "description": "Personal Access Token", + "defaultValue": "" + }, + { + "arg": "-o, --org-name ", + "description": "Organization Name for Azure DevOps", + "defaultValue": "" + }, + { + "arg": "-u, --hld-url ", + "description": "HLD Repository URL", + "defaultValue": "" + }, + { + "arg": "-m, --manifest-url ", + "description": "Manifest Repository URL", + "defaultValue": "" + }, + { + "arg": "-d, --devops-project ", + "description": "Azure DevOps Project", + "defaultValue": "" + }, + { + "arg": "-b, --build-script-url ", + "description": "Build Script URL. By default it is 'https://raw.githubusercontent.com/Microsoft/bedrock/master/gitops/azure-devops/build.sh'.", + "defaultValue": "https://raw.githubusercontent.com/Microsoft/bedrock/master/gitops/azure-devops/build.sh" + }, + { + "arg": "--yaml-file-branch ", + "description": "The git branch where the pipeline definition yaml file is located.", + "required": false, + "defaultValue": "master" + } + ], + "markdown": "## Description\n\nAfter merging the azure-pipelines yaml file generated by the init step above\ninto the `master` branch, run the following command to install the HLD to\nManifest pipeline. This pipeline will be triggered on commits to master and\ninvoke \"manifest generation\"\n[(via fabrikate)](https://github.com/microsoft/fabrikate), rendering helm charts\nand configuration into Kubernetes yaml.\n" + }, + "hld reconcile": { + "command": "reconcile ", + "alias": "r", + "description": "Reconcile a HLD with the services tracked in bedrock.yaml.", + "options": [], + "markdown": "## Description\n\nThe reconcile feature scaffolds a HLD with the services in the `bedrock.yaml`\nfile at the root level of the application repository. Recall that in a\nmono-repo, `spk service create` will add an entry into the `bedrock.yaml`\ncorresponding to all tracked services. When the service has been merged into\n`master` of the application repository, a pipeline (see `hld-lifecycle.yaml`,\ncreated by `spk project init`) runs `spk hld reconcile` to add any _new_\nservices tracked in `bedrock.yaml` to the HLD.\n\nThis command is _intended_ to be run in a pipeline (see the generated\n`hld-lifecycle.yaml` created from `spk project init`), but can be run by the\nuser in a CLI for verification.\n\nFor a `bedrock.yaml` file that contained within the\n`https://dev.azure.com/foo/bar/_git` repository, that has the following\nstructure:\n\n```\nrings:\n master:\n isDefault: true\nservices:\n ./services/fabrikam:\n displayName: 'fabrikam'\n k8sBackendPort: 8001\n k8sBackend: 'fabrikam-k8s-svc'\n pathPrefix: 'fabrikam-service'\n pathPrefixMajorVersion: 'v1'\n helm:\n chart:\n branch: master\n git: 'https://dev.azure.com/foo/bar/_git'\n path: stable/fabrikam-application\n middlewares:\n - ''\nvariableGroups:\n - fabrikam-vg\n```\n\nA HLD is produced that resembles the following:\n\n```\n├── component.yaml\n└── fabrikam\n ├── access.yaml\n ├── component.yaml\n ├── config\n │   └── common.yaml\n └── fabrikam\n ├── component.yaml\n ├── config\n │   └── common.yaml\n └── master\n ├── component.yaml\n ├── config\n │   └── common.yaml\n └── static\n ├── ingress-route.yaml\n └── middlewares.yaml\n```\n\nWith the `ingress-route.yaml` representing a\n[Traefik2 Ingress Route](https://docs.traefik.io/routing/providers/kubernetes-crd/#kind-ingressroute)\nbacked by a Kubernetes Service, and the `middlewares.yaml` representing a\n[Traefik2 Middleware](https://docs.traefik.io/routing/providers/kubernetes-crd/#kind-middleware)\nthat strips path prefixes.\n\nFor the `bedrock.yaml` shown above, the `ingress-route.yaml` produced is:\n\n```\napiVersion: traefik.containo.us/v1alpha1\nkind: IngressRoute\nmetadata:\n name: fabrikam-master\nspec:\n routes:\n - kind: Rule\n match: 'PathPrefix(`/v1/fabrikam-service`) && Headers(`Ring`, `master`)'\n middlewares:\n - name: fabrikam-master\n services:\n - name: fabrikam-k8s-svc-master\n port: 8001\n```\n\nAnd the `middlewares.yaml` produced is:\n\n```\napiVersion: traefik.containo.us/v1alpha1\nkind: Middleware\nmetadata:\n name: fabrikam-master\nspec:\n stripPrefix:\n forceSlash: false\n prefixes:\n - /v1/fabrikam-service\n```\n\nNote that there exists a third generated file, `access.yaml`. For the above\n`bedrock.yaml`, `access.yaml` contains a single line, which represents a\n[Fabrikate access.yaml definition](https://github.com/microsoft/fabrikate/blob/master/docs/auth.md#accessyaml),\nallowing Fabrikate to pull Helm Charts that are contained within the same\napplication repository:\n\n```\n'https://dev.azure.com/foo/bar/_git': ACCESS_TOKEN_SECRET\n```\n\nWhen `fabrikate` is invoked in the HLD to Manifest pipeline, it will utilize the\n`ACCESS_TOKEN_SECRET` environment variable injected at pipeline run-time as a\nPersonal Access Token to pull any referenced helm charts from the application\nrepository.\n" + }, + "infra generate": { + "command": "generate", + "alias": "g", + "description": "Generate scaffold for terraform cluster deployment.", + "options": [ + { + "arg": "-p, --project ", + "description": "Location of the definition.yaml file that will be generated", + "required": false + }, + { + "arg": "-O, --output ", + "description": "Location of the generated directory that will be generated", + "required": false + } + ], + "markdown": "## Description\n\nCreates a \"generated\" deployment folder with the completed Terraform files based\non definitions provided from a scaffolded project.\n\nIt will do the following:\n\n- Check if a provided project folder contains a `definition.yaml`\n- Verify the configuration of parent and leaf definitions.\n- Check if the terraform template `source` provided has a valid remote\n repository.\n- Clone and cache the master version of the provided `source` repository locally\n in `~/.spk/templates`\n > Cached repositories will be converted through regex for spk to hash. (i.e. a\n > `source` template of `https://github.com/microsoft/bedrock` will be cached\n > into a folder called `_microsoft_bedrock_git`)\n- Create a \"generated\" directory for Terrform deployments (alongside the\n scaffolded project directory)\n- Copy the appropriate Terraform templates to the \"generated\" directory\n- Create a `spk.tfvars` in the generated directory based on the variables\n provided in `definition.yaml` files of the parent and leaf directories.\n\n## Example\n\nAssuming you have the following setup:\n\n```\nfabrikam\n |- definition.yaml\n |- east/\n |- definition.yaml\n |- central/\n |- definition.yaml\n```\n\nWhen executing the following command **in the `fabrikam` directory**:\n\n```\nspk infra generate --project east\n```\n\nThe following hiearchy of directories will be generated _alongside_ the targeted\ndirectory. In addition, the appropriate versioned Terraform templates will be\ncopied over to the leaf directory with a `spk.tfvars`, which contains the\nvariables accumulated from parent **and** leaf definition.yaml files, where if a\nvariable exists in both parent and leaf definition, the **leaf definitions will\ntake precedence**.\n\n```\nfabrikam\n |- definition.yaml\n |- east/\n |- definition.yaml\n |- central/\n |- definition.yaml\nfabrikam-generated\n |- east\n |- main.tf\n |- variables.tf\n |- spk.tfvars (concatenation of variables from fabrikam/definition.yaml (parent) and fabrikam/east/definition.yaml (leaf))\n```\n\nYou can also have a \"single-tree\" generation by executing `spk infra generate`\ninside a directory without specifying a project folder. For example, if you had\nthe following tree structure:\n\n```\nfabrikam\n |- definition.yaml\n```\n\nand executed `spk infra generate` inside the `fabrikam` directory, this will\ngenerate the following:\n\n```\nfabrikam-generated\n |- main.tf\n |- variables.tf\n |- spk.tfvars\n```\n" + }, + "infra scaffold": { + "command": "scaffold", + "alias": "s", + "description": "Create initial scaffolding for cluster deployment.", + "options": [ + { + "arg": "-n, --name ", + "description": "Cluster name for scaffolding", + "required": true, + "defaultValue": "" + }, + { + "arg": "-s, --source ", + "description": "Source URL for the repository containing the terraform deployment", + "required": false, + "defaultValue": "" + }, + { + "arg": "-r --version ", + "description": "Version or tag for the repository so a fixed version is referenced", + "required": true, + "defaultValue": "" + }, + { + "arg": "-t, --template ", + "description": "Location of the variables.tf for the terraform deployment", + "required": true, + "defaultValue": "" + } + ], + "markdown": "## Description\n\nBuilds a scaffold of an infrastructure deployment project containing a\n`definition.yaml` that enables a user to version, modify and organize terraform\ndeployments.\n\nIn detail, it will do the following:\n\n- Create a new folder with the `` you provided.\n- Clone and cache the source repo to `~.spk/templates`.\n- Provide an infrastructure deployment scaffold based on a `` git url\n for a repo that holds terraform template, a `` respective to the\n repository tag or branch to pull from, and a `