Skip to content

Commit

Permalink
Support custom images for Jib on GCB
Browse files Browse the repository at this point in the history
Signed-off-by: David Gageot <[email protected]>
  • Loading branch information
dgageot authored and Moustafa Baiou committed Jan 18, 2019
1 parent 1ffece5 commit 9b06a7c
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 19 deletions.
2 changes: 2 additions & 0 deletions integration/examples/annotated-skaffold.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ build:
# machineType: "N1_HIGHCPU_8"|"N1_HIGHCPU_32"
# timeout: 10000s
# dockerImage: gcr.io/cloud-builders/docker
# mavenImage: gcr.io/cloud-builders/mvn
# gradleImage: gcr.io/cloud-builders/gradle

# Docker artifacts can be built on a Kubernetes cluster with Kaniko.
# Exactly one buildContext must be specified to use kaniko
Expand Down
6 changes: 2 additions & 4 deletions pkg/skaffold/build/gcb/jib.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,16 @@ import (
)

// TODO(dgageot): check that `package` is bound to `jib:build`
// TODO(dgageot): let users configure the mvn image
func (b *Builder) jibMavenBuildSteps(imageName string, artifact *latest.JibMavenArtifact) []*cloudbuild.BuildStep {
return []*cloudbuild.BuildStep{{
Name: "gcr.io/cloud-builders/mvn",
Name: b.MavenImage,
Args: jib.GenerateMavenArgs("dockerBuild", imageName, artifact),
}}
}

