Slide 1

Slide 1 text

Title Text Body Level One Body Level Two Body Level Three Body Level Four Body Level Five Creating
 Cloud Native Buildpacks Cloud Foundry Summit Hague 2019 Dr Nic Williams @drnic

Slide 2

Slide 2 text

@drnic Nothing should change for CF users EXCEPT This is about future v3 buildpacks WARNING

Slide 3

Slide 3 text

@drnic History v2 - Supply and Finalize CF own buildpacks evolved API Cloud Foundry had no buildpacks v1 - Heroku Buildpacks Borrowed API; offline buildpacks Ɲ v3 - Cloud Native Buildpacks Heroku and CF work together CNCF Incubator project Buildpacks are going everywhere

Slide 4

Slide 4 text

Cloud Foundry buildpacks thanks to…

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

@drnic Example NodeJS $ pack build starkandwayne/sample-app-nodejs [detector] ======== Results ======== [detector] pass: Node Engine Buildpack [detector] pass: Yarn Buildpack … [builder] -----> Node Engine Buildpack 0.0.26 [builder] Node Engine 10.16.2: [builder] Downloading from … … [builder] Process types: [builder] web: yarn start $ docker run -ti -p 8080:8080 \ starkandwayne/sample-app-nodejs

Slide 7

Slide 7 text

