diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ef5892ffa..f80ddebf7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,20 +1,84 @@ -# Starter pipeline -# Start with a minimal pipeline that you can customize to build and deploy your code. -# Add steps that build, run tests, deploy, and more: -# https://aka.ms/yaml +# Deploy to Azure Kubernetes Service +# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service +# https://docs.microsoft.com/azure/devops/pipelines/languages/docker trigger: - master -pool: - vmImage: 'ubuntu-latest' +resources: +- repo: self -steps: -- script: echo Hello, world! - displayName: 'Run a one-line script' +variables: + + # Container registry service connection established during pipeline creation + dockerRegistryServiceConnection: '{{ containerRegistryConnection.Id }}' + imageRepository: '{{#toAlphaNumericString imageRepository 50}}{{/toAlphaNumericString}}' + containerRegistry: '{{ containerRegistryConnection.Authorization.Parameters.loginServer }}' + dockerfilePath: '**/Dockerfile' + tag: '$(Build.BuildId)' + + # Kubernetes Namespace + k8sNamespace: '{{ k8sResource.Namespace }}' + imagePullSecret: '{{#toAlphaNumericString containerRegistryConnection.Name 50}}{{/toAlphaNumericString}}{{#shortGuid}}{{/shortGuid}}-auth' + + # Agent VM image name + vmImageName: 'ubuntu-latest' + +stages: +- stage: Build + displayName: Build stage + jobs: + - job: Build + displayName: Build + pool: + vmImage: $(vmImageName) + steps: + - task: Docker@2 + displayName: Build and push an image to container registry + inputs: + command: buildAndPush + repository: $(imageRepository) + dockerfile: $(dockerfilePath) + containerRegistry: $(dockerRegistryServiceConnection) + tags: | + $(tag) + + - task: PublishPipelineArtifact@0 + inputs: + artifactName: 'manifests' + targetPath: 'manifests' + +- stage: Deploy + displayName: Deploy stage + dependsOn: Build + jobs: + - deployment: Deploy + displayName: Deploy + pool: + vmImage: $(vmImageName) + environment: '{{ k8sResource.EnvironmentReference.Name }}.{{ k8sResource.Name }}' + strategy: + runOnce: + deploy: + steps: + - task: KubernetesManifest@0 + displayName: Create imagePullSecret + inputs: + action: createSecret + secretName: $(imagePullSecret) + namespace: $(k8sNamespace) + dockerRegistryEndpoint: $(dockerRegistryServiceConnection) + + - task: KubernetesManifest@0 + displayName: Deploy to Kubernetes cluster + inputs: + action: deploy + namespace: $(k8sNamespace) + manifests: | + $(System.ArtifactsDirectory)/manifests/deployment.yml + $(System.ArtifactsDirectory)/manifests/service.yml + imagePullSecrets: | + $(imagePullSecret) + containers: | + $(containerRegistry)/$(imageRepository):$(tag) -- script: | - echo Add other tasks to build, test, and deploy your project. - echo See https://aka.ms/yaml - displayName: 'Run a multi-line script' -- task: PublishBuildArtifacts@1