DevOps. It's no longer a random combination of letters; it's a cultural shift in development, widely regarded in the industry as the best way to go about technology changes and software delivery!
What is DevOps?
DevOps combines words development and operations (but you probably already knew that if you're reading this post).
The point of DevOps is to speed up the development and deployment process and, in turn, the reliability of software.
The difference between DevOps and traditional software development is pace, quality and automation! DevOps teams get stuff done faster, helping organisations achieve the quickest (and most efficient) way to improve security, increase the time to market, complete more frequent deployments and regular testing.
DevOps teams are often said to be more security conscious too.
The state of DevOps report 2019 tells us that 'Organisations at the highest levels of DevOps evolution also have fully integrated security practices. The sharing and cross-team collaboration that DevOps practices promote lay the groundwork for expanding those practices — and more importantly, the mindset — to more teams and functions across the enterprise. And that includes security' (The State of DevOps Report, 2019)
DevOps and agile teams.
Agile and DevOps practices can work in tandem (and even complement each other), so an Agile practitioner's skills are valuable within the DevOps community!
Atlassian (the brains behind the popular Kanban tool, Trello) says, 'Many people think agile means scrum and DevOps means continuous delivery. This oversimplification creates unnecessary tension between agile and DevOps, so you may be surprised to find that they are best friends'
Although much of DevOps engineering can be about automation and structure, not everything always goes to plan. Outages, security issues and performance issues are just some of the problems DevOps engineers may encounter. It helps if you're used to an agile way of working, where it's normal to constantly react to rapid shifts in project requirements and ad-hoc requests.
DevOps at Cogworks.
Our DevOps team is a team of Agile software developers who happen to be DevOps engineers too.
Before the days of DevOps, we found ourselves in a time-consuming, predominantly manual development process with an eye-watering amount of extensive technical documentation to absorb.
Thankfully, the heavy focus on automation and standardisation in DevOps engineering allows us to quickly adapt to a new project and introduce new team members, thanks to the short, simple documentation.
We use DevOps techniques to
- Quickly deliver software.
- Standardise the building, testing, monitoring and releasing processes.
- Reduce manual building and releasing steps.
-Improve data security.
Today (and for the past two years), our teams use a combination of
- Azure DevOps for client software delivery, infrastructure and metrics.
- GitHub Actions for internal projects and code quality.
It's important to find the best platform(s) to help us standardise our processes, and we're glad to say we've found them (for now; we are agile, after all).
Here are a few essentials surrounding the technical practice, cloud adoption, organisational practices and culture within a team.
Technical practices essentials.
Sharpen up your technical practices in delivery and deployment. How?
- Automate the recurring stuff. If something is recurring, automate it, it'll give your team more time for the "real" work instead of repeating the same steps for the 70th time.
Top tip: If you can automate end-to-end testing, such as visual regression testing, to improve your system is behaving as expected, we've put together a guide on that here!
- Keep passwords, connection strings and licence files safe and secure. Do not keep any credentials in your code repository as it gives potential access to your resources to any person with the right to read code.
- Use variable groups for everything. Variable groups store protected resources or "secrets" like variables, configurations, and files that you can link to a dedicated variable group in a dedicated deployment stage such as YAML, release pipeline, or build pipeline.
- It's good practice to use variable groups to improve security as you can store passwords to improve flexibility, readability, and security within your dedicated environment.
- Cache getting dependencies. When you're not changing the version of your dependencies (these may be NuGet or Npm, for example), why not use the cached version instead of restoring it; you'll save you a ton of time if you're using a lot of external libraries!
- Use tests reports. Using test reports will give you an overview of existing tests that are working or failing. If you can, attach screenshots and videos to any failed tests to help get to the bottom of the issue in your teams. Especially handy for your teams to view if you're in the middle of a deployment push.
- Automate package releases. Automate releasing internal or public packages to internal and external clients. Check out our tutorial on how to publish NuGet packages with GitHub. Automating your package release process helps to collaborate and work together on packages in a standardised way. Perfect for Agile teams.
Cloud Adoption essentials.
"The value and the function of DevOps, and the value and the function of cloud computing, are completely synergistic" (David Linthicum, Chief Cloud Strategy Officer, Techbeacon)
Here are a few tips on how to maximise efficiency when adopting the cloud into your DevOps teams:
- Automate managing infrastructure as part of your deployment process. For a quick way to manage your infrastructure, Arm Templates, Azure Bicep, or Terraform to set up and modify your infrastructure as part of your release process! It saves your time tweaking infrastructure on cloud provider websites.
- Prioritise code quality and reviews. There are some great tools (free and commercial) like SonarQube, SonarSource and NDepend, which integrate with source control systems, like, Github, CI/CD Pipeline or Azure DevOps! More on how to perfect your code reviews in our previous post.
- On-demand environments can help you to test specific features without disrupting development activities as a whole! Set up on-demand environments in your development process for maximum efficiency in every step of your workflow. There's a great how-to guide to adding this to your approach here.
- Utilise Google lighthouse. Check out our blog on how to leverage your performance testing skills to boost website performance? If you're a user of the Umbraco CMS, our CTO's talk on how to get peak performance using automated techniques.
Organisational practices essentials.
It helps to approach DevOps holistically. When introducing a new practice, it can be beneficial to 'understand the constraints in your current software delivery process with an eye to your short- and long-term outcomes in measurable terms, The State of DevOps report (2019).
In other words, ditch the long list of rigid plans and work with a robust set of goals that can give you scalable and flexible solutions. Here's
- QA the whole release. Testing specific tasks doesn't guarantee everything is going to work together. Any new feature might affect another one or other preexisting features, so the final step right before live deploying should be QA testing the whole release in a QA environment (the environment right before making a release live in your pipeline).
- Embrace continuous integration and continuous delivery every step of the way. Without continuous integration and delivery, there is no DevOps. Approach DevOps with regular standups, huddles, estimations sessions, short and effective meetings and timeboxing techniques.
Culture and mindset essentials.
- Cross-collaboration is key to DevOps success. Ensuring that as many tools as possible are cross-functional between teams will help break down silos between development, design, and strategy teams!
- Reflect with retrospectives. In software development, what do we do when things don't go to plan? We have a retro. What do we do when things DO go to plan? Retro! Retrospectives are a vital part of the development process and even better when you can involve clients. Check out our reasons to take part in client retrospectives.
Q&A with Cogworks CTO
1. Why did you decide to stick with Azure DevOps for CI/CID process after trying out TeamCity and Octopus Deploy?
We were using a legacy version of TeamCity, and when we started to think about upgrading, we also investigated the comparison platforms.
It turned out that if we're using Github as our source control and CI platform combined with our Microsoft Azure as our Cloud Provider - it started to integrate more and more with its Azure DevOps tool...so we gave it a try.
Azure DevOps was the most intuitive, flexible, and close to our technology stack, giving us the ability to quickly connect to our repositories and cloud resources, plus many automation features within Azure Pipelines.
2. How is CI/CD in practices like DevOps different from a waterfall approach?
Waterfall from the above seems like something done in the 70s or 80s or by single-person teams. Within modern teams and projects where multiple people are working on numerous application areas, living without CI/CD practises is something that makes collaboration completely impossible.
CI/CD gives us confirmation and insurance that whatever changes were made by the team, there is a central place responsible for tests, builds, and package delivery.
Additionally, we can automatically align the processes with various providers, such as hosting destinations.
Then we have security. In DevOps, the central platform is the only place where sensitive information is stored; we no longer need to worry about secrets, keys because they're all "injected" into our application via the automated processes configured on the CI/CD platform!
We are all human, and we all make mistakes.
If we learn from them, apply fixes for them in a tool like Azure DevOps, we will avoid replicating them, save a ton of time doing tedious manual work and focus on what matters the most: delivering value through the code we're producing!
If you're wondering what steps you can take in your DevOps teams, feel free to reach out to us in the comments below. We'd love to help with any questions on setting up or configuring your Continuous Integration (CI) and Continuous Deployment (CD) architecture and workflow using Azure Pipelines and Azure DevOps!
For more extensive consultancy, get in touch with our DevOps consultants to find out how you can maximise your resources by creating efficient automated processes and architecture. We'll assign one of our developers who will work solely with you to produce the best DevOps solutions.
Thank you to our DevOps blog contributors!
Marcin Zajkowski - Cogworks CTO
Adrian Ochmann - Cogworks developer