Skip to content

Commit 7c3fdcb

Browse files
committed
distributedCache: allow local dir as a cache transport
Allowing local directory as transport enables users to make distributed caching more flexible by making sure. * Allows end users to move cache sources and destination manually. * Allows storing cache on an `NFS` or various mount sources. * Allows end users to distribute cache without registry setup. [NO NEW TESTS NEEDED] [NO TESTS NEEDED] // Will add test in final commit Signed-off-by: Aditya R <[email protected]>
1 parent f4e8be4 commit 7c3fdcb

File tree

5 files changed

+52
-29
lines changed

5 files changed

+52
-29
lines changed

define/build.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"time"
66

77
nettypes "github.com/containers/common/libnetwork/types"
8-
"github.com/containers/image/v5/docker/reference"
98
"github.com/containers/image/v5/types"
109
encconfig "github.com/containers/ocicrypt/config"
1110
"github.com/containers/storage/pkg/archive"
@@ -141,10 +140,10 @@ type BuildOptions struct {
141140
TransientMounts []string
142141
// CacheFrom specifies any remote repository which can be treated as
143142
// potential cache source.
144-
CacheFrom []reference.Named
143+
CacheFrom []types.ImageReference
145144
// CacheTo specifies any remote repository which can be treated as
146145
// potential cache destination.
147-
CacheTo []reference.Named
146+
CacheTo []types.ImageReference
148147
// CacheTTL specifies duration, if specified using `--cache-ttl` then
149148
// cache intermediate images under this duration will be considered as
150149
// valid cache sources and images outside this duration will be ignored.

imagebuildah/executor.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ var builtinAllowedBuildArgs = map[string]bool{
6161
// interface. It coordinates the entire build by using one or more
6262
// StageExecutors to handle each stage of the build.
6363
type Executor struct {
64-
cacheFrom []reference.Named
65-
cacheTo []reference.Named
64+
cacheFrom []types.ImageReference
65+
cacheTo []types.ImageReference
6666
cacheTTL time.Duration
6767
containerSuffix string
6868
logger *logrus.Logger

imagebuildah/stage_executor.go

+38-14
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/containers/buildah/util"
2525
config "github.com/containers/common/pkg/config"
2626
cp "github.com/containers/image/v5/copy"
27+
imagedirectory "github.com/containers/image/v5/directory"
2728
imagedocker "github.com/containers/image/v5/docker"
2829
"github.com/containers/image/v5/docker/reference"
2930
"github.com/containers/image/v5/manifest"
@@ -985,10 +986,16 @@ func (s *StageExecutor) Execute(ctx context.Context, base string) (imgID string,
985986
}
986987
// logCachePulled produces build log for cases when `--cache-from`
987988
// is used and a valid intermediate image is pulled from remote source.
988-
logCachePulled := func(cacheKey string, remote reference.Named) {
989+
logCachePulled := func(cacheKey string, remote types.ImageReference) {
989990
if !s.executor.quiet {
990991
cachePullMessage := "--> Cache pulled from remote"
991-
fmt.Fprintf(s.executor.out, "%s %s\n", cachePullMessage, fmt.Sprintf("%s:%s", remote.String(), cacheKey))
992+
repo := ""
993+
if remote.Transport().Name() == imagedocker.Transport.Name() {
994+
repo = remote.DockerReference().String()
995+
} else {
996+
repo = remote.StringWithinTransport()
997+
}
998+
fmt.Fprintf(s.executor.out, "%s %s\n", cachePullMessage, fmt.Sprintf("%s:%s", repo, cacheKey))
992999
}
9931000
}
9941001
// logCachePush produces build log for cases when `--cache-to`
@@ -1782,18 +1789,29 @@ func (s *StageExecutor) generateCacheKey(ctx context.Context, currNode *parser.N
17821789

17831790
// cacheImageReference is internal function which generates ImageReference from Named repo sources
17841791
// and a tag.
1785-
func cacheImageReferences(repos []reference.Named, cachekey string) ([]types.ImageReference, error) {
1792+
func cacheImageReferences(repos []types.ImageReference, cachekey string) ([]types.ImageReference, error) {
17861793
var result []types.ImageReference
17871794
for _, repo := range repos {
1788-
tagged, err := reference.WithTag(repo, cachekey)
1789-
if err != nil {
1790-
return nil, fmt.Errorf("failed generating tagged reference for %q: %w", repo, err)
1791-
}
1792-
dest, err := imagedocker.NewReference(tagged)
1793-
if err != nil {
1794-
return nil, fmt.Errorf("failed generating docker reference for %q: %w", tagged, err)
1795+
if repo.Transport().Name() == imagedocker.Transport.Name() {
1796+
ref := repo.DockerReference()
1797+
tagged, err := reference.WithTag(ref, cachekey)
1798+
if err != nil {
1799+
return nil, fmt.Errorf("failed generating tagged reference for %q: %w", repo, err)
1800+
}
1801+
dest, err := imagedocker.NewReference(tagged)
1802+
if err != nil {
1803+
return nil, fmt.Errorf("failed generating docker reference for %q: %w", tagged, err)
1804+
}
1805+
result = append(result, dest)
1806+
} else if repo.Transport().Name() == imagedirectory.Transport.Name() {
1807+
dirPath := repo.StringWithinTransport()
1808+
tagged := filepath.Join(dirPath, cachekey)
1809+
dest, err := imagedirectory.NewReference(tagged)
1810+
if err != nil {
1811+
return nil, fmt.Errorf("failed generating directory reference for %q: %w", tagged, err)
1812+
}
1813+
result = append(result, dest)
17951814
}
1796-
result = append(result, dest)
17971815
}
17981816
return result, nil
17991817
}
@@ -1833,7 +1851,7 @@ func (s *StageExecutor) pushCache(ctx context.Context, src, cacheKey string) err
18331851
// or a newer version of cache was found in the upstream repo. If new
18341852
// image was pulled function returns image id otherwise returns empty
18351853
// string "" or error if any error was encontered while pulling the cache.
1836-
func (s *StageExecutor) pullCache(ctx context.Context, cacheKey string) (reference.Named, string, error) {
1854+
func (s *StageExecutor) pullCache(ctx context.Context, cacheKey string) (types.ImageReference, string, error) {
18371855
srcList, err := cacheImageReferences(s.executor.cacheFrom, cacheKey)
18381856
if err != nil {
18391857
return nil, "", err
@@ -1851,14 +1869,20 @@ func (s *StageExecutor) pullCache(ctx context.Context, cacheKey string) (referen
18511869
ReportWriter: nil,
18521870
PullPolicy: define.PullIfNewer,
18531871
}
1854-
id, err := buildah.Pull(ctx, src.DockerReference().String(), options)
1872+
srcString := ""
1873+
if src.Transport().Name() == imagedocker.Transport.Name() {
1874+
srcString = src.DockerReference().String()
1875+
} else if src.Transport().Name() == imagedirectory.Transport.Name() {
1876+
srcString = "dir://" + src.StringWithinTransport()
1877+
}
1878+
id, err := buildah.Pull(ctx, srcString, options)
18551879
if err != nil {
18561880
logrus.Debugf("failed pulling cache from source %s: %v", src, err)
18571881
continue // failed pulling this one try next
18581882
//return "", fmt.Errorf("failed while pulling cache from %q: %w", src, err)
18591883
}
18601884
logrus.Debugf("successfully pulled cache from repo %s: %s", src, id)
1861-
return src.DockerReference(), id, nil
1885+
return src, id, nil
18621886
}
18631887
return nil, "", fmt.Errorf("failed pulling cache from all available sources %q", srcList)
18641888
}

pkg/cli/build.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"github.com/containers/buildah/pkg/parse"
1818
"github.com/containers/buildah/pkg/util"
1919
"github.com/containers/common/pkg/auth"
20-
"github.com/containers/image/v5/docker/reference"
2120
"github.com/containers/image/v5/types"
2221
"github.com/opencontainers/runtime-spec/specs-go"
2322
"github.com/sirupsen/logrus"
@@ -296,8 +295,8 @@ func GenBuildOptions(c *cobra.Command, inputArgs []string, iopts BuildOptions) (
296295
iopts.Quiet = true
297296
}
298297
}
299-
var cacheTo []reference.Named
300-
var cacheFrom []reference.Named
298+
var cacheTo []types.ImageReference
299+
var cacheFrom []types.ImageReference
301300
cacheTo = nil
302301
cacheFrom = nil
303302
if c.Flag("cache-to").Changed {

pkg/parse/parse.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
"github.com/containers/buildah/pkg/sshagent"
2222
"github.com/containers/common/pkg/config"
2323
"github.com/containers/common/pkg/parse"
24-
"github.com/containers/image/v5/docker/reference"
24+
"github.com/containers/image/v5/transports/alltransports"
2525
"github.com/containers/image/v5/types"
2626
"github.com/containers/storage/pkg/idtools"
2727
"github.com/containers/storage/pkg/unshare"
@@ -53,16 +53,17 @@ const (
5353
)
5454

5555
// RepoNamesToNamedReferences parse the raw string to Named reference
56-
func RepoNamesToNamedReferences(destList []string) ([]reference.Named, error) {
57-
var result []reference.Named
56+
func RepoNamesToNamedReferences(destList []string) ([]types.ImageReference, error) {
57+
var result []types.ImageReference
5858
for _, dest := range destList {
59-
named, err := reference.ParseNormalizedNamed(dest)
59+
if t := alltransports.TransportFromImageName(dest); t == nil {
60+
// assume no default transport provided in such case append docker
61+
dest = "docker://" + dest
62+
}
63+
named, err := alltransports.ParseImageName(dest)
6064
if err != nil {
6165
return nil, fmt.Errorf("invalid repo %q: must contain registry and repository: %w", dest, err)
6266
}
63-
if !reference.IsNameOnly(named) {
64-
return nil, fmt.Errorf("repository must contain neither a tag nor digest: %v", named)
65-
}
6667
result = append(result, named)
6768
}
6869
return result, nil

0 commit comments

Comments
 (0)