@antweiss
Escaping the
Jungle
Or Migrating to Cloud-
Native CI/CD
Anton Weiss, Otomato Software
@antweiss, @otomato_sw
https://otomato.io
https://devopstrain.pro
@antweiss
Jungle
@antweiss
Jungle
@antweiss
Jungle
@antweiss
The Adventure Begins!
@antweiss
The Adventure Begins!
● Motivation!
@antweiss
The Adventure Begins!
● Motivation!
● Autonomy!
@antweiss
The Adventure Begins!
● Motivation!
● Autonomy!
● Inherent Agility!
@antweiss
The Adventure Begins!
● Motivation!
● Autonomy!
● Inherent Agility!
● Success!
@antweiss
The Adventure Begins!
● Motivation!
● Autonomy!
● Inherent Agility!
● Success!
● Explosive Growth!
@antweiss
The Adventure Begins!
● Motivation!
● Autonomy!
● Inherent Agility!
● Success!
● Explosive Growth!
● Everything Happens So Fast!
@antweiss
Welcome to the Jungle!
- All the Languages
- All the Frameworks
- All the DataBases
- All the Message Queues
- Dozens of Cloud Services
- 100s of CI Jobs
- Technical Debt All Around
@antweiss
Jungle Reality
● (In)Decision Waste
@antweiss
Jungle Reality
● (In)Decision Waste
● Integration Pains
@antweiss
Jungle Reality
● (In)Decision Waste
● Integration Pains
● Onboarding is Hard
@antweiss
Jungle Reality
● (In)Decision Waste
● Integration Pains
● Onboarding is Hard
● No common language
@antweiss
The Hard Choices:
@antweiss
The Hard Choices:
Quality
Supportability
Clarity
@antweiss
The Hard Choices:
Velocity
Autonomy
Creativity
Quality
Supportability
Clarity
@antweiss
The Golden Path
Charity Majors: Software Sprawl and the Golden Path@mipsytipsy
@antweiss
The Golden Path
How to:
● Build
● Test
● Package
● Version
● Configure
● Deploy
● Log
● Instrument
● Monitor
● Provision
● Upgrade
● Patches
● Security Fixes
Charity Majors: Software Sprawl and the Golden Path
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
Build: Maven vs. Gradle, Npm vs. Yarn, Cmake vs. Conan..
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
Build: Maven vs. Gradle, Npm vs. Yarn, Cmake vs. Conan..
Packaging: Jars, modules, libs? Docker? Helm?
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
Build: Maven vs. Gradle, Npm vs. Yarn, Cmake vs. Conan..
Packaging: Jars, modules, libs? Docker? Helm?
Binary Repo: Dockerhub? Npm.js? Artifactory? Nexus?
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
Build: Maven vs. Gradle, Npm vs. Yarn, Cmake vs. Conan..
Packaging: Jars, modules, libs? Docker? Helm?
Binary Repo: Dockerhub? Npm.js? Artifactory? Nexus?
CI/CD: Jenkins Pipelines? GitLab CI? Codefresh? Github
Actions?
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
Build: Maven vs. Gradle, Npm vs. Yarn, Cmake vs. Conan..
Packaging: Jars, modules, libs? Docker? Helm?
Binary Repo: Dockerhub? Npm.js? Artifactory? Nexus?
CI/CD: Jenkins Pipelines? GitLab CI? Codefresh? Github
Actions?
Platform: Kubernetes? Lambda? Fargate/Cloud Run?
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
Build: Maven vs. Gradle, Npm vs. Yarn, Cmake vs. Conan..
Packaging: Jars, modules, libs? Docker? Helm?
Binary Repo: Dockerhub? Npm.js? Artifactory? Nexus?
CI/CD: Jenkins Pipelines? GitLab CI? Codefresh? Github
Actions?
Platform: Kubernetes? Lambda? Fargate/Cloud Run?
Configuration/Secrets: ?
@antweiss
The Delivery Toolkit
SCM: Github? Gitlab? BitBucket?
Build: Maven vs. Gradle, Npm vs. Yarn, Cmake vs. Conan..
Packaging: Jars, modules, libs? Docker? Helm?
Binary Repo: Dockerhub? Npm.js? Artifactory? Nexus?
CI/CD: Jenkins Pipelines? GitLab CI? Codefresh? Github
Actions?
Platform: Kubernetes? Lambda? Fargate/Cloud Run?
Configuration/Secrets: ?
Service Mesh: ?
@antweiss
The Pipeline
@antweiss
Cloud-Native CI/CD???
?
@antweiss
Cloud-Native CI/CD
● Integrated with the Platform (k8s)
@antweiss
Cloud-Native CI/CD
● Integrated with the Platform (k8s)
● Dynamic Agents and Environments
@antweiss
Cloud-Native CI/CD
● Integrated with the Platform (k8s)
● Dynamic Agents and Environments
● Decouple Delivery from Release
@antweiss
Standard Pipeline API
Pipeline
Agent
Definition
Flow Definition
Model
Definition
Shared Library
@antweiss
Jenkinsfile
In Jenkinsfile:
@Library('our-lib') _
def svcName= currentBuild.rawBuild.project.parent.displayName
def tag = "${BRANCH_NAME}${BUILD_NUMBER}"
def pod = libraryResource ‘io/otomato/data-agent.yaml'
def d = new io.otomato.data()
timestamps {
dataSvcPipeline(d, pod, svcName, tag)
}
@antweiss
Jenkinsfile
In Jenkinsfile:
@Library('our-lib') _
def svcName= currentBuild.rawBuild.project.parent.displayName
def tag = "${BRANCH_NAME}${BUILD_NUMBER}"
def pod = libraryResource ‘io/otomato/data-agent.yaml' <-Agent
def d = new io.otomato.data()
timestamps {
dataSvcPipeline(d, pod, svcName, tag)
}
@antweiss
Jenkinsfile
In Jenkinsfile:
@Library('our-lib') _
def svcName= currentBuild.rawBuild.project.parent.displayName
def tag = "${BRANCH_NAME}${BUILD_NUMBER}"
def pod = libraryResource ‘io/otomato/data-agent.yaml' <-Agent
def d = new io.otomato.data() <-Model
timestamps {
dataSvcPipeline(d, pod, svcName, tag)
}
@antweiss
Jenkinsfile
In Jenkinsfile:
@Library('our-lib') _
def svcName= currentBuild.rawBuild.project.parent.displayName
def tag = "${BRANCH_NAME}${BUILD_NUMBER}"
def pod = libraryResource ‘io/otomato/data-agent.yaml' <-Agent
def d = new io.otomato.data() <-Model
timestamps {
dataSvcPipeline(d, pod, svcName, tag) <-Flow
}
@antweiss
Agent
io/otomato/data-agent.yaml:
apiVersion: v1
kind: Pod
metadata:
labels:
product: data
spec:
serviceAccountName: jenkins
containers:
- name: maven
...
- name: helm
imagePullSecrets:
- name: regcred
volumes:
...
Defines:
● Containers
● Secrets
● Persistent Volumes
@antweiss
Model Definition
io.otomato.data:
def build(svcName, tag) {
container('maven'){
withEnv(["service_name=${svcName}", "environment=local"]) {
sh "mvn clean package -s settings.xml -P ci"
}
}
}
@antweiss
Model Definition
io.otomato.data:
def intTest(svcName, tag) {
container('maven'){
withEnv(["service_name=${svcName}", "environment=local"]) {
sh "mvn integration-test -s settings.xml -P ci"
}
}
}
@antweiss
Model Definition
io.otomato.serving:
def build(svcName, tag) {
container('node'){
withEnv(["service_name=${svcName}", "environment=test"]) {
sh "npm i --only=prod”
}
}
}
@antweiss
Flow Definition
dataSvcPipeline.groovy:
stage('build'){
steps {
script {
x.build(svcName, tag)
}
}
}
@antweiss
The Testing Pyramide?
@antweiss
The Testing Pyramide?
@antweiss
Helm Charts
● Support testing vs. production configuration
● Can be scaffolded
● Standard structure:
● templates/
├── deployment.yaml
├── db-configmap.yaml
├── ingress.yaml
├── monitoring-configmap.yaml
├── mq-configmap.yaml
└── service.yaml
@antweiss
The Vision of a Stress-free Release
Argo-Flux and the
GitOps Engine
SMI
Spec
The Meshes
@antweiss
Measurements & Standards:
● Measure:
○ Lead time
○ Deployment Rate
○ Mean Time to Restore
○ Change Fail Rate
● Integrate security scanning
● Define test coverage thresholds
● Define instrumentation requirements (types of metrics and
amount)
@antweiss
Jungle is Always Calling

Escaping the Jungle - Migrating to Cloud Native CI/CD

Editor's Notes

  • #13 Describe why complexity becomes a hurdle: Decision Waste Onboarding is
  • #23 Dockerhub + Nexus + S3
  • #24 Dockerhub + Nexus + S3
  • #25 Dockerhub + Nexus + S3
  • #26 Dockerhub + Nexus + S3
  • #27 Dockerhub + Nexus + S3
  • #28 Dockerhub + Nexus + S3
  • #29 Dockerhub + Nexus + S3
  • #30 Dockerhub + Nexus + S3