So now secret that I really am a big fan of leveraging DevOps to extend your productivity. I’ve had the privilege of working on smaller teams that have accomplished far more than anyone could have predicted. And honestly the key principle that is always at the center of those efforts is treat everything as a repeatable activity.
Now, if you look at the idea of a micro service application, at it’s core its several different services that are independently deployable, and at it’s core that statement can cause a lot of excessive technical debt from a DevOps perspective.
For example, if I encapsulate all logic into separate python modules, I need a pipeline for each module, and those pipelines look almost identical.
Or if I’m deploying docker containers, my pipelines for each service likely look almost identical. See the pattern here?
Now imagine, you do this and build a robust application with 20-30 services running in containers. In the above, that means if I have to change their deployment pipeline, by adding say a new environment, I have to update between 20 – 30 pipelines, with the same changes.
Thankfully, ADO has an answer to this, in the use of templates. The idea here is we create a repo within ADO for our deployment templates, which contain the majority of the logic to deploy our services and then call those templates in each service.
For this example, I’ve built a template that I use to deploy a docker container and push it to a container registry, which is a pretty common practice.
The logic to implement it is fairly simple and looks like the following:
resources:
repositories:
- repository: templates
type: git
name: "TestProject/templates"
Using the above code will enable your pipeline to pull from a separate git repo, and then you can use the following to code to create a sample template:
parameters:
- name: imageName
type: string
- name: containerRegistryName
type: string
- name: repositoryName
type: string
- name: containerRegistryConnection
type: string
- name: tag
type: string
steps:
- task: Bash@3
inputs:
targetType: 'inline'
script: 'docker build -t="${{ parameters.containerRegistryName }}/${{ parameters.imageName }}:${{ parameters.tag }}" -t="${{ parameters.containerRegistryName }}/${{ parameters.imageName }}:latest" -f="./Dockerfile" .'
workingDirectory: '$(Agent.BuildDirectory)/container'
displayName: "Building docker container"
- task: Docker@2
inputs:
containerRegistry: '${{ parameters.containerRegistryConnection }}'
repository: '${{ parameters.imageName }}'
command: 'push'
tags: |
$(tag)
latest
displayName: "Pushing container to registry"
Finally, you can go to any yaml pipeline in your project and use the following to reference the template:
steps:
- template: /containers/container.yml@templates
parameters:
imageName: $(imageName)
containerRegistryName: $(containerRegistry)
repositoryName: $(repositoryName)
containerRegistryConnection: 'AG-ASCII-GSMP-boxaimarketopsacr'
tag: $(tag)
Top comments (0)