Today's DevOps Automation Diagram

#shipit and #failfast: I want to share and discuss the DevOps Automation Diagram for continuous deployment. Via open source and this blog, we can elevate the state of our software engineering and service design!

Quotes and Motivation

  • “Perfect is the enemy of good.” –Volare (paraphrased)
  • “Fail fast.” –Ward Cunningham (paraphrased as #failfast)
  • “I hope to replace myself with a tiny shell script one day.” –Unknown Internet meme?

Ship it and fail fast: I would love to get feedback! I also wonder if anyone can improve my quote attributions.

Here is today’s snapshot of the entire DevOps Automation Diagram source and image. I’ve omitted many possible connections for the sake of showing the optimal automated progression from a developer’s mind to the production stack. I’ve refactored terminology to help inform systems and actions, but you can see there are many moving pieces to enable modern day software development life cycle automation, some of which are not easily identified off the shelf.

You can “view the SVG image” in a new browser window or tab and scale it to your liking and then cut and paste text from it.


My original release was 2015-03-11 (source below), but today’s update adds detail, removes many crossed lines for simple visual flow parsing, and is organized vertically.

DevOps Automation Diagram - 2015-03-17

Source code: devops_automation.pu @startuml title DevOps Automation (2015-03-11) by Mark Lavi state Development { Development: language Development: editor Development: code tools Development: virtual environment Development: runtime Development: frameworks Development: libraries BDD --> UnitTest BDD: featureDescription Code: featureDescription Code: testCases Code: testData Code: functionality Code: configurationData Code: deployability Code: monitors Code: metrics Code: logs Code -> UnitTest : OnSave Code --> BDD Code --> LocalBuild Code --> LocalRepo : commit UnitTest --> LocalRepo UnitTest: testCases UnitTest: testData LocalBuild --> LocalStack LocalBuild: localArtifact LocalBuild: localTestJobs LocalBuild: localBuildAutomationSystemContainer? LocalBuild -> ArtifactRepository : manual process\nDesk Build\ncandidate LocalRepo -> ReviewSystem LocalRepo -> CodeRepository : push LocalStack: LocalDeployTest? LocalStack: LocalIntegrationTest? } state CodeRepository { CodeRepository : branch CodeRepository : hash CodeRepository : tag preCommitHook -> BuildAutomationSystem preCommitHook: see Build,TestJobs postCommitHook -> BuildAutomationSystem postCommitHook: see Build,TestJobs webHook: see Build,TestJobs } state ReviewSystem { ReviewSystem: master or all branches? ReviewSystem -> BuildAutomationSystem: candidate ReviewSystem -> CodeRepository : +N = passed ReviewSystem: +1 BuildJob ReviewSystem: +1 TestJob ReviewSystem: +1 DeployJob ReviewSystem: +1 HumanReview ReviewSystem: +1 PeriodicTestJobs } state BuildAutomationSystem { BuildAutomationSystem: perBranch BuildAutomationSystem: perHash BuildAutomationSystem: perTag [*] -> BuildScheduler [*] --> BuildJobs: ad-hoc (manual) [*] --> DeployJobs: promote BuildJobs -> TestJobs BuildJobs -> ArtifactRepository: Candidate BuildJobs: localArtifact TestJobs --> ConfigurationSystem : updateManifest TestJobs -> ArtifactRepository: Official TestJobs -> TestAutomationSystem TestJobs: PeriodicTests TestJobs: BasicCodeAcceptanceTests DeployJobs -up-> DeploySystem DeployJobs: artifact DeployJobs: manifest DeployJobs: stack DeployJobs -> ConfigurationSystem: updateManifest BuildScheduler --> TestJobs BuildScheduler: e.g. Nightly } state TestAutomationSystem { TestAutomationSystem -> DeployJobs TestAutomationSystem: Simulator TestAutomationSystem: FeatureIntegrationTesting TestAutomationSystem: FullSuiteTesting TestAutomationSystem: LoadTesting TestAutomationSystem: RegressionTesting TestAutomationSystem: SoakTesting TestAutomationSystem -> ConfigurationSystem: updateManifest } state ArtifactRepository { ArtifactRepository: candidate ArtifactRepository: official } state ConfigurationSystem { ConfigurationSystem: manifest ConfigurationSystem: deployability ConfigurationSystem: configurationData } state Monitors { Monitors: SLA Monitors -> Metrics Monitors -> Logs } state Logs { Logs -> Metrics Logs -> Monitors } state Metrics { Metrics: SLA } state AuthenticationSystem { AuthenticationSystem: LDAP, SAML, etc. } state DeploySystem { DeploySystem -> ConfigurationSystem DeploySystem: entireStack DeploySystem: byProfileOnStack DeploySystem: byRoleOnStack DeploySystem: read, updateManifest DeploySystem: bill of materials (BoM) DeploySystem: readConfigurationData Provision -> Stack Provision: profile/role@stack Provision: applyManifest Upgrade -> Stack Upgrade: role@stack Upgrade: applyManifest Canary -> Stack Canary: % existing role@stack Canary: applyManifest } state Stack { Stack: name/environment\n(e.g. Feature, Team, Release, dev/qa/stage/prod) [*] --> node [*] -> ProviderInfrastructure ProviderInfrastructure: load balancer ProviderInfrastructure: DNS ProviderInfrastructure: monitor ProviderInfrastructure: scheduler, autoscaler ProviderInfrastructure --> Monitors ProviderInfrastructure --> node node: provider node: profile node: role node: monitor node -> Monitors node -> Logs node -> Metrics } @enduml

I will put this under revision control in the Infrastructure as Code project I’m undertaking. I do not believe authored hyperlinks export to SVG yet, perhaps that will be my first request for PlantUML.