Skip to content

build: Refactor to use BuildKit LLB library directly

Dduvall requested to merge review/refactor-llb-only-902f into experimental/native-llb

Provide new build interfaces, build.Target and build.Options.

The latter, build.Options, moves configuration of build-time options
from the buildkit module into the core build module. New fields
are introduced that were formerly handled by dockerfile2llb.

The former, build.Target, provides a single interface to perform
operations that will either affect the image config result (entrypoint,
runtime user, etc.) or the llb.State graph (copy files, run commands,
etc.).

Refactor build.Instruction interface and implementations to accept a
single build.Target argument. Instead of returning half-compiled
Dockerfile instructions, each build.Instruction implementation uses
the passed build.Target to add to the llb.State graph or make
changes to image configuration.

Note, it may be better long-term to remove the build.Instruction
abstraction altogether (e.g. ostensibly we could pass the build.Target
directly to config types), but this seems like a good interim part of
the large refactoring as it avoided having to change anything in the
config module.

Refactor buildkit module to use the new build.Target and
build.TargetGroup interfaces. Instead of compiling to Dockerfile and
using dockerfile2llb to convert that to LLB, build.Instructions are
compiled to the build.Target which is marshaled directly to a
llb.Definition.

Provide test helper modules llbtest and testtarget to ease making
complex assertions on the llb.Definition result of build.Target.

Provide test coverage for all build.Target methods and refactor
existing build.Instruction tests.

Remove docker module.

Bug: T345458

Edited by Dduvall

Merge request reports