Many large firms run into trouble when trying to standardise their development and operational-support processes. They follow ‘DevOps’ guidelines, usually invoking some tepid form of ‘Agile’. When the magic elixir of perfection remains elusive for 2 months, the project management team declares failure and resorts to Waterfall, guaranteeing pain and agony for the company over a protracted period of time, until some brave soul in the future attempts to resurrect the ‘failed’ idea of Agility and DevOps. Thus, the cycle of immaturity creates its own life-force.
DevOps is not a product, a brand, or even a certified method. There is no magic involved.
DevOps is a philosophy of how to create code and build software applications. It is thus elastic, mutable and prone to misuse and misunderstanding. Quite often, DevOps is simply not understood that well by firms who are supposedly engaged in DevOps, and neither is it managed properly. Not understanding something is unlikely to lead to success.
So, what is DevOps?
At its core as a philosophy, DevOps is trying to achieve the following:
- Improvement of software quality, reduction of errors and poor deployments
- Deploying metrics to measure quality, functionality and usability
- Ensuring that Production remains ‘static’, meaning you will not touch production until all code is tested and pass. Everything flows through development.
- Reducing time to deploy new functionality
- Eradicating the silos of the development lifecycle namely, development, QA, deployment and operations by making the environments similar
- Stopping the deployment of new versions over a weekend and move into a continuous delivery cycle measured in days or weeks
- Responding more quickly to business requirements and introduce a ‘fast failure’ development culture which feeds into learning and building quality into software development.
These 7 points are the essential aspects of the DevOps philosophy.
The goal of DevOps is to remove the inefficiencies that exist throughout the development, deployment, and operations pipeline, while promoting higher quality of operational code. Some of the traditional ways of developing, deploying, and operating don’t hold up to the constant change that modern software systems undergo.
If we accept these main tenets, then a major aspect of the DevOps philosophy is culture and related to culture, an organisation built to provide iterative-Agile premised development. For many firms these 2 issues are problematic, involving ‘organisational-change-management’ or OCM. It is likely that without OCM and a good appreciation of Agile processes (there are 5 core processes within an Agile environment including engineering, organisation, cultural, tooling and operational support), DevOps will fail.
On the upside DevOps provides a better way to look at the development, deployment, and operations pipeline, through promoting a culture of collaboration. A collaborative culture is empowered through the automation of the key aspects of building software. Along with this automation, we also employ metrics to measure quality, successful deployments and to learn from failure.
DevOps has 3 main areas which form both the collaborative team, and the use of automation.
Development | Continuous Integration or CI | Jenkins |
Delivery of code | Continuous Delivery or CD | Jenkins for eg |
Operational Management | Infrastructure as Code or IAC | Chef, Terraform, Ansible |
A simple example of Continuous Integration or CI:
- Imagine I am deploying an application written in Python used by the sales team.
- I can use Jenkins to set up a code pipeline for a specific application I am building in Python
- I install my code, with dependencies in pip, a Python package manager, and then it runs all of the tests.
- If the code is good and ‘passed’ Jenkins will create an ‘artifact’. An artifact is your code compiled into one location.
- Imagine that I now add a simple coding change, which adds a function that returns a string. I make this change and commit it with Git and push it to GitHub.
- Jenkins picks up this change automatically since it is set to pull Git and look for changes every 60 seconds.
- If I change this string again and make an error in the code for whatever reason, Jenkins will flag this as a failure and will notify the developer responsible or the team at large.
- Developers and the team are notified via email, HipChat, Slack, etc.
- I can now fix that error and have Jenkins run through the process again. Once fixed the code is committed to the CI central repository, ready for the CD process.
Continuous Delivery or CD:
CD means that we can ‘push a button’ and deploy code that has passed through the CI process. My Python code has passed, and all bugs are now fixed in a continuous cycle as given above. Now I want to deliver my code into the central repository for deployment.
- Within Jenkins we have a separate project for our deployment.
- The CD automation tool should pick up the ‘artifact’ that the CI server created and use that in the deployment process.
- When we click on the Build button, we are presented with some options, including the environment we want to send it to and the version of the build we want to send.
- Once we select the version we want to send and click Build, it is going to deliver that to that environment.
- The artefact is now placed into the CD repository and delivered.
- By using the same artifact throughout the different stages, you reduce the potential for problems caused by building your app multiple times throughout the pipeline.
- Jenkins usually integrates with Github as a source code repo
Once the software is delivered, it will be operationalized and used within the infrastructure by a tool such as Chef. Chef is a best of breed code repository which contains all the source code, which entails versioning and close control. This allows collaboration and rollbacks to be maintained easier and more quickly. Chef is essentially the configuration automation, deploying the application stack to the targeted server estate.
Operational Runbooks
A main failure of DevOps is the lack of appreciation of the complexity of Operational Management, who will operate and manage the systems including networking, security, patching, application logic issues, first- and second-line support (developers will only do support for a limited time in reality), and the related costs involved (Ops will be 5x more expensive than Dev).
Culture and Tooling
DevOps is the combination of a cultural change with automation. It is a compressed lifecycle of development which attempts to professionalize and enhance software development quality. This is what makes DevOps hard. It is as much a philosophy of being a professional, as it is a concrete path to enlightened engineering. The benefits of DevOps are many, but the failure rate with DevOps is quite high.
The main reasons why DevOps will fail are the following:
- Skill base – you need to understand OOAD software principles and best practices in coding.
- No training on the automation tools such as Jenkins or Chef.
- You will need to know Python and Ruby (or the code base of choice eg Java).
- DevOps is good for Cloud native applications, but maybe not necessary for all projects. Make sure you need DevOps and that it can help you with your projects.
- Project Management and Change Management skills are lacking or in most cases non-existent.
- Agile or SDLC methods still need to resolve business requirements and this necessitates complete architectural, logical and code documentation.
- Culture. Many firms have silos and the people in those silos do not want to lose power, control and relevancy.
==END