From e431b70f67f8f93926d73c5df0d36d8a62b99dd2 Mon Sep 17 00:00:00 2001 From: Brandon Foley Date: Fri, 11 Oct 2024 16:09:31 -0400 Subject: [PATCH] Migrating azurePipelines to Generic Handler --- pkg/azurePipelines/azurePipelines.go | 133 ------------- pkg/azurePipelines/azurePipelines_test.go | 174 ------------------ .../.pipelines/azure-kubernetes-service.yaml | 68 +++++++ .../.pipelines/azure-kubernetes-service.yaml | 60 ++++++ pkg/handlers/template_test.go | 32 ++++ template/azurePipelines.go | 8 - .../.pipelines/azure-kubernetes-service.yaml | 20 +- template/azurePipelines/kustomize/draft.yaml | 12 ++ .../.pipelines/azure-kubernetes-service.yaml | 20 +- template/azurePipelines/manifests/draft.yaml | 12 ++ 10 files changed, 204 insertions(+), 335 deletions(-) delete mode 100644 pkg/azurePipelines/azurePipelines.go delete mode 100644 pkg/azurePipelines/azurePipelines_test.go create mode 100644 pkg/fixtures/workflows/azurepipelines/kustomize/.pipelines/azure-kubernetes-service.yaml create mode 100644 pkg/fixtures/workflows/azurepipelines/manifest/.pipelines/azure-kubernetes-service.yaml delete mode 100644 template/azurePipelines.go diff --git a/pkg/azurePipelines/azurePipelines.go b/pkg/azurePipelines/azurePipelines.go deleted file mode 100644 index c46fee1d..00000000 --- a/pkg/azurePipelines/azurePipelines.go +++ /dev/null @@ -1,133 +0,0 @@ -package azurePipelines - -import ( - "embed" - "fmt" - "io/fs" - "path" - - "github.com/Azure/draft/pkg/config" - "github.com/Azure/draft/pkg/embedutils" - "github.com/Azure/draft/pkg/osutil" - "github.com/Azure/draft/pkg/templatewriter" - log "github.com/sirupsen/logrus" - "gopkg.in/yaml.v3" -) - -const ( - pipelineParentDirName = "azurePipelines" - aksPipelineTemplateFileName = "azure-kubernetes-service.yaml" - configFileName = "draft.yaml" - pipelineNameVar = "PIPELINENAME" -) - -type AzurePipelines struct { - pipelines map[string]fs.DirEntry - configs map[string]*config.DraftConfig - dest string - pipelineTemplates embed.FS -} - -func CreatePipelinesFromEmbedFS(pipelineTemplates embed.FS, dest string) (*AzurePipelines, error) { - pipelineMap, err := embedutils.EmbedFStoMap(pipelineTemplates, "azurePipelines") - if err != nil { - return nil, fmt.Errorf("error creating map from embedded FS: %w", err) - } - - p := &AzurePipelines{ - pipelines: pipelineMap, - dest: dest, - configs: make(map[string]*config.DraftConfig), - pipelineTemplates: pipelineTemplates, - } - p.populateConfigs() - - return p, nil - -} - -func (p *AzurePipelines) populateConfigs() { - for _, val := range p.pipelines { - draftConfig, err := p.loadConfig(val.Name()) - if err != nil { - log.Debugf("error loading draftConfig for pipeline of deploy type %s: %v", val.Name(), err) - draftConfig = &config.DraftConfig{} - } - p.configs[val.Name()] = draftConfig - } -} - -func (p *AzurePipelines) GetConfig(deployType string) (*config.DraftConfig, error) { - val, ok := p.configs[deployType] - if !ok { - return nil, fmt.Errorf("deploy type %s unsupported", deployType) - } - return val, nil -} - -func (p *AzurePipelines) loadConfig(deployType string) (*config.DraftConfig, error) { - val, ok := p.pipelines[deployType] - if !ok { - return nil, fmt.Errorf("deploy type %s unsupported", deployType) - } - - configPath := path.Join(pipelineParentDirName, val.Name(), configFileName) - configBytes, err := fs.ReadFile(p.pipelineTemplates, configPath) - if err != nil { - return nil, fmt.Errorf("error reading config file: %w", err) - } - - var draftConfig config.DraftConfig - if err = yaml.Unmarshal(configBytes, &draftConfig); err != nil { - return nil, fmt.Errorf("error unmarshalling config file: %w", err) - } - - return &draftConfig, nil -} - -func (p *AzurePipelines) overrideFilename(draftConfig *config.DraftConfig, srcDir string) error { - if draftConfig.FileNameOverrideMap == nil { - draftConfig.FileNameOverrideMap = make(map[string]string) - } - pipelineVar, err := draftConfig.GetVariable(pipelineNameVar) - if err != nil { - return fmt.Errorf("error getting pipeline name variable: %w", err) - } - - if err = fs.WalkDir(p.pipelineTemplates, srcDir, func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if d.Name() == aksPipelineTemplateFileName { - draftConfig.FileNameOverrideMap[d.Name()] = pipelineVar.Value + ".yaml" - } - return nil - }); err != nil { - return fmt.Errorf("error walking through source directory: %w", err) - } - - return nil -} - -func (p *AzurePipelines) CreatePipelineFiles(deployType string, draftConfig *config.DraftConfig, templateWriter templatewriter.TemplateWriter) error { - val, ok := p.pipelines[deployType] - if !ok { - return fmt.Errorf("deploy type %s currently unsupported for azure pipeline", deployType) - } - srcDir := path.Join(pipelineParentDirName, val.Name()) - log.Debugf("source directory of pipeline template: %s", srcDir) - - if err := p.overrideFilename(draftConfig, srcDir); err != nil { - return fmt.Errorf("error overriding filename: %w", err) - } - - if err := draftConfig.ApplyDefaultVariables(); err != nil { - return fmt.Errorf("error applying default variables: %w", err) - } - - if err := osutil.CopyDirWithTemplates(p.pipelineTemplates, srcDir, p.dest, draftConfig, templateWriter); err != nil { - return fmt.Errorf("error copying pipeline files: %w", err) - } - - return nil -} diff --git a/pkg/azurePipelines/azurePipelines_test.go b/pkg/azurePipelines/azurePipelines_test.go deleted file mode 100644 index 798d7f4b..00000000 --- a/pkg/azurePipelines/azurePipelines_test.go +++ /dev/null @@ -1,174 +0,0 @@ -package azurePipelines - -import ( - "fmt" - "github.com/Azure/draft/pkg/fixtures" - "os" - "testing" - - "github.com/Azure/draft/pkg/config" - "github.com/Azure/draft/pkg/templatewriter/writers" - "github.com/Azure/draft/template" - "github.com/stretchr/testify/assert" -) - -func TestCreatePipelines(t *testing.T) { - var pipelineFilePath string - templateWriter := &writers.LocalFSWriter{} - - tests := []struct { - name string - deployType string - shouldError bool - setConfig func(dc *config.DraftConfig) - cleanUp func(tempDir string) - }{ - { - name: "kustomize_default_path", - deployType: "kustomize", - shouldError: false, - }, - { - name: "kustomize_given_path", - deployType: "kustomize", - shouldError: false, - setConfig: func(dc *config.DraftConfig) { - dc.SetVariable("KUSTOMIZEPATH", "kustomize/overlays/production") - }, - }, - { - name: "manifests_default_path", - deployType: "manifests", - shouldError: false, - setConfig: func(dc *config.DraftConfig) { - dc.SetVariable("PIPELINENAME", "testPipeline") - }, - }, - { - name: "manifests_custom_path", - deployType: "manifests", - shouldError: false, - setConfig: func(dc *config.DraftConfig) { - dc.SetVariable("MANIFESTPATH", "test/manifests") - }, - }, - { - name: "invalid", - deployType: "invalid", - shouldError: true, - }, - { - name: "missing_config", - deployType: "kustomize", - shouldError: true, - setConfig: func(dc *config.DraftConfig) { - // removing the last variable from draftConfig - dc.Variables = dc.Variables[:len(dc.Variables)-1] - }, - }, - } - - for _, tt := range tests { - draftConfig := newDraftConfig() - - tempDir, err := os.MkdirTemp(".", "testTempDir") - assert.Nil(t, err) - - if tt.setConfig != nil { - tt.setConfig(draftConfig) - } - - pipelines, err := CreatePipelinesFromEmbedFS(template.AzurePipelines, tempDir) - assert.Nil(t, err) - - err = pipelines.CreatePipelineFiles(tt.deployType, draftConfig, templateWriter) - - pipelineFilePath = fmt.Sprintf("%s/.pipelines/%s", tempDir, aksPipelineTemplateFileName) - if val, ok := draftConfig.FileNameOverrideMap[aksPipelineTemplateFileName]; ok { - pipelineFilePath = fmt.Sprintf("%s/.pipelines/%s", tempDir, val) - } - - if tt.shouldError { - assert.NotNil(t, err) - _, err = os.Stat(pipelineFilePath) - assert.Equal(t, os.IsNotExist(err), true) - } else { - assert.Nil(t, err) - _, err = os.Stat(pipelineFilePath) - assert.Nil(t, err) - - // Read the generated content - generatedContent, err := os.ReadFile(pipelineFilePath) - assert.Nil(t, err) - - // Validate against the fixture file - fixturePath := fmt.Sprintf("../fixtures/pipelines/%s.yaml", tt.deployType) - if _, err := os.Stat(fixturePath); os.IsNotExist(err) { - t.Fatalf("Fixture file does not exist at path: %s", fixturePath) - } - - err = fixtures.ValidateContentAgainstFixture(generatedContent, fixturePath) - assert.Nil(t, err) - } - - err = os.RemoveAll(tempDir) - assert.Nil(t, err) - } -} - -func newDraftConfig() *config.DraftConfig { - return &config.DraftConfig{ - Variables: []*config.BuilderVar{ - { - Name: "PIPELINENAME", - Value: "testPipeline", - }, - { - Name: "BRANCHNAME", - Default: config.BuilderVarDefault{ - Value: "main", - }, - }, - { - Name: "ARMSERVICECONNECTION", - Value: "testServiceConnection", - }, - { - Name: "AZURECONTAINERREGISTRY", - Value: "testACR", - }, - { - Name: "CONTAINERNAME", - Value: "testContainer", - }, - { - Name: "CLUSTERRESOURCEGROUP", - Value: "testRG", - }, - { - Name: "ACRRESOURCEGROUP", - Value: "testACRRG", - }, - { - Name: "CLUSTERNAME", - Value: "testCluster", - }, - { - Name: "KUSTOMIZEPATH", - Default: config.BuilderVarDefault{ - Value: "kustomize/overlays/production", - }, - }, - { - Name: "MANIFESTPATH", - Default: config.BuilderVarDefault{ - Value: "test/manifests", - }, - }, - { - Name: "NAMESPACE", - Value: "testNamespace", - }, - }, - } -} diff --git a/pkg/fixtures/workflows/azurepipelines/kustomize/.pipelines/azure-kubernetes-service.yaml b/pkg/fixtures/workflows/azurepipelines/kustomize/.pipelines/azure-kubernetes-service.yaml new file mode 100644 index 00000000..3ebda476 --- /dev/null +++ b/pkg/fixtures/workflows/azurepipelines/kustomize/.pipelines/azure-kubernetes-service.yaml @@ -0,0 +1,68 @@ +# Azure Kubernetes Service (AKS) pipeline with Kustomize +# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service cluster + +variables: + armServiceConnection: testserviceconnection + azureContainerRegistry: myacr.acr.io + containerName: myapp + acrRg: myrg + clusterRg: myrg + clusterName: testcluster + kustomizePath: ./overlays/production + namespace: default + tag: "$(Build.BuildId)" + vmImageName: "ubuntu-latest" + +trigger: + - main + +name: Build and deploy an app to AKS + +stages: + - stage: BuildAndPush + displayName: Build stage + jobs: + - job: BuildAndPush + displayName: Build and push image + pool: + vmImage: $(vmImageName) + steps: + - task: AzureCLI@2 + displayName: Build and push image to Azure Container Registry + inputs: + azureSubscription: $(armServiceConnection) + scriptType: "bash" + scriptLocation: "inlineScript" + inlineScript: | + az acr build --image $1.azurecr.io/$2:$3 --registry $1 -g $4 . + arguments: "$(azureContainerRegistry) $(containerName) $(tag) $(acrRg)" + + - stage: Deploy + displayName: Deploy stage + dependsOn: BuildAndPush + jobs: + - job: Deploy + displayName: Deploy to AKS using Kustomize + pool: + vmImage: $(vmImageName) + steps: + - task: KubernetesManifest@1 + displayName: Bake Kustomize manifests + inputs: + action: 'bake' + kustomizationPath: $(kustomizePath) + renderType: 'kustomize' + name: 'bake' + + - task: KubernetesManifest@1 + displayName: Deploy baked manifests to Kubernetes cluster + inputs: + action: 'deploy' + connectionType: 'azureResourceManager' + azureSubscriptionConnection: $(armServiceConnection) + azureResourceGroup: $(clusterRg) + kubernetesCluster: $(clusterName) + namespace: $(namespace) + manifests: $(bake.manifestsBundle) + containers: | + $(azureContainerRegistry).azurecr.io/$(containerName):$(tag) diff --git a/pkg/fixtures/workflows/azurepipelines/manifest/.pipelines/azure-kubernetes-service.yaml b/pkg/fixtures/workflows/azurepipelines/manifest/.pipelines/azure-kubernetes-service.yaml new file mode 100644 index 00000000..c4fd7718 --- /dev/null +++ b/pkg/fixtures/workflows/azurepipelines/manifest/.pipelines/azure-kubernetes-service.yaml @@ -0,0 +1,60 @@ +# Azure Kubernetes Service pipeline +# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service cluster + +variables: + armServiceConnection: testserviceconnection + azureContainerRegistry: myacr.acr.io + containerName: myapp + clusterRg: myrg + acrRg: myrg + clusterName: testcluster + manifestPath: ./manifests + namespace: default + tag: "$(Build.BuildId)" + vmImageName: "ubuntu-latest" + +name: Build and deploy an app to AKS + +trigger: + - main + +stages: + - stage: BuildAndPush + displayName: Build stage + jobs: + - job: BuildAndPush + displayName: Build and push image + pool: + vmImage: $(vmImageName) + steps: + - task: AzureCLI@2 + displayName: Build and push image to Azure Container Registry + inputs: + azureSubscription: $(armServiceConnection) + scriptType: "bash" + scriptLocation: "inlineScript" + inlineScript: | + az acr build --image $1.azurecr.io/$2:$3 --registry $1 -g $4 . + arguments: "$(azureContainerRegistry) $(containerName) $(tag) $(acrRg)" + + - stage: Deploy + displayName: Deploy stage + dependsOn: BuildAndPush + jobs: + - job: Deploy + displayName: Deploy to AKS + pool: + vmImage: $(vmImageName) + steps: + - task: KubernetesManifest@1 + displayName: Deploy to Kubernetes cluster + inputs: + action: "deploy" + connectionType: "azureResourceManager" + azureSubscriptionConnection: $(armServiceConnection) + azureResourceGroup: $(clusterRg) + kubernetesCluster: $(clusterName) + manifests: $(manifestPath) + namespace: $(namespace) + containers: | + $(azureContainerRegistry).azurecr.io/$(containerName):$(tag) diff --git a/pkg/handlers/template_test.go b/pkg/handlers/template_test.go index 41a6ea6b..c196cb33 100644 --- a/pkg/handlers/template_test.go +++ b/pkg/handlers/template_test.go @@ -289,6 +289,38 @@ func TestTemplateHandlerValidation(t *testing.T) { "VERSION": "5.5", }, }, + { + name: "valid azpipeline manifest deployment", + templateName: "azure-pipeline-manifest", + fixturesBaseDir: "../fixtures/workflows/azurepipelines/manifest", + version: "0.0.1", + dest: ".", + templateWriter: &writers.FileMapWriter{}, + varMap: map[string]string{ + "ARMSERVICECONNECTION": "testserviceconnection", + "AZURECONTAINERREGISTRY": "myacr.acr.io", + "CONTAINERNAME": "myapp", + "CLUSTERRESOURCEGROUP": "myrg", + "ACRRESOURCEGROUP": "myrg", + "CLUSTERNAME": "testcluster", + }, + }, + { + name: "valid azpipeline kustomize deployment", + templateName: "azure-pipeline-kustomize", + fixturesBaseDir: "../fixtures/workflows/azurepipelines/kustomize", + version: "0.0.1", + dest: ".", + templateWriter: &writers.FileMapWriter{}, + varMap: map[string]string{ + "ARMSERVICECONNECTION": "testserviceconnection", + "AZURECONTAINERREGISTRY": "myacr.acr.io", + "CONTAINERNAME": "myapp", + "CLUSTERRESOURCEGROUP": "myrg", + "ACRRESOURCEGROUP": "myrg", + "CLUSTERNAME": "testcluster", + }, + }, } for _, tt := range tests { diff --git a/template/azurePipelines.go b/template/azurePipelines.go deleted file mode 100644 index 5b35c00a..00000000 --- a/template/azurePipelines.go +++ /dev/null @@ -1,8 +0,0 @@ -package template - -import "embed" - -var ( - //go:embed all:azurePipelines - AzurePipelines embed.FS -) diff --git a/template/azurePipelines/kustomize/.pipelines/azure-kubernetes-service.yaml b/template/azurePipelines/kustomize/.pipelines/azure-kubernetes-service.yaml index f307aaed..a9a912a5 100644 --- a/template/azurePipelines/kustomize/.pipelines/azure-kubernetes-service.yaml +++ b/template/azurePipelines/kustomize/.pipelines/azure-kubernetes-service.yaml @@ -2,21 +2,21 @@ # Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service cluster variables: - armServiceConnection: {{.ARMSERVICECONNECTION}} - azureContainerRegistry: {{.AZURECONTAINERREGISTRY}} - containerName: {{.CONTAINERNAME}} - acrRg: {{.ACRRESOURCEGROUP}} - clusterRg: {{.CLUSTERRESOURCEGROUP}} - clusterName: {{.CLUSTERNAME}} - kustomizePath: {{.KUSTOMIZEPATH}} - namespace: {{.NAMESPACE}} + armServiceConnection: {{ .Config.GetVariableValue "ARMSERVICECONNECTION" }} + azureContainerRegistry: {{ .Config.GetVariableValue "AZURECONTAINERREGISTRY" }} + containerName: {{ .Config.GetVariableValue "CONTAINERNAME" }} + acrRg: {{ .Config.GetVariableValue "ACRRESOURCEGROUP" }} + clusterRg: {{ .Config.GetVariableValue "CLUSTERRESOURCEGROUP" }} + clusterName: {{ .Config.GetVariableValue "CLUSTERNAME" }} + kustomizePath: {{ .Config.GetVariableValue "KUSTOMIZEPATH" }} + namespace: {{ .Config.GetVariableValue "NAMESPACE" }} tag: "$(Build.BuildId)" vmImageName: "ubuntu-latest" trigger: - - {{.BRANCHNAME}} + - {{ .Config.GetVariableValue "BRANCHNAME" }} -name: {{.PIPELINENAME}} +name: {{ .Config.GetVariableValue "PIPELINENAME" }} {{` stages: - stage: BuildAndPush diff --git a/template/azurePipelines/kustomize/draft.yaml b/template/azurePipelines/kustomize/draft.yaml index 3c81762e..205ea36d 100644 --- a/template/azurePipelines/kustomize/draft.yaml +++ b/template/azurePipelines/kustomize/draft.yaml @@ -1,5 +1,7 @@ templateName: "azure-pipeline-kustomize" description: "This template is used to create an Azure Pipeline for deploying an app to AKS using Kustomize" +versions: "0.0.1" +defaultVersion: "0.0.1" type: "workflow" variables: - name: "PIPELINENAME" @@ -8,36 +10,44 @@ variables: default: value: "Build and deploy an app to AKS" description: "the name of the azure pipeline" + versions: ">=0.0.1" - name: "BRANCHNAME" type: "string" kind: "repositoryBranch" default: value: "main" description: "the branch to trigger the pipeline" + versions: ">=0.0.1" - name: "ARMSERVICECONNECTION" type: "string" kind: "azureServiceConnection" description: "the name of the Azure Resource Manager service connection" + versions: ">=0.0.1" - name: "AZURECONTAINERREGISTRY" type: "string" kind: "azureContainerRegistry" description: "the name of the Azure Container Registry" + versions: ">=0.0.1" - name: "CONTAINERNAME" type: "string" kind: "containerImageName" description: "the container image name" + versions: ">=0.0.1" - name: "CLUSTERRESOURCEGROUP" type: "string" kind: "azureResourceGroup" description: "the AKS cluster resource group" + versions: ">=0.0.1" - name: "ACRRESOURCEGROUP" type: "string" kind: "azureResourceGroup" description: "the ACR resource group" + versions: ">=0.0.1" - name: "CLUSTERNAME" type: "string" kind: "azureManagedCluster" description: "the AKS cluster name" + versions: ">=0.0.1" - name: "KUSTOMIZEPATH" type: "string" kind: "dirPath" @@ -45,9 +55,11 @@ variables: disablePrompt: true value: "./overlays/production" # keeping this as default since draft generates the manifests in the overlays/production directory description: "the path to the Kustomize directory" + versions: ">=0.0.1" - name: "NAMESPACE" type: "string" kind: "kubernetesNamespace" default: value: "default" description: "the Kubernetes namespace" + versions: ">=0.0.1" diff --git a/template/azurePipelines/manifests/.pipelines/azure-kubernetes-service.yaml b/template/azurePipelines/manifests/.pipelines/azure-kubernetes-service.yaml index 10ef1d38..1f963d1c 100644 --- a/template/azurePipelines/manifests/.pipelines/azure-kubernetes-service.yaml +++ b/template/azurePipelines/manifests/.pipelines/azure-kubernetes-service.yaml @@ -2,21 +2,21 @@ # Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service cluster variables: - armServiceConnection: {{.ARMSERVICECONNECTION}} - azureContainerRegistry: {{.AZURECONTAINERREGISTRY}} - containerName: {{.CONTAINERNAME}} - clusterRg: {{.CLUSTERRESOURCEGROUP}} - acrRg: {{.ACRRESOURCEGROUP}} - clusterName: {{.CLUSTERNAME}} - manifestPath: {{.MANIFESTPATH}} - namespace: {{.NAMESPACE}} + armServiceConnection: {{ .Config.GetVariableValue "ARMSERVICECONNECTION" }} + azureContainerRegistry: {{ .Config.GetVariableValue "AZURECONTAINERREGISTRY" }} + containerName: {{ .Config.GetVariableValue "CONTAINERNAME" }} + clusterRg: {{ .Config.GetVariableValue "CLUSTERRESOURCEGROUP" }} + acrRg: {{ .Config.GetVariableValue "ACRRESOURCEGROUP" }} + clusterName: {{ .Config.GetVariableValue "CLUSTERNAME" }} + manifestPath: {{ .Config.GetVariableValue "MANIFESTPATH" }} + namespace: {{ .Config.GetVariableValue "NAMESPACE" }} tag: "$(Build.BuildId)" vmImageName: "ubuntu-latest" -name: {{.PIPELINENAME}} +name: {{ .Config.GetVariableValue "PIPELINENAME" }} trigger: - - {{.BRANCHNAME}} + - {{ .Config.GetVariableValue "BRANCHNAME" }} {{` stages: - stage: BuildAndPush diff --git a/template/azurePipelines/manifests/draft.yaml b/template/azurePipelines/manifests/draft.yaml index b124e0bb..755c0e51 100644 --- a/template/azurePipelines/manifests/draft.yaml +++ b/template/azurePipelines/manifests/draft.yaml @@ -1,5 +1,7 @@ templateName: "azure-pipeline-manifest" description: "Azure Pipeline for deploying a containerized application to AKS using kubernetes manifests" +versions: "0.0.1" +defaultVersion: "0.0.1" type: "workflow" variables: - name: "PIPELINENAME" @@ -8,36 +10,44 @@ variables: default: value: "Build and deploy an app to AKS" description: "the name of the azure pipeline" + versions: ">=0.0.1" - name: "BRANCHNAME" type: "string" kind: "repositoryBranch" default: value: "main" description: "the branch to trigger the pipeline" + versions: ">=0.0.1" - name: "ARMSERVICECONNECTION" type: "string" kind: "azureServiceConnection" description: "the name of the Azure Resource Manager service connection" + versions: ">=0.0.1" - name: "AZURECONTAINERREGISTRY" type: "string" kind: "azureContainerRegistry" description: "the name of the Azure Container Registry" + versions: ">=0.0.1" - name: "CONTAINERNAME" type: "string" kind: "containerImageName" description: "the container image name" + versions: ">=0.0.1" - name: "CLUSTERRESOURCEGROUP" type: "string" kind: "azureResourceGroup" description: "the AKS cluster resource group" + versions: ">=0.0.1" - name: "ACRRESOURCEGROUP" type: "string" kind: "azureResourceGroup" description: "the ACR resource group" + versions: ">=0.0.1" - name: "CLUSTERNAME" type: "string" kind: "azureManagedCluster" description: "the AKS cluster name" + versions: ">=0.0.1" - name: "MANIFESTPATH" type: "string" kind: "dirPath" @@ -45,9 +55,11 @@ variables: disablePrompt: true value: "./manifests" description: "the path to the Kubernetes deployment manifest" + versions: ">=0.0.1" - name: "NAMESPACE" type: "string" kind: "kubernetesNamespace" default: value: "default" description: "the Kubernetes namespace" + versions: ">=0.0.1"