@drnic Example Spring $ pack build starkandwayne/sample-app-java ===> DETECTING [detector] skip: [email protected] [detector] pass: [email protected] [detector] pass: [email protected] [detector] pass: [email protected] [detector] pass: [email protected] [detector] pass: [email protected] [detector] skip: [email protected] [detector] skip: [email protected] [detector] Resolving plan... (try #1) [detector] Success! (7) … [builder] Cloud Foundry OpenJDK Buildpack 1.0.0-RC02 [builder] OpenJDK JDK 11.0.4: Contributing to layer $ docker run -ti -p 8080:8080 \ starkandwayne/sample-app-java

Slide 8

Slide 8 text

@drnic Deploy CF $ docker push starkandwayne/sample-app-nodejs $ cf push myapp \ -o starkandwayne/sample-app-nodejs \ -k 1536M $ cf logs my-node-app --recent

Slide 9

Slide 9 text

@drnic Buildpack API bin/detect Could this buildpack help this app? What requirements did we learn? ? bin/build Install dependencies Setup configuration Processes to launch #

Slide 10

Slide 10 text

@drnic Builder $ pack inspect-builder cloudfoundry/cnb Run Images: cloudfoundry/run:full-cnb Buildpacks: org.cloudfoundry.node-engine org.cloudfoundry.npm org.cloudfoundry.yarn org.cloudfoundry.python org.cloudfoundry.pip …

Slide 11

Slide 11 text

@drnic Ordered Groups $ pack inspect-builder cloudfoundry/cnb … Group #2: [email protected] [email protected] Group #3: [email protected] [email protected] Group #4: [email protected] [email protected] (optional) [email protected]

Slide 12

Slide 12 text

@drnic 1, 2, 3, 4, 5, 6, 7, …, 15 FIZZ BUZZ 1, 2, fizz, 4, buzz, fizz, 7, …, fizzbuzz https://github.com/starkandwayne/fizzbuzz-cnb-builder

Slide 13

Slide 13 text

$ echo 1 > Count $ pack build myapp --builder fizzbuzz $ docker run myapp 1 $ echo 3 > Count $ pack build myapp --builder fizzbuzz $ docker run myapp fizz $ echo 15 > Count $ pack build myapp --builder fizzbuzz $ docker run myapp fizzbuzz https://github.com/starkandwayne/fizzbuzz-cnb-builder

Slide 14

Slide 14 text

@drnic FizzBuzz Buildpack bin/detect Does this app contain Count? ? bin/build Create executable to print Count or fizz, buzz, or fizzbuzz #

Slide 15

Slide 15 text

# bin/detect [ -f Count ]] || { echo "No Count file"; exit 1; } # bin/build cp -r $buildpack_dir/layer/* $layer_dir/ !"" fizzbuzz # $"" bin # $"" display-count !"" fizzbuzz.toml $"" launch.toml https://github.com/starkandwayne/fizzbuzz-cnb-builder

Slide 16

Slide 16 text

# launch.toml [[processes]] command = "display-count" type = "web" # fizzbuzz.toml launch = true # fizzbuzz/bin/display-count #!/bin/bash count=$(cat Count) if [[ $(( $count % 15 )) == "0" ]]; then echo "fizzbuzz" elif [[ $(( $count % 5 )) == "0" ]]; then echo "buzz" elif [[ $(( $count % 3 )) == "0" ]]; then echo "fizz" else echo $count fi% https://github.com/starkandwayne/fizzbuzz-cnb-builder layer metadata layer contents

Slide 17

Slide 17 text

$ pack build app \ --buildpack path/to/fizzbuzz \ --path to/app ===> DETECTING [detector] ======== Results ======== [detector] pass: [email protected] [detector] Resolving plan... (try #1) [detector] Success! (1) ===> BUILDING [builder] ---> FizzBuzz Buildpack ===> EXPORTING [exporter] *** Images: [exporter] …playtime:latest - succeeded

Slide 18

Slide 18 text

@drnic Print Message Buildpack bin/detect Does this app contain Message? ? bin/build Create executable to print Message #

Slide 19

Slide 19 text

$ rm Count $ echo "Hello World" > Message $ pack build myapp --builder fizzbuzz $ docker run myapp Hello World $ rm Count $ rm Message $ pack build myapp --builder fizzbuzz

Slide 20

Slide 20 text

# bin/detect [ -f Message ]] || { echo "No Message file"; exit 1; } # bin/build cp -r $buildpack_dir/layer/* $layer_dir/ !"" launch.toml !"" print-message # !"" bin # # !"" display-message # # $"" show-message-twice # $"" profile.d # $"" message.sh $"" print-message.toml

Slide 21

Slide 21 text

$ pack build app \ --buildpack path/to/print-message \ --path to/app ===> DETECTING [detector] ======== Results ======== [detector] pass: [email protected] [detector] Resolving plan... (try #1) [detector] Success! (1) ===> BUILDING [builder] ---> Print Message Buildpack ===> EXPORTING [exporter] *** Images: [exporter] …playtime:latest - succeeded

Slide 22

Slide 22 text

@drnic FizzBuzz Builder # builder.toml [[buildpacks]] id = "fizzbuzz" uri = "buildpacks/fizzbuzz" [[buildpacks]] id = "print-message" uri = "buildpacks/print-message" …

Slide 23

Slide 23 text

@drnic FizzBuzz Builder # builder.toml … [[order]] [[order.group]] id = "fizzbuzz" [[order]] [[order.group]] id = "print-message" …

Slide 24

Slide 24 text

@drnic FizzBuzz Builder # builder.toml … [stack] id = "io.buildpacks.stacks.bionic" build-image = "cloudfoundry/build:base-cnb" run-image = "cloudfoundry/run:base-cnb"

Slide 25

Slide 25 text

@drnic FizzBuzz Builder $ pack create-builder fizzbuzz -b builder.toml Creating builder fizzbuzz from build-image cloudfoundry/build:base-cnb $ pack build myapp --builder fizzbuzz Count app Message app Runnable OCI/docker image

Slide 26

Slide 26 text

@drnic FizzBuzz Builder $ pack inspect-builder fizzbuzz Run Images: cloudfoundry/run:base-cnb Buildpacks: com.starkandwayne.fizzbuzz com.starkandwayne.print-message Detection Order: Group #1: [email protected] Group #2: [email protected]

Slide 27

Slide 27 text

@drnic Example NodeJS $ pack build starkandwayne/sample-app-nodejs [detector] ======== Results ======== [detector] pass: Node Engine Buildpack [detector] pass: Yarn Buildpack … [builder] -----> Node Engine Buildpack 0.0.26 [builder] Node Engine 10.16.2: [builder] Downloading from … … [builder] Process types: [builder] web: yarn start $ docker run -ti -p 8080:8080 \ starkandwayne/sample-app-nodejs

Slide 28

Slide 28 text

Nothing should change for CF users START MIGRATING Cloud Native (v3) buildpacks COMING SOON

Slide 29

Slide 29 text

@drnic CONTINUE TO FIZZBUZZ https://github.com/starkandwayne/fizzbuzz-cnb-builder https://buildpacks.io/docs/create-buildpack/