Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Terence Lee @hone02

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

New Buildpack API Build Detect Analysis Export where metadata about OCI layers generated during a previous build are made available to buildpacks where the remote layers are replaced by the generated layers where an optimal selection of compatible buildpacks is chosen and a build plan is created where buildpacks use that metadata to generate only the OCI layers that need to be replaced

Slide 5

Slide 5 text

Components ● Platform ○ pack - Local CLI for CNB ○ knative-integration - template for using CNB with knative/tekton ● Implementation ○ lifecycle - Implementation of the Buildpack API v3 ○ libbuildpack - Go language binding for the CNB API ● Core ○ spec - Buildpack API v3 specification ○ rfcs - RFCs for changes to CNB

Slide 6

Slide 6 text

Deep Dive into Real Buildpacks

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

Creating a Builder Image

Slide 9

Slide 9 text

builder.toml (stack) [stack] id = "heroku-18" build-image = "heroku/pack:18-build" run-image = "heroku/pack:18"

Slide 10

Slide 10 text

Heroku 18 Stack ● Built on top of Ubuntu 18.04 LTS ● github.com/heroku/stack-images ● devcenter.heroku.com/articles/stack-packages ● 2 Docker Images ○ heroku/heroku:18 ○ heroku/heroku:18-build

Slide 11

Slide 11 text

Heroku-18 CNB Build Image (heroku/pack:18-build) FROM heroku/heroku:18-build # setup user ARG pack_uid=1000 ARG pack_gid=1000 ENV CNB_USER_ID=${pack_uid} ENV CNB_GROUP_ID=${pack_gid} RUN groupadd pack --gid ${pack_gid} && \ useradd -u ${pack_uid} -g ${pack_gid} -ms /bin/bash heroku # Set stack info ENV STACK "heroku-18" ENV CNB_STACK_ID "heroku-18" LABEL io.buildpacks.stack.id="heroku-18"

Slide 12

Slide 12 text

Heroku-18 CNB Run Image (heroku/pack:18) FROM heroku/heroku:18 # setup user ARG pack_uid=1000 ARG pack_gid=1000 ENV CNB_USER_ID=${pack_uid} ENV CNB_GROUP_ID=${pack_gid} RUN groupadd pack --gid ${pack_gid} && \ useradd -u ${pack_uid} -g ${pack_gid} -ms /bin/bash heroku # Set stack info ENV STACK "heroku-18" ENV CNB_STACK_ID "heroku-18" LABEL io.buildpacks.stack.id="heroku-18"

Slide 13

Slide 13 text

builder.toml (buildpacks) [[buildpacks]] id = "heroku/ruby" uri = "https://github.com/heroku/heroku-buildpack-ruby/..." [[buildpacks]] id = "heroku/procfile" uri = "https://github.com/heroku/procfile-cnb/releases/…"

Slide 14

Slide 14 text

builder.toml (buildpack groups) [[groups]] [[groups.buildpacks]] id = "heroku/ruby" version = "0.0.1" [[groups.buildpacks]] id = "heroku/procfile" version = "0.2" optional = true Ruby Procfile

Slide 15

Slide 15 text

Builder Image (heroku/buildpacks:18) $ pack create-builder builder.toml ● adds buildpacks to /buildpacks ● injects buildpack lifecycle binaries ● validates user id ● validates that buildpacks support stack ● creates directories: /workspace /layers /platform/env ● chown folders ● sets working dir

Slide 16

Slide 16 text

Docker Images ● Builder ○ heroku/buildpacks:18 ● Stack ○ Build: heroku/pack:18 ○ Run: heroku/pack:18-build

Slide 17

Slide 17 text

Heroku Buildpacks ● Cloud Native Buildpacks ○ Ruby ○ Java/JVM ● v2a Buildpacks + Shim ○ Node.js ○ Python ○ PHP ○ Go Ruby Procfile Java/JVM Node.js + CNB Shim Python + CNB Shim

Slide 18

Slide 18 text

Heroku CNB Ruby Buildpack Goals: ● Migration path from v2a buildpack ● Maintenance of both v2a + v3 buildpack ● Buildpacks represent a composable unit of work

Slide 19

Slide 19 text

Heroku Ruby Buildpack Source Code /Gemfile /Gemfile.lock /app Checks for Gemfile PASS

Slide 20

Slide 20 text

Detect Compatibility if [ -z "$CNB_STACK_ID" ]; then # v2 API APP_DIR=$1 else PLATFORM_DIR=$1 PLAN=$2 # working is the cwd now # v3 API APP_DIR=$(pwd) fi

