Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

110
Spinnaker and SpEL Evolving an Expression Language for Continuous Delivery Pipelines | Tomas Lin @tomaslin

Transcript of Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Page 1: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Spinnaker and SpELEvolving an Expression Language forContinuous Delivery Pipelines

| Tomas Lin @tomaslin

Page 2: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

BakeTrigger Deploy SmokeTest

Approval

Page 3: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

BakeTrigger Deploy SmokeTest

Approval

Branchname

Page 4: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

BakeTrigger Deploy SmokeTest

Approval

Branchname

myapp-feature- Branchname

Page 5: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

BakeTrigger Deploy SmokeTest

Approval

run smoke tests?

Page 6: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

BakeTrigger Deploy SmokeTest

Approval

run smoke tests?

Page 7: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Spring Expression Language ( SpEL )

Page 8: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

“The Spring Expression Language (SpEL for short) is a powerful expression language that supports querying and manipulating an object graph at runtime. The language syntax is similar to Unified EL but offers additional features, most notably method invocation and basic string templating functionality.”

- Spring documentation Chapter 10

Page 9: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Also in:Spring

Thymeleaf

Page 10: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

a. Cluster-${ 7+2 } Cluster-9

b. Cluster-${ 7+2 }-${ 9 + 1 }-${ ‘string’ } Cluster-9-10-string

c. ${‘ some stringaroony ’.trim() } some stringaroony

d. ${ deploymentDetails[0] }

e. ${ trigger[‘parameters’][‘ideal temperature’] }

Page 11: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

a. ${ trigger.user ?: ‘britney’ }

b. ${ deploymentDetails?.[ region == ‘us-west-1’ ] }

c. ${ #toJson( deploymentDetails ) }

d. ${ new java.text.SimpleDateFormat('mm-dd-yyyy').format(new java.util.Date()) }

Page 12: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

YayWe were already heavily invested in Spring Ecosystem - Spring Boot, Spring Batch.

No external library dependency.

Seem pretty robust and powerful.

Looked to have great documentation.

Page 13: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

NayCouldn’t find a lot of examples of usage outside of Spring and Thymeleaf.

Could it work outside of managing bean dependencies?

Unsure of how easy it was to extend and customize.

Did it have a heavy dependency on Java?

Page 14: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Spinnaker Pipelines

Page 15: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 16: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Open Source successor to Asgard

Multi-region, multi-account, multi-cloud

Used to deploy around 98% of microservices at Netflix.

http://spinnaker.io

Page 17: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 18: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 19: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 20: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Resize, Disable, Enable, Destroy, Deploy, Clone

Page 21: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 22: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Shrink, Scale Down, Disable

Page 23: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 24: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 25: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 26: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 27: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Wiring up SpEL

Page 28: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Note: Everything we’re talking about is available in Github.

Easiest way to check it out is search for ‘ContextParameterProcessor’ in orca,

https://github.com/spinnaker/orca/search?q=contextparameterprocessor

Page 29: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Trigger( builds a ami )

Smoke Test Merge PREnableServer Group

DeployServer Group

Page 30: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 31: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Customizing the parser

Page 32: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

task context

Page 33: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Evaluating SpEL

evaluationContext

${ SpEL expression }

parserContext

result

Page 34: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ job }

faily-godmother

Page 35: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Adding Properties

Page 36: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Execution - the current pipeline ExecutionTrigger - the pipeline trigger

Parameters - pipeline parameterstrigger - pipeline triggerparameters - pipeline parametersscmInfo - git details in triggerdeployedServerGroups : details from last cluster deployed

execution the current pipeline execution

parameters pipeline parameters

trigger pipeline trigger

scmInfo git details

deploymentDetails results of the findImage or Bake stage

deployedServerGroups last created server group

Page 37: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ deployedServerGroups?.[region==‘us-east-1’][‘serverGroup’] }

myapp-v001

Page 38: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Adding Methods

Page 39: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 40: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Execution - the current pipeline ExecutionTrigger - the pipeline trigger

Parameters - pipeline parameterstrigger - pipeline triggerparameters - pipeline parametersscmInfo - git details in triggerdeployedServerGroups : details from last cluster deployed

