Slide 1

Slide 1 text

Such great heights @sasajuric aircloak.com

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

sensitive data Aircloak analyst query non sensitive result

Slide 4

Slide 4 text

aircloak air cloak central common integration_test ...

Slide 5

Slide 5 text

dev flow pull request based mandatory code review mandatory tests

Slide 6

Slide 6 text

outgrowing Travis CI long build times flakiness low throughput

Slide 7

Slide 7 text

solution self-hosting

Slide 8

Slide 8 text

custom CI simpler for a small problem flexible no additional knowledge required

Slide 9

Slide 9 text

aircloak air cloak central common integration_test ci ...

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

GitHub poller GitHub poll list of branches and PRs

Slide 12

Slide 12 text

aircloak_ci GitHub poller builds branch x pull request y

Slide 13

Slide 13 text

pull request x air cloak …

Slide 14

Slide 14 text

changed component tested components air air integration_test ci ci common everything

Slide 15

Slide 15 text

report success build components await approval report mergeability

Slide 16

Slide 16 text

if not merge_conflict?(build_state) and tests_passed?(build_state) and pr_approved?(build_state) do: report_mergeable(build_state)

Slide 17

Slide 17 text

Github.comment_on_issue( build_state, "Pull request can be merged #{AircloakCI.Emoji.happy()}" ) Github.put_status_check_state( build_state, "continuous-integration/aircloak/mergeable", "pull request can be merged", :success )

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

%{ compile: [ "mix deps.get", "mix compile" ], test: [ "mix test", "mix dialyze", "mix format --check-formatted" ] }

Slide 20

Slide 20 text

test_test = # ... test_dev = # ... test_prod = # ... %{ compile: # ..., test: [test_test, test_dev, test_prod] }

Slide 21

Slide 21 text

# sequence of commands [ "mix deps.get", "mix compile" ]

Slide 22

Slide 22 text

# also a sequence {:sequence, [ "mix deps.get", "mix compile" ]}

Slide 23

Slide 23 text

# independent commands {:parallel, [ "mix format --check-formatted", "mix test", "mix dialyze", ]}

Slide 24

Slide 24 text

{:sequence, [ "command a", {:parallel, [ "command b", {:sequence, [ "command c", "command d" ]}, "command e" ]}, "command f" ]}

Slide 25

Slide 25 text

command a command b command c command e command d command f

Slide 26

Slide 26 text

component command 1 command 2 …

Slide 27

Slide 27 text

build component 1 component 2 …

Slide 28

Slide 28 text

builds build 1 build 2 …

Slide 29

Slide 29 text

not open-source (yet!)

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

uniformity simpler development simpler testing simpler deployment simpler maintenance improved collaboration

Slide 32

Slide 32 text

technical feature built-in options services GenServer, Task service manager Supervisor service registry Registry k-v ETS, Mnesia web server Phoenix, Plug, Cowboy periodical jobs :timer, Quantum, Periodic load regulation Jobs, Safetyvalve, Sbroker concurrent flows Flow, GenStage

Slide 33

Slide 33 text

distributed systems persistence partial deployment

Slide 34

Slide 34 text

They will see us waving from such great heights Come down now, they'll say But everything looks perfect from far away Come down now, but we'll stay The Postal Service

Slide 35

Slide 35 text

40% off at manning.com with code ctwcodebeamamsterdam18 links: bit.ly/such-great-heights-amsterdam2018