Slide 21

Slide 21 text

Heroku Ruby Buildpack Ruby Files: /layers//ruby/{bin,lib}/… Launch + Build Env: PATH=/layers//ruby/bin Rubygems Files: /layers//gems/... Launch Env + Build Env: GEM_HOME=/layers//gems/ GEM_PATH=/layers//gems/ /Gemfile /Gemfile.lock /app Ruby 2.6.3 Linux x86_64 heroku-18 sha256(Gemfile.lock) Ruby 2.6.3 Linux x86_64 heroku-18

Slide 22

Slide 22 text

builder.toml (buildpack groups) [[groups]] [[groups.buildpacks]] id = "heroku/ruby" version = "0.0.1" [[groups.buildpacks]] id = "heroku/procfile" version = "0.2" optional = true Ruby Procfile

Slide 23

Slide 23 text

Heroku CNB Procfile Buildpack Compatibility with existing Heroku apps

Slide 24

Slide 24 text

Procfile format :

Slide 25

Slide 25 text

Ruby Procfile web: bin/rails servers -p $PORT -e $RAILS_ENV

Slide 26

Slide 26 text

launch.toml [[processes]] type = "" command = ""

Slide 27

Slide 27 text

launch.toml [[processes]] type = "web" command = "bin/rails servers -p $PORT -e $RAILS_ENV"

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

Decomposition Cloud Foundry Buildpacks as modular, transparent, source code processors

Slide 30

Slide 30 text

Cloud Foundry Node.js Buildpack (v2)

Slide 31

Slide 31 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry Yarn Buildpack Cloud Foundry NPM Buildpack Cloud Foundry Node.js Engine Buildpack Group #1 Group #2 Build Configuration (for detection step)

Slide 32

Slide 32 text

Buildpack Detection A mechanism for automated buildpack, tool, and dependency selection

Slide 33

Slide 33 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry Yarn Buildpack Source Code /package.json /package-lock.json /app.js One job: provide Node.js if the app or subsequent buildpacks need it. PASS

Slide 34

Slide 34 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry Yarn Buildpack Source Code /package.json /package-lock.json /app.js PASS FAIL One job: use Yarn to install and validate node modules. Fails: Missing yarn.lock

Slide 35

Slide 35 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry Yarn Buildpack Cloud Foundry NPM Buildpack Cloud Foundry Node.js Engine Buildpack Group #1 Group #2 Build Configuration (for detection step)

Slide 36

Slide 36 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry NPM Buildpack Source Code /package.json /package-lock.json /app.js One job: provide Node.js if the app or subsequent buildpacks need it. PASS

Slide 37

Slide 37 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry NPM Buildpack Source Code /package.json /package-lock.json /app.js PASS One job: use NPM to install and validate node modules. package.json has: “engine”: “10.3.1”, so we add [nodejs] version = “10.3.1” to the build plan. PASS

Slide 38

Slide 38 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry Yarn Buildpack Cloud Foundry NPM Buildpack Cloud Foundry Node.js Engine Buildpack Group #1 Group #2 Build Configuration (for detection step)

Slide 39

Slide 39 text

Buildpack Build An unprivileged, reproducible mechanism for incremental construction of OCI images.

Slide 40

Slide 40 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry NPM Buildpack /package.json /package-lock.json /app.js Node.js Files: /layers//nodejs/{bin,lib}/… Launch + Build Env: NODE_HOME=/layers//nodejs [nodejs] version = “10.3.1” Node.js 10.3.1 Linux x86_64

Slide 41

Slide 41 text

Cloud Foundry Node.js Engine Buildpack Cloud Foundry NPM Buildpack Node.js Files: /layers//nodejs/{bin,lib}/… Launch + Build Env: NODE_HOME=/layers//nodejs [nodejs] version = “10.3.1” Node Modules Files: /layers//modules/... Launch Env: NODE_PATH=/layers//modules /package.json /package-lock.json /app.js Node.js 10.3.1 Linux x86_64 sha256(package-lock.json) (empty)

Slide 42

Slide 42 text

Node.js Files: /layers//nodejs/{bin,lib}/… Launch + Build Env: NODE_HOME=/layers//nodejs [nodejs] version = “10.3.1” Node Modules Files: /layers//modules/... Launch Env: NODE_PATH=/layers//modules /package.json /package-lock.json /app.js Node.js 10.3.1 Linux x86_64 sha256(package-lock.json) Application Layers Runtime Base Image Metadata OCI Image