#alphanumerical trims all non-alphanumerical characters

#fromJson converts JSON to a map

#fromUrl contents from a url

#jsonFromUrl JSON content from an url

#judgment choice from manual judgment stage

Page 41: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Execution - the current pipeline ExecutionTrigger - the pipeline trigger

Parameters - pipeline parameterstrigger - pipeline triggerparameters - pipeline parametersscmInfo - git details in triggerdeployedServerGroups : details from last cluster deployed

#stage shortcut to stage contents by name

#toBoolean conversion to boolean

#toFloat conversion to float

#toInt conversion to int

#toJson conversion from Map to Json

Page 42: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ #alphanumerical(‘jenny from the block’) }

jennyfromtheblock

Page 43: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Getting data from Jenkins

Page 44: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Trigger

Smoke Test Merge PR

ami=i-xxxyyyyregion=us-west-1

Property Files

Page 45: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 46: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ trigger.properties[‘ami’] }

Page 47: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Trigger

Smoke Test Merge PR

retries=truenumber of retries=2

Page 48: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 49: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ retries }${ #stage(‘Smoke Test’)[‘context’][‘retries’] }

Page 50: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Example: Jenkins parameter passing

Page 51: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 52: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ #alphanumerical( trigger.properties[‘us-west-1’] ).toUpperCase() }

Page 53: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 54: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Global SpEL Evaluation

Page 55: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 56: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 57: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 58: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

stage

stage

task

task

task

context

definition

Page 59: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

stage

stage

task

task

task

context

definitiondefinition

stage

Page 60: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Not everything is a String…

Page 61: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

}

Page 62: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Pipeline parameters

Page 63: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 64: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 65: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 66: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Using SpEL to control execution of stages

Page 67: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 68: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 69: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 70: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 71: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 72: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 73: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

}

Page 74: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 75: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 76: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 77: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 78: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 79: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 80: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 81: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Using SpEL in Spinnaker UI

Page 82: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 83: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 84: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 85: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 86: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 87: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 88: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 89: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 90: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Common mistakes around Expressions

Page 91: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Culture of Freedom and Responsibility

You build it, you run it, you support it.

#spinnaker slack channel

Office Hours

Anytime walk-in 1-1 help with first responder

Page 92: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ parameters.ami ?: ${ ‘ami’ + ‘x’ } }

Page 93: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ parameters.use ami in us-west-1 }

${ parameters[‘use ami in us-west-1’] }

Page 94: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ #deploymentDetails?.[ region == parameters.region ] }

${ #deploymentDetails?.[ region == #root.parameters.region ] }

Page 95: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ ‘a’ + ‘b’ } ${ derp } ${ 1 + 1 }

Page 96: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

“${ my escaped expression }”.toString()

Page 97: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Simplifying Stage Executions

Page 98: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

read from url

Page 99: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

#jsonFromUrl( url )

Page 100: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ #jsonFromUrl( ‘http://archeius/rest/v1/props/myapp’)[‘propertiesList’][0][‘value’]}

${ deploymentDetails[0].jenkins.number != #jsonFromUrl( ‘https://spinnakerapi/applications/orca/clusters/mgmt/orca-main/aws/us-west-2/serverGroups/target/NEWEST?onlyEnabled=true' )['buildInfo']['jenkins']['number'] }

Page 101: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Expressions can be a nice temporary solution

Page 102: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 103: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

${ trigger.user ?: ‘[email protected]’ }

Page 104: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 105: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix
Page 106: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

What’s next?

Page 107: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Better support for on-the-fly expression testing and construction.

Helper methods such as #pipeline( ‘xxx’ ) and #stageInPipeline( ‘Wait’, ‘xxx’ ).

Better UI support.

Page 108: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Results

Page 109: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Over 1100 pipelines running in production ( of 5100 + ) use at least one SpEL expression.

Page 110: Putting a SpEL on Spinnaker: Evolving an Expression Language for Continuous Delivery at Netflix

Thank you.

spinnaker.io jobs.netflix.com

Try Spinnaker Come work with us!