// TODO(dgageot): let users configure the gradle image
func (b *Builder) jibGradleBuildSteps(imageName string, artifact *latest.JibGradleArtifact) []*cloudbuild.BuildStep {
return []*cloudbuild.BuildStep{{
Name: "gcr.io/cloud-builders/gradle",
Name: b.GradleImage,
Args: jib.GenerateGradleArgs("jibDockerBuild", imageName, artifact),
}}
}
12 changes: 8 additions & 4 deletions pkg/skaffold/build/gcb/jib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ func TestJibMavenBuildSteps(t *testing.T) {
artifact := &latest.JibMavenArtifact{}

builder := Builder{
GoogleCloudBuild: &latest.GoogleCloudBuild{},
GoogleCloudBuild: &latest.GoogleCloudBuild{
MavenImage: "maven:3.6.0",
},
}
steps := builder.jibMavenBuildSteps("img", artifact)

expected := []*cloudbuild.BuildStep{{
Name: "gcr.io/cloud-builders/mvn",
Name: "maven:3.6.0",
Args: []string{"--non-recursive", "prepare-package", "jib:dockerBuild", "-Dimage=img"},
}}

Expand All @@ -44,12 +46,14 @@ func TestJibGradleBuildSteps(t *testing.T) {
artifact := &latest.JibGradleArtifact{}

builder := Builder{
GoogleCloudBuild: &latest.GoogleCloudBuild{},
GoogleCloudBuild: &latest.GoogleCloudBuild{
GradleImage: "gradle:5.1.1",
},
}
steps := builder.jibGradleBuildSteps("img", artifact)

expected := []*cloudbuild.BuildStep{{
Name: "gcr.io/cloud-builders/gradle",
Name: "gradle:5.1.1",
Args: []string{":jibDockerBuild", "--image=img"},
}}

Expand Down
2 changes: 2 additions & 0 deletions pkg/skaffold/constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ const (
UpdateCheckEnvironmentVariable = "SKAFFOLD_UPDATE_CHECK"

DefaultCloudBuildDockerImage = "gcr.io/cloud-builders/docker"
DefaultCloudBuildMavenImage = "gcr.io/cloud-builders/mvn"
DefaultCloudBuildGradleImage = "gcr.io/cloud-builders/gradle"

// A regex matching valid repository names (https://github.com/docker/distribution/blob/master/reference/reference.go)
RepositoryComponentRegex string = `^[a-z\d]+(?:(?:[_.]|__|-+)[a-z\d]+)*$`
Expand Down
44 changes: 34 additions & 10 deletions pkg/skaffold/schema/defaults/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,30 @@ package defaults
import (
"fmt"

homedir "github.com/mitchellh/go-homedir"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"

"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
kubectx "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes/context"
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
homedir "github.com/mitchellh/go-homedir"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)

// Set makes sure default values are set on a SkaffoldPipeline.
func Set(c *latest.SkaffoldPipeline) error {
defaultToLocalBuild(c)
defaultToKubectlDeploy(c)
setDefaultCloudBuildDockerImage(c)
setDefaultTagger(c)
setDefaultKustomizePath(c)
setDefaultKubectlManifests(c)

if err := withCloudBuildConfig(c,
setDefaultCloudBuildDockerImage,
setDefaultCloudBuildMavenImage,
setDefaultCloudBuildGradleImage,
); err != nil {
return err
}

if err := withKanikoConfig(c,
setDefaultKanikoTimeout,
setDefaultKanikoImage,
Expand Down Expand Up @@ -75,13 +81,31 @@ func defaultToKubectlDeploy(c *latest.SkaffoldPipeline) {
c.Deploy.DeployType.KubectlDeploy = &latest.KubectlDeploy{}
}

func setDefaultCloudBuildDockerImage(c *latest.SkaffoldPipeline) {
cloudBuild := c.Build.BuildType.GoogleCloudBuild
if cloudBuild == nil {
return
func withCloudBuildConfig(c *latest.SkaffoldPipeline, operations ...func(kaniko *latest.GoogleCloudBuild) error) error {
if gcb := c.Build.GoogleCloudBuild; gcb != nil {
for _, operation := range operations {
if err := operation(gcb); err != nil {
return err
}
}
}

cloudBuild.DockerImage = valueOrDefault(cloudBuild.DockerImage, constants.DefaultCloudBuildDockerImage)
return nil
}

func setDefaultCloudBuildDockerImage(gcb *latest.GoogleCloudBuild) error {
gcb.DockerImage = valueOrDefault(gcb.DockerImage, constants.DefaultCloudBuildDockerImage)
return nil
}

func setDefaultCloudBuildMavenImage(gcb *latest.GoogleCloudBuild) error {
gcb.MavenImage = valueOrDefault(gcb.MavenImage, constants.DefaultCloudBuildMavenImage)
return nil
}

func setDefaultCloudBuildGradleImage(gcb *latest.GoogleCloudBuild) error {
gcb.GradleImage = valueOrDefault(gcb.GradleImage, constants.DefaultCloudBuildGradleImage)
return nil
}

func setDefaultTagger(c *latest.SkaffoldPipeline) {
Expand Down
2 changes: 2 additions & 0 deletions pkg/skaffold/schema/latest/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ type GoogleCloudBuild struct {
MachineType string `yaml:"machineType,omitempty"`
Timeout string `yaml:"timeout,omitempty"`
DockerImage string `yaml:"dockerImage,omitempty"`
MavenImage string `yaml:"mavenImage,omitempty"`
GradleImage string `yaml:"gradleImage,omitempty"`
}

// LocalDir represents the local directory kaniko build context
Expand Down
4 changes: 3 additions & 1 deletion pkg/skaffold/schema/v1beta2/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ import (

// Upgrade upgrades a configuration to the next version.
// Config changes from v1beta2 to v1beta3
// 1. No additions
// 1. Additions:
// gcb builder mvn image
// gcb builder gradle image
// 2. No removals
// 3. No updates
func (config *SkaffoldPipeline) Upgrade() (util.VersionedConfig, error) {
Expand Down
2 changes: 2 additions & 0 deletions pkg/skaffold/schema/versions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@ func withGoogleCloudBuild(id string, ops ...func(*latest.BuildConfig)) func(*lat
b := latest.BuildConfig{BuildType: latest.BuildType{GoogleCloudBuild: &latest.GoogleCloudBuild{
ProjectID: id,
DockerImage: "gcr.io/cloud-builders/docker",
MavenImage: "gcr.io/cloud-builders/mvn",
GradleImage: "gcr.io/cloud-builders/gradle",
}}}
for _, op := range ops {
op(&b)
Expand Down

0 comments on commit 9b06a7c

Please sign in to comment.