Slide 43

Slide 43 text

Node.js Files: /layers//nodejs/{bin,lib}/… Launch + Build Env: NODE_HOME=/layers//nodejs [nodejs] version = “10.3.1” Node Modules Files: /layers//modules/... Launch Env: NODE_PATH=/layers//modules /package.json /package-lock.json /app.js Node.js 10.3.1 Linux x86_64 sha256(package-lock.json) Application Layers Runtime Base Image Metadata OCI Image #2

Slide 44

Slide 44 text

Doesn’t decomposition make distribution a challenge?

Slide 45

Slide 45 text

Python Pipenv Pip Python Pip Conda Python Poetry

Slide 46

Slide 46 text

Enter: Distribution Specification (RFC out, upcoming in v0.3.0)

Slide 47

Slide 47 text

Python Pipenv Pip Python Pip Conda Python Poetry

Slide 48

Slide 48 text

Conda Buildpack Python Runtime Buildpack Python Package Managers Buildpack

Slide 49

Slide 49 text

Python Ecosystem Buildpack

Slide 50

Slide 50 text

Node.js Engine Buildpack Yarn Buildpack NPM Buildpack Node.js Engine Buildpack

Slide 51

Slide 51 text

Node.js Engine Buildpack Node.js Package Managers Buildpack

Slide 52

Slide 52 text

Node.js Ecosystem Buildpack

Slide 53

Slide 53 text

[[buildpacks]] id = "io.buildpacks.npm" name = "NPM Buildpack" version = "0.0.7" path = "./npm-cnb/" [buildpacks.metadata] # … [[buildpacks]] id = "io.buildpacks.yarn" name = "Yarn Buildpack" version = "0.0.6" path = "./yarn-cnb/" [buildpacks.metadata] # ... [[buildpacks]] id = "io.buildpacks.node" name = "Node Engine Buildpack" version = "0.0.5" path = "./node-cnb/" [buildpacks.metadata] # ... [[buildpacks]] id = "io.buildpacks.nodejs-pkg" name = "Node.js Package Manager Buildpack" version = "0.0.9" [[buildpacks.order]] [[buildpacks.order.groups]] id = "io.buildpacks.npm" version = "0.0.7" [[buildpacks.order]] [[buildpacks.order.groups]] id = "io.buildpacks.npm" version = "0.0.7" [[buildpacks]] id = "io.buildpacks.nodejs" name = "Node.js Ecosystem Buildpack" version = "0.1.0" [[buildpacks.order]] group = [ { id = "io.buildpacks.node", version = "0.0.5" }, { id = "io.buildpacks.nodejs-pkg", version = "0.0.9" } ] buildpack.toml

Slide 54

Slide 54 text

/cnb/blobs// /cnb/by-id/io.buildpacks.npm/0.0.7 -> /cnb/blobs// /cnb/by-id/io.buildpacks.yarn/0.0.6 -> /cnb/blobs// /cnb/blobs// /cnb/by-id/io.buildpacks.nodejs/0.1.0 -> /cnb/blobs// /cnb/by-id/io.buildpacks.nodejs-pkg/0.0.9 -> /cnb/blobs// Stack Non-runnable OCI image, either in a Docker registry, or saved as .CNB file.

Slide 55

Slide 55 text

/cnb/blobs// /cnb/by-id/io.buildpacks.npm/0.0.7 -> /cnb/blobs// /cnb/by-id/io.buildpacks.yarn/0.0.6 -> /cnb/blobs// /cnb/blobs// /cnb/by-id/io.buildpacks.nodejs/0.1.0 -> /cnb/blobs// /cnb/by-id/io.buildpacks.nodejs-pkg/0.0.9 -> /cnb/blobs// /usr/ /lib/ /etc/ … Stack build image

Slide 56

Slide 56 text

Roadmap ● Distribution RFC ● Buildpack Registry ● Support for scratch images ● Spec for Windows Containers ● Mixins (contract to support additional OS packages) ● Inline Buildpacks

Slide 57

Slide 57 text

Platform Integrations ● Cloud Foundry ● Heroku ● Tekton ● Riff ● Dokku ● Draft (potentially) ● You?

Slide 58

Slide 58 text

Try it out! ● Second Public Beta – v0.2.0 ○ pack CLI ○ Cloud Foundry and Heroku Buildpacks ○ Ubuntu-based Operating System Image ● Join us on Slack: ○ slack.buildpacks.io ● Join our Mailing List: ○ lists.cncf.io/g/cncf-buildpacks