github.com/GoogleContainerTools/skaffold@v1.39.18/pkg/skaffold/schema/v2beta13/config.go (about)

     1  /*
     2  Copyright 2019 The Skaffold Authors
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package v2beta13
    18  
    19  import (
    20  	"encoding/json"
    21  
    22  	v1 "k8s.io/api/core/v1"
    23  	"sigs.k8s.io/kustomize/kyaml/yaml"
    24  
    25  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/util"
    26  )
    27  
    28  // !!! WARNING !!! This config version is already released, please DO NOT MODIFY the structs in this file.
    29  const Version string = "skaffold/v2beta13"
    30  
    31  // NewSkaffoldConfig creates a SkaffoldConfig
    32  func NewSkaffoldConfig() util.VersionedConfig {
    33  	return new(SkaffoldConfig)
    34  }
    35  
    36  // SkaffoldConfig holds the fields parsed from the Skaffold configuration file (skaffold.yaml).
    37  type SkaffoldConfig struct {
    38  	// APIVersion is the version of the configuration.
    39  	APIVersion string `yaml:"apiVersion" yamltags:"required"`
    40  
    41  	// Kind is always `Config`. Defaults to `Config`.
    42  	Kind string `yaml:"kind" yamltags:"required"`
    43  
    44  	// Metadata holds additional information about the config.
    45  	Metadata Metadata `yaml:"metadata,omitempty"`
    46  
    47  	// Dependencies describes a list of other required configs for the current config.
    48  	Dependencies []ConfigDependency `yaml:"requires,omitempty"`
    49  
    50  	// Pipeline defines the Build/Test/Deploy phases.
    51  	Pipeline `yaml:",inline"`
    52  
    53  	// Profiles *beta* can override be used to `build`, `test` or `deploy` configuration.
    54  	Profiles []Profile `yaml:"profiles,omitempty"`
    55  }
    56  
    57  // Metadata holds an optional name of the project.
    58  type Metadata struct {
    59  	// Name is an identifier for the project.
    60  	Name string `yaml:"name,omitempty"`
    61  }
    62  
    63  // Pipeline describes a Skaffold pipeline.
    64  type Pipeline struct {
    65  	// Build describes how images are built.
    66  	Build BuildConfig `yaml:"build,omitempty"`
    67  
    68  	// Test describes how images are tested.
    69  	Test []*TestCase `yaml:"test,omitempty"`
    70  
    71  	// Deploy describes how images are deployed.
    72  	Deploy DeployConfig `yaml:"deploy,omitempty"`
    73  
    74  	// PortForward describes user defined resources to port-forward.
    75  	PortForward []*PortForwardResource `yaml:"portForward,omitempty"`
    76  }
    77  
    78  // GitInfo contains information on the origin of skaffold configurations cloned from a git repository.
    79  type GitInfo struct {
    80  	// Repo is the git repository the package should be cloned from.  e.g. `https://github.com/GoogleContainerTools/skaffold.git`.
    81  	Repo string `yaml:"repo" yamltags:"required"`
    82  
    83  	// Path is the relative path from the repo root to the skaffold configuration file. eg. `getting-started/skaffold.yaml`.
    84  	Path string `yaml:"path,omitempty"`
    85  
    86  	// Ref is the git ref the package should be cloned from. eg. `master` or `main`.
    87  	Ref string `yaml:"ref,omitempty"`
    88  
    89  	// Sync when set to `true` will reset the cached repository to the latest commit from remote on every run. To use the cached repository with uncommitted changes or unpushed commits, it needs to be set to `false`.
    90  	Sync *bool `yaml:"sync,omitempty"`
    91  }
    92  
    93  // ConfigDependency describes a dependency on another skaffold configuration.
    94  type ConfigDependency struct {
    95  	// Names includes specific named configs within the file path. If empty, then all configs in the file are included.
    96  	Names []string `yaml:"configs,omitempty"`
    97  
    98  	// Path describes the path to the file containing the required configs.
    99  	Path string `yaml:"path,omitempty" skaffold:"filepath" yamltags:"oneOf=paths"`
   100  
   101  	// GitRepo describes a remote git repository containing the required configs.
   102  	GitRepo *GitInfo `yaml:"git,omitempty" yamltags:"oneOf=paths"`
   103  
   104  	// ActiveProfiles describes the list of profiles to activate when resolving the required configs. These profiles must exist in the imported config.
   105  	ActiveProfiles []ProfileDependency `yaml:"activeProfiles,omitempty"`
   106  }
   107  
   108  // ProfileDependency describes a mapping from referenced config profiles to the current config profiles.
   109  // If the current config is activated with a profile in this mapping then the dependency configs are also activated with the corresponding mapped profiles.
   110  type ProfileDependency struct {
   111  	// Name describes name of the profile to activate in the dependency config. It should exist in the dependency config.
   112  	Name string `yaml:"name" yamltags:"required"`
   113  
   114  	// ActivatedBy describes a list of profiles in the current config that when activated will also activate the named profile in the dependency config. If empty then the named profile is always activated.
   115  	ActivatedBy []string `yaml:"activatedBy,omitempty"`
   116  }
   117  
   118  func (c *SkaffoldConfig) GetVersion() string {
   119  	return c.APIVersion
   120  }
   121  
   122  // ResourceType describes the Kubernetes resource types used for port forwarding.
   123  type ResourceType string
   124  
   125  // PortForwardResource describes a resource to port forward.
   126  type PortForwardResource struct {
   127  	// Type is the Kubernetes type that should be port forwarded.
   128  	// Acceptable resource types include: `Service`, `Pod` and Controller resource type that has a pod spec: `ReplicaSet`, `ReplicationController`, `Deployment`, `StatefulSet`, `DaemonSet`, `Job`, `CronJob`.
   129  	Type ResourceType `yaml:"resourceType,omitempty"`
   130  
   131  	// Name is the name of the Kubernetes resource to port forward.
   132  	Name string `yaml:"resourceName,omitempty"`
   133  
   134  	// Namespace is the namespace of the resource to port forward.
   135  	Namespace string `yaml:"namespace,omitempty"`
   136  
   137  	// Port is the resource port that will be forwarded.
   138  	Port util.IntOrString `yaml:"port,omitempty"`
   139  
   140  	// Address is the local address to bind to. Defaults to the loopback address 127.0.0.1.
   141  	Address string `yaml:"address,omitempty"`
   142  
   143  	// LocalPort is the local port to forward to. If the port is unavailable, Skaffold will choose a random open port to forward to. *Optional*.
   144  	LocalPort int `yaml:"localPort,omitempty"`
   145  }
   146  
   147  // BuildConfig contains all the configuration for the build steps.
   148  type BuildConfig struct {
   149  	// Artifacts lists the images you're going to be building.
   150  	Artifacts []*Artifact `yaml:"artifacts,omitempty"`
   151  
   152  	// InsecureRegistries is a list of registries declared by the user to be insecure.
   153  	// These registries will be connected to via HTTP instead of HTTPS.
   154  	InsecureRegistries []string `yaml:"insecureRegistries,omitempty"`
   155  
   156  	// TagPolicy *beta* determines how images are tagged.
   157  	// A few strategies are provided here, although you most likely won't need to care!
   158  	// If not specified, it defaults to `gitCommit: {variant: Tags}`.
   159  	TagPolicy TagPolicy `yaml:"tagPolicy,omitempty"`
   160  
   161  	BuildType `yaml:",inline"`
   162  }
   163  
   164  // TagPolicy contains all the configuration for the tagging step.
   165  type TagPolicy struct {
   166  	// GitTagger *beta* tags images with the git tag or commit of the artifact's workspace.
   167  	GitTagger *GitTagger `yaml:"gitCommit,omitempty" yamltags:"oneOf=tag"`
   168  
   169  	// ShaTagger *beta* tags images with their sha256 digest.
   170  	ShaTagger *ShaTagger `yaml:"sha256,omitempty" yamltags:"oneOf=tag"`
   171  
   172  	// EnvTemplateTagger *beta* tags images with a configurable template string.
   173  	EnvTemplateTagger *EnvTemplateTagger `yaml:"envTemplate,omitempty" yamltags:"oneOf=tag"`
   174  
   175  	// DateTimeTagger *beta* tags images with the build timestamp.
   176  	DateTimeTagger *DateTimeTagger `yaml:"dateTime,omitempty" yamltags:"oneOf=tag"`
   177  
   178  	// CustomTemplateTagger *beta* tags images with a configurable template string *composed of other taggers*.
   179  	CustomTemplateTagger *CustomTemplateTagger `yaml:"customTemplate,omitempty" yamltags:"oneOf=tag"`
   180  }
   181  
   182  // ShaTagger *beta* tags images with their sha256 digest.
   183  type ShaTagger struct{}
   184  
   185  // GitTagger *beta* tags images with the git tag or commit of the artifact's workspace.
   186  type GitTagger struct {
   187  	// Variant determines the behavior of the git tagger. Valid variants are:
   188  	// `Tags` (default): use git tags or fall back to abbreviated commit hash.
   189  	// `CommitSha`: use the full git commit sha.
   190  	// `AbbrevCommitSha`: use the abbreviated git commit sha.
   191  	// `TreeSha`: use the full tree hash of the artifact workingdir.
   192  	// `AbbrevTreeSha`: use the abbreviated tree hash of the artifact workingdir.
   193  	Variant string `yaml:"variant,omitempty"`
   194  
   195  	// Prefix adds a fixed prefix to the tag.
   196  	Prefix string `yaml:"prefix,omitempty"`
   197  
   198  	// IgnoreChanges specifies whether to omit the `-dirty` postfix if there are uncommitted changes.
   199  	IgnoreChanges bool `yaml:"ignoreChanges,omitempty"`
   200  }
   201  
   202  // EnvTemplateTagger *beta* tags images with a configurable template string.
   203  type EnvTemplateTagger struct {
   204  	// Template used to produce the image name and tag.
   205  	// See golang [text/template](https://golang.org/pkg/text/template/).
   206  	// The template is executed against the current environment,
   207  	// with those variables injected.
   208  	// For example: `{{.RELEASE}}`.
   209  	Template string `yaml:"template,omitempty" yamltags:"required"`
   210  }
   211  
   212  // DateTimeTagger *beta* tags images with the build timestamp.
   213  type DateTimeTagger struct {
   214  	// Format formats the date and time.
   215  	// See [#Time.Format](https://golang.org/pkg/time/#Time.Format).
   216  	// Defaults to `2006-01-02_15-04-05.999_MST`.
   217  	Format string `yaml:"format,omitempty"`
   218  
   219  	// TimeZone sets the timezone for the date and time.
   220  	// See [Time.LoadLocation](https://golang.org/pkg/time/#Time.LoadLocation).
   221  	// Defaults to the local timezone.
   222  	TimeZone string `yaml:"timezone,omitempty"`
   223  }
   224  
   225  // CustomTemplateTagger *beta* tags images with a configurable template string.
   226  type CustomTemplateTagger struct {
   227  	// Template used to produce the image name and tag.
   228  	// See golang [text/template](https://golang.org/pkg/text/template/).
   229  	// The template is executed against the provided components with those variables injected.
   230  	// For example: `{{.DATE}}` where DATE references a TaggerComponent.
   231  	Template string `yaml:"template,omitempty" yamltags:"required"`
   232  
   233  	// Components lists TaggerComponents that the template (see field above) can be executed against.
   234  	Components []TaggerComponent `yaml:"components,omitempty"`
   235  }
   236  
   237  // TaggerComponent *beta* is a component of CustomTemplateTagger.
   238  type TaggerComponent struct {
   239  	// Name is an identifier for the component.
   240  	Name string `yaml:"name,omitempty"`
   241  
   242  	// Component is a tagging strategy to be used in CustomTemplateTagger.
   243  	Component TagPolicy `yaml:",inline" yamltags:"skipTrim"`
   244  }
   245  
   246  // BuildType contains the specific implementation and parameters needed
   247  // for the build step. Only one field should be populated.
   248  type BuildType struct {
   249  	// LocalBuild *beta* describes how to do a build on the local docker daemon
   250  	// and optionally push to a repository.
   251  	LocalBuild *LocalBuild `yaml:"local,omitempty" yamltags:"oneOf=build"`
   252  
   253  	// GoogleCloudBuild *beta* describes how to do a remote build on
   254  	// [Google Cloud Build](https://cloud.google.com/cloud-build/).
   255  	GoogleCloudBuild *GoogleCloudBuild `yaml:"googleCloudBuild,omitempty" yamltags:"oneOf=build"`
   256  
   257  	// Cluster *beta* describes how to do an on-cluster build.
   258  	Cluster *ClusterDetails `yaml:"cluster,omitempty" yamltags:"oneOf=build"`
   259  }
   260  
   261  // LocalBuild *beta* describes how to do a build on the local docker daemon
   262  // and optionally push to a repository.
   263  type LocalBuild struct {
   264  	// Push should images be pushed to a registry.
   265  	// If not specified, images are pushed only if the current Kubernetes context
   266  	// connects to a remote cluster.
   267  	Push *bool `yaml:"push,omitempty"`
   268  
   269  	// TryImportMissing whether to attempt to import artifacts from
   270  	// Docker (either a local or remote registry) if not in the cache.
   271  	TryImportMissing bool `yaml:"tryImportMissing,omitempty"`
   272  
   273  	// UseDockerCLI use `docker` command-line interface instead of Docker Engine APIs.
   274  	UseDockerCLI bool `yaml:"useDockerCLI,omitempty"`
   275  
   276  	// UseBuildkit use BuildKit to build Docker images. If unspecified, uses the Docker default.
   277  	UseBuildkit *bool `yaml:"useBuildkit,omitempty"`
   278  
   279  	// Concurrency is how many artifacts can be built concurrently. 0 means "no-limit".
   280  	// Defaults to `1`.
   281  	Concurrency *int `yaml:"concurrency,omitempty"`
   282  }
   283  
   284  // GoogleCloudBuild *beta* describes how to do a remote build on
   285  // [Google Cloud Build](https://cloud.google.com/cloud-build/docs/).
   286  // Docker and Jib artifacts can be built on Cloud Build. The `projectId` needs
   287  // to be provided and the currently logged in user should be given permissions to trigger
   288  // new builds.
   289  type GoogleCloudBuild struct {
   290  	// ProjectID is the ID of your Cloud Platform Project.
   291  	// If it is not provided, Skaffold will guess it from the image name.
   292  	// For example, given the artifact image name `gcr.io/myproject/image`, Skaffold
   293  	// will use the `myproject` GCP project.
   294  	ProjectID string `yaml:"projectId,omitempty"`
   295  
   296  	// DiskSizeGb is the disk size of the VM that runs the build.
   297  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#buildoptions).
   298  	DiskSizeGb int64 `yaml:"diskSizeGb,omitempty"`
   299  
   300  	// MachineType is the type of the VM that runs the build.
   301  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#buildoptions).
   302  	MachineType string `yaml:"machineType,omitempty"`
   303  
   304  	// Timeout is the amount of time (in seconds) that this build should be allowed to run.
   305  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#resource-build).
   306  	Timeout string `yaml:"timeout,omitempty"`
   307  
   308  	// Logging specifies the logging mode.
   309  	// Valid modes are:
   310  	// `LOGGING_UNSPECIFIED`: The service determines the logging mode.
   311  	// `LEGACY`: Stackdriver logging and Cloud Storage logging are enabled (default).
   312  	// `GCS_ONLY`: Only Cloud Storage logging is enabled.
   313  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#loggingmode).
   314  	Logging string `yaml:"logging,omitempty"`
   315  
   316  	// LogStreamingOption specifies the behavior when writing build logs to Google Cloud Storage.
   317  	// Valid options are:
   318  	// `STREAM_DEFAULT`: Service may automatically determine build log streaming behavior.
   319  	// `STREAM_ON`:  Build logs should be streamed to Google Cloud Storage.
   320  	// `STREAM_OFF`: Build logs should not be streamed to Google Cloud Storage; they will be written when the build is completed.
   321  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#logstreamingoption).
   322  	LogStreamingOption string `yaml:"logStreamingOption,omitempty"`
   323  
   324  	// DockerImage is the image that runs a Docker build.
   325  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   326  	// Defaults to `gcr.io/cloud-builders/docker`.
   327  	DockerImage string `yaml:"dockerImage,omitempty"`
   328  
   329  	// KanikoImage is the image that runs a Kaniko build.
   330  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   331  	// Defaults to `gcr.io/kaniko-project/executor`.
   332  	KanikoImage string `yaml:"kanikoImage,omitempty"`
   333  
   334  	// MavenImage is the image that runs a Maven build.
   335  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   336  	// Defaults to `gcr.io/cloud-builders/mvn`.
   337  	MavenImage string `yaml:"mavenImage,omitempty"`
   338  
   339  	// GradleImage is the image that runs a Gradle build.
   340  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   341  	// Defaults to `gcr.io/cloud-builders/gradle`.
   342  	GradleImage string `yaml:"gradleImage,omitempty"`
   343  
   344  	// PackImage is the image that runs a Cloud Native Buildpacks build.
   345  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   346  	// Defaults to `gcr.io/k8s-skaffold/pack`.
   347  	PackImage string `yaml:"packImage,omitempty"`
   348  
   349  	// Concurrency is how many artifacts can be built concurrently. 0 means "no-limit".
   350  	// Defaults to `0`.
   351  	Concurrency int `yaml:"concurrency,omitempty"`
   352  
   353  	// WorkerPool configures a pool of workers to run the build.
   354  	WorkerPool string `yaml:"workerPool,omitempty"`
   355  }
   356  
   357  // KanikoCache configures Kaniko caching. If a cache is specified, Kaniko will
   358  // use a remote cache which will speed up builds.
   359  type KanikoCache struct {
   360  	// Repo is a remote repository to store cached layers. If none is specified, one will be
   361  	// inferred from the image name. See [Kaniko Caching](https://github.com/GoogleContainerTools/kaniko#caching).
   362  	Repo string `yaml:"repo,omitempty"`
   363  	// HostPath specifies a path on the host that is mounted to each pod as read only cache volume containing base images.
   364  	// If set, must exist on each node and prepopulated with kaniko-warmer.
   365  	HostPath string `yaml:"hostPath,omitempty"`
   366  	// TTL Cache timeout in hours.
   367  	TTL string `yaml:"ttl,omitempty"`
   368  }
   369  
   370  // ClusterDetails *beta* describes how to do an on-cluster build.
   371  type ClusterDetails struct {
   372  	// HTTPProxy for kaniko pod.
   373  	HTTPProxy string `yaml:"HTTP_PROXY,omitempty"`
   374  
   375  	// HTTPSProxy for kaniko pod.
   376  	HTTPSProxy string `yaml:"HTTPS_PROXY,omitempty"`
   377  
   378  	// PullSecretPath is the path to the Google Cloud service account secret key file.
   379  	PullSecretPath string `yaml:"pullSecretPath,omitempty"`
   380  
   381  	// PullSecretName is the name of the Kubernetes secret for pulling base images
   382  	// and pushing the final image. If given, the secret needs to contain the Google Cloud
   383  	// service account secret key under the key `kaniko-secret`.
   384  	// Defaults to `kaniko-secret`.
   385  	PullSecretName string `yaml:"pullSecretName,omitempty"`
   386  
   387  	// PullSecretMountPath is the path the pull secret will be mounted at within the running container.
   388  	PullSecretMountPath string `yaml:"pullSecretMountPath,omitempty"`
   389  
   390  	// Namespace is the Kubernetes namespace.
   391  	// Defaults to current namespace in Kubernetes configuration.
   392  	Namespace string `yaml:"namespace,omitempty"`
   393  
   394  	// Timeout is the amount of time (in seconds) that this build is allowed to run.
   395  	// Defaults to 20 minutes (`20m`).
   396  	Timeout string `yaml:"timeout,omitempty"`
   397  
   398  	// DockerConfig describes how to mount the local Docker configuration into a pod.
   399  	DockerConfig *DockerConfig `yaml:"dockerConfig,omitempty"`
   400  
   401  	// ServiceAccountName describes the Kubernetes service account to use for the pod.
   402  	// Defaults to 'default'.
   403  	ServiceAccountName string `yaml:"serviceAccount,omitempty"`
   404  
   405  	// Tolerations describes the Kubernetes tolerations for the pod.
   406  	Tolerations []v1.Toleration `yaml:"tolerations,omitempty"`
   407  
   408  	// Annotations describes the Kubernetes annotations for the pod.
   409  	Annotations map[string]string `yaml:"annotations,omitempty"`
   410  
   411  	// RunAsUser defines the UID to request for running the container.
   412  	// If omitted, no SecurityContext will be specified for the pod and will therefore be inherited
   413  	// from the service account.
   414  	RunAsUser *int64 `yaml:"runAsUser,omitempty"`
   415  
   416  	// Resources define the resource requirements for the kaniko pod.
   417  	Resources *ResourceRequirements `yaml:"resources,omitempty"`
   418  
   419  	// Concurrency is how many artifacts can be built concurrently. 0 means "no-limit".
   420  	// Defaults to `0`.
   421  	Concurrency int `yaml:"concurrency,omitempty"`
   422  
   423  	// Volumes defines container mounts for ConfigMap and Secret resources.
   424  	Volumes []v1.Volume `yaml:"volumes,omitempty"`
   425  
   426  	// RandomPullSecret adds a random UUID postfix to the default name of the pull secret to facilitate parallel builds, e.g. kaniko-secretdocker-cfgfd154022-c761-416f-8eb3-cf8258450b85.
   427  	RandomPullSecret bool `yaml:"randomPullSecret,omitempty"`
   428  
   429  	// RandomDockerConfigSecret adds a random UUID postfix to the default name of the docker secret to facilitate parallel builds, e.g. docker-cfgfd154022-c761-416f-8eb3-cf8258450b85.
   430  	RandomDockerConfigSecret bool `yaml:"randomDockerConfigSecret,omitempty"`
   431  }
   432  
   433  // DockerConfig contains information about the docker `config.json` to mount.
   434  type DockerConfig struct {
   435  	// Path is the path to the docker `config.json`.
   436  	Path string `yaml:"path,omitempty"`
   437  
   438  	// SecretName is the Kubernetes secret that contains the `config.json` Docker configuration.
   439  	// Note that the expected secret type is not 'kubernetes.io/dockerconfigjson' but 'Opaque'.
   440  	SecretName string `yaml:"secretName,omitempty"`
   441  }
   442  
   443  // ResourceRequirements describes the resource requirements for the kaniko pod.
   444  type ResourceRequirements struct {
   445  	// Requests [resource requests](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container) for the Kaniko pod.
   446  	Requests *ResourceRequirement `yaml:"requests,omitempty"`
   447  
   448  	// Limits [resource limits](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container) for the Kaniko pod.
   449  	Limits *ResourceRequirement `yaml:"limits,omitempty"`
   450  }
   451  
   452  // ResourceRequirement stores the CPU/Memory requirements for the pod.
   453  type ResourceRequirement struct {
   454  	// CPU the number cores to be used.
   455  	// For example: `2`, `2.0` or `200m`.
   456  	CPU string `yaml:"cpu,omitempty"`
   457  
   458  	// Memory the amount of memory to allocate to the pod.
   459  	// For example: `1Gi` or `1000Mi`.
   460  	Memory string `yaml:"memory,omitempty"`
   461  
   462  	// EphemeralStorage the amount of Ephemeral storage to allocate to the pod.
   463  	// For example: `1Gi` or `1000Mi`.
   464  	EphemeralStorage string `yaml:"ephemeralStorage,omitempty"`
   465  
   466  	// ResourceStorage the amount of resource storage to allocate to the pod.
   467  	// For example: `1Gi` or `1000Mi`.
   468  	ResourceStorage string `yaml:"resourceStorage,omitempty"`
   469  }
   470  
   471  // TestCase is a list of tests to run on images that Skaffold builds.
   472  type TestCase struct {
   473  	// ImageName is the artifact on which to run those tests.
   474  	// For example: `gcr.io/k8s-skaffold/example`.
   475  	ImageName string `yaml:"image" yamltags:"required"`
   476  
   477  	// CustomTests lists the set of custom tests to run after an artifact is built.
   478  	CustomTests []CustomTest `yaml:"custom,omitempty"`
   479  
   480  	// StructureTests lists the [Container Structure Tests](https://github.com/GoogleContainerTools/container-structure-test)
   481  	// to run on that artifact.
   482  	// For example: `["./test/*"]`.
   483  	StructureTests []string `yaml:"structureTests,omitempty"`
   484  }
   485  
   486  // DeployConfig contains all the configuration needed by the deploy steps.
   487  type DeployConfig struct {
   488  	DeployType `yaml:",inline"`
   489  
   490  	// StatusCheckDeadlineSeconds *beta* is the deadline for deployments to stabilize in seconds.
   491  	StatusCheckDeadlineSeconds int `yaml:"statusCheckDeadlineSeconds,omitempty"`
   492  
   493  	// KubeContext is the Kubernetes context that Skaffold should deploy to.
   494  	// For example: `minikube`.
   495  	KubeContext string `yaml:"kubeContext,omitempty"`
   496  
   497  	// Logs configures how container logs are printed as a result of a deployment.
   498  	Logs LogsConfig `yaml:"logs,omitempty"`
   499  }
   500  
   501  // DeployType contains the specific implementation and parameters needed
   502  // for the deploy step. All three deployer types can be used at the same
   503  // time for hybrid workflows.
   504  type DeployType struct {
   505  	// HelmDeploy *beta* uses the `helm` CLI to apply the charts to the cluster.
   506  	HelmDeploy *HelmDeploy `yaml:"helm,omitempty"`
   507  
   508  	// KptDeploy *alpha* uses the `kpt` CLI to manage and deploy manifests.
   509  	KptDeploy *KptDeploy `yaml:"kpt,omitempty"`
   510  
   511  	// KubectlDeploy *beta* uses a client side `kubectl apply` to deploy manifests.
   512  	// You'll need a `kubectl` CLI version installed that's compatible with your cluster.
   513  	KubectlDeploy *KubectlDeploy `yaml:"kubectl,omitempty"`
   514  
   515  	// KustomizeDeploy *beta* uses the `kustomize` CLI to "patch" a deployment for a target environment.
   516  	KustomizeDeploy *KustomizeDeploy `yaml:"kustomize,omitempty"`
   517  }
   518  
   519  // KubectlDeploy *beta* uses a client side `kubectl apply` to deploy manifests.
   520  // You'll need a `kubectl` CLI version installed that's compatible with your cluster.
   521  type KubectlDeploy struct {
   522  	// Manifests lists the Kubernetes yaml or json manifests.
   523  	// Defaults to `["k8s/*.yaml"]`.
   524  	Manifests []string `yaml:"manifests,omitempty" skaffold:"filepath"`
   525  
   526  	// RemoteManifests lists Kubernetes manifests in remote clusters.
   527  	RemoteManifests []string `yaml:"remoteManifests,omitempty"`
   528  
   529  	// Flags are additional flags passed to `kubectl`.
   530  	Flags KubectlFlags `yaml:"flags,omitempty"`
   531  
   532  	// DefaultNamespace is the default namespace passed to kubectl on deployment if no other override is given.
   533  	DefaultNamespace *string `yaml:"defaultNamespace,omitempty"`
   534  }
   535  
   536  // KubectlFlags are additional flags passed on the command
   537  // line to kubectl either on every command (Global), on creations (Apply)
   538  // or deletions (Delete).
   539  type KubectlFlags struct {
   540  	// Global are additional flags passed on every command.
   541  	Global []string `yaml:"global,omitempty"`
   542  
   543  	// Apply are additional flags passed on creations (`kubectl apply`).
   544  	Apply []string `yaml:"apply,omitempty"`
   545  
   546  	// Delete are additional flags passed on deletions (`kubectl delete`).
   547  	Delete []string `yaml:"delete,omitempty"`
   548  
   549  	// DisableValidation passes the `--validate=false` flag to supported
   550  	// `kubectl` commands when enabled.
   551  	DisableValidation bool `yaml:"disableValidation,omitempty"`
   552  }
   553  
   554  // HelmDeploy *beta* uses the `helm` CLI to apply the charts to the cluster.
   555  type HelmDeploy struct {
   556  	// Releases is a list of Helm releases.
   557  	Releases []HelmRelease `yaml:"releases,omitempty" yamltags:"required"`
   558  
   559  	// Flags are additional option flags that are passed on the command
   560  	// line to `helm`.
   561  	Flags HelmDeployFlags `yaml:"flags,omitempty"`
   562  }
   563  
   564  // HelmDeployFlags are additional option flags that are passed on the command
   565  // line to `helm`.
   566  type HelmDeployFlags struct {
   567  	// Global are additional flags passed on every command.
   568  	Global []string `yaml:"global,omitempty"`
   569  
   570  	// Install are additional flags passed to (`helm install`).
   571  	Install []string `yaml:"install,omitempty"`
   572  
   573  	// Upgrade are additional flags passed to (`helm upgrade`).
   574  	Upgrade []string `yaml:"upgrade,omitempty"`
   575  }
   576  
   577  // KustomizeDeploy *beta* uses the `kustomize` CLI to "patch" a deployment for a target environment.
   578  type KustomizeDeploy struct {
   579  	// KustomizePaths is the path to Kustomization files.
   580  	// Defaults to `["."]`.
   581  	KustomizePaths []string `yaml:"paths,omitempty" skaffold:"filepath"`
   582  
   583  	// Flags are additional flags passed to `kubectl`.
   584  	Flags KubectlFlags `yaml:"flags,omitempty"`
   585  
   586  	// BuildArgs are additional args passed to `kustomize build`.
   587  	BuildArgs []string `yaml:"buildArgs,omitempty"`
   588  
   589  	// DefaultNamespace is the default namespace passed to kubectl on deployment if no other override is given.
   590  	DefaultNamespace *string `yaml:"defaultNamespace,omitempty"`
   591  }
   592  
   593  // KptDeploy *alpha* uses the `kpt` CLI to manage and deploy manifests.
   594  type KptDeploy struct {
   595  	// Dir is the path to the config directory (Required).
   596  	// By default, the Dir contains the application configurations,
   597  	// [kustomize config files](https://kubectl.docs.kubernetes.io/pages/examples/kustomize.html)
   598  	// and [declarative kpt functions](https://googlecontainertools.github.io/kpt/guides/consumer/function/#declarative-run).
   599  	Dir string `yaml:"dir" yamltags:"required" skaffold:"filepath"`
   600  
   601  	// Fn adds additional configurations for `kpt fn`.
   602  	Fn KptFn `yaml:"fn,omitempty"`
   603  
   604  	// Live adds additional configurations for `kpt live`.
   605  	Live KptLive `yaml:"live,omitempty"`
   606  }
   607  
   608  // KptFn adds additional configurations used when calling `kpt fn`.
   609  type KptFn struct {
   610  	// FnPath is the directory to discover the declarative kpt functions.
   611  	// If not provided, kpt deployer uses `kpt.Dir`.
   612  	FnPath string `yaml:"fnPath,omitempty" skaffold:"filepath"`
   613  
   614  	// Image is a kpt function image to run the configs imperatively. If provided, kpt.fn.fnPath
   615  	// will be ignored.
   616  	Image string `yaml:"image,omitempty"`
   617  
   618  	// NetworkName is the docker network name to run the kpt function containers (default "bridge").
   619  	NetworkName string `yaml:"networkName,omitempty"`
   620  
   621  	// GlobalScope sets the global scope for the kpt functions. see `kpt help fn run`.
   622  	GlobalScope bool `yaml:"globalScope,omitempty"`
   623  
   624  	// Network enables network access for the kpt function containers.
   625  	Network bool `yaml:"network,omitempty"`
   626  
   627  	// Mount is a list of storage options to mount to the fn image.
   628  	Mount []string `yaml:"mount,omitempty"`
   629  
   630  	// SinkDir is the directory to where the manipulated resource output is stored.
   631  	SinkDir string `yaml:"sinkDir,omitempty" skaffold:"filepath"`
   632  }
   633  
   634  // KptLive adds additional configurations used when calling `kpt live`.
   635  type KptLive struct {
   636  	// Apply sets the kpt inventory directory.
   637  	Apply KptApplyInventory `yaml:"apply,omitempty"`
   638  
   639  	// Options adds additional configurations for `kpt live apply` commands.
   640  	Options KptApplyOptions `yaml:"options,omitempty"`
   641  }
   642  
   643  // KptApplyInventory sets the kpt inventory directory.
   644  type KptApplyInventory struct {
   645  	// Dir is equivalent to the dir in `kpt live apply <dir>`. If not provided,
   646  	// kpt deployer will create a hidden directory `.kpt-hydrated` to store the manipulated
   647  	// resource output and the kpt inventory-template.yaml file.
   648  	Dir string `yaml:"dir,omitempty"`
   649  
   650  	// InventoryID *alpha* is the identifier for a group of applied resources.
   651  	// This value is only needed when the `kpt live` is working on a pre-applied cluster resources.
   652  	InventoryID string `yaml:"inventoryID,omitempty"`
   653  
   654  	// InventoryNamespace *alpha* sets the inventory namespace.
   655  	InventoryNamespace string `yaml:"inventoryNamespace,omitempty"`
   656  }
   657  
   658  // KptApplyOptions adds additional configurations used when calling `kpt live apply`.
   659  type KptApplyOptions struct {
   660  	// PollPeriod sets for the polling period for resource statuses. Default to 2s.
   661  	PollPeriod string `yaml:"pollPeriod,omitempty"`
   662  
   663  	// PrunePropagationPolicy sets the propagation policy for pruning.
   664  	// Possible settings are Background, Foreground, Orphan.
   665  	// Default to "Background".
   666  	PrunePropagationPolicy string `yaml:"prunePropagationPolicy,omitempty"`
   667  
   668  	// PruneTimeout sets the time threshold to wait for all pruned resources to be deleted.
   669  	PruneTimeout string `yaml:"pruneTimeout,omitempty"`
   670  
   671  	// ReconcileTimeout sets the time threshold to wait for all resources to reach the current status.
   672  	ReconcileTimeout string `yaml:"reconcileTimeout,omitempty"`
   673  }
   674  
   675  // HelmRelease describes a helm release to be deployed.
   676  type HelmRelease struct {
   677  	// Name is the name of the Helm release.
   678  	// It accepts environment variables via the go template syntax.
   679  	Name string `yaml:"name,omitempty" yamltags:"required"`
   680  
   681  	// ChartPath is the local path to a packaged Helm chart or an unpacked Helm chart directory.
   682  	ChartPath string `yaml:"chartPath,omitempty" yamltags:"oneOf=chartSource" skaffold:"filepath"`
   683  
   684  	// RemoteChart refers to a remote Helm chart reference or URL.
   685  	RemoteChart string `yaml:"remoteChart,omitempty" yamltags:"oneOf=chartSource"`
   686  
   687  	// ValuesFiles are the paths to the Helm `values` files.
   688  	ValuesFiles []string `yaml:"valuesFiles,omitempty" skaffold:"filepath"`
   689  
   690  	// ArtifactOverrides are key value pairs where the
   691  	// key represents the parameter used in the `--set-string` Helm CLI flag to define a container
   692  	// image and the value corresponds to artifact i.e. `ImageName` defined in `Build.Artifacts` section.
   693  	// The resulting command-line is controlled by `ImageStrategy`.
   694  	ArtifactOverrides util.FlatMap `yaml:"artifactOverrides,omitempty"`
   695  
   696  	// Namespace is the Kubernetes namespace.
   697  	Namespace string `yaml:"namespace,omitempty"`
   698  
   699  	// Version is the version of the chart.
   700  	Version string `yaml:"version,omitempty"`
   701  
   702  	// SetValues are key-value pairs.
   703  	// If present, Skaffold will send `--set` flag to Helm CLI and append all pairs after the flag.
   704  	SetValues util.FlatMap `yaml:"setValues,omitempty"`
   705  
   706  	// SetValueTemplates are key-value pairs.
   707  	// If present, Skaffold will try to parse the value part of each key-value pair using
   708  	// environment variables in the system, then send `--set` flag to Helm CLI and append
   709  	// all parsed pairs after the flag.
   710  	SetValueTemplates util.FlatMap `yaml:"setValueTemplates,omitempty"`
   711  
   712  	// SetFiles are key-value pairs.
   713  	// If present, Skaffold will send `--set-file` flag to Helm CLI and append all pairs after the flag.
   714  	SetFiles map[string]string `yaml:"setFiles,omitempty" skaffold:"filepath"`
   715  
   716  	// CreateNamespace if `true`, Skaffold will send `--create-namespace` flag to Helm CLI.
   717  	// `--create-namespace` flag is available in Helm since version 3.2.
   718  	// Defaults is `false`.
   719  	CreateNamespace *bool `yaml:"createNamespace,omitempty"`
   720  
   721  	// Wait if `true`, Skaffold will send `--wait` flag to Helm CLI.
   722  	// Defaults to `false`.
   723  	Wait bool `yaml:"wait,omitempty"`
   724  
   725  	// RecreatePods if `true`, Skaffold will send `--recreate-pods` flag to Helm CLI
   726  	// when upgrading a new version of a chart in subsequent dev loop deploy.
   727  	// Defaults to `false`.
   728  	RecreatePods bool `yaml:"recreatePods,omitempty"`
   729  
   730  	// SkipBuildDependencies should build dependencies be skipped.
   731  	// Ignored when `remote: true`.
   732  	SkipBuildDependencies bool `yaml:"skipBuildDependencies,omitempty"`
   733  
   734  	// UseHelmSecrets instructs skaffold to use secrets plugin on deployment.
   735  	UseHelmSecrets bool `yaml:"useHelmSecrets,omitempty"`
   736  
   737  	// Repo specifies the helm repository for remote charts.
   738  	// If present, Skaffold will send `--repo` Helm CLI flag or flags.
   739  	Repo string `yaml:"repo,omitempty"`
   740  
   741  	// UpgradeOnChange specifies whether to upgrade helm chart on code changes.
   742  	// Default is `true` when helm chart is local (`remote: false`).
   743  	// Default is `false` if `remote: true`.
   744  	UpgradeOnChange *bool `yaml:"upgradeOnChange,omitempty"`
   745  
   746  	// Overrides are key-value pairs.
   747  	// If present, Skaffold will build a Helm `values` file that overrides
   748  	// the original and use it to call Helm CLI (`--f` flag).
   749  	Overrides util.HelmOverrides `yaml:"overrides,omitempty"`
   750  
   751  	// Packaged parameters for packaging helm chart (`helm package`).
   752  	Packaged *HelmPackaged `yaml:"packaged,omitempty"`
   753  
   754  	// ImageStrategy controls how an `ArtifactOverrides` entry is
   755  	// turned into `--set-string` Helm CLI flag or flags.
   756  	ImageStrategy HelmImageStrategy `yaml:"imageStrategy,omitempty"`
   757  }
   758  
   759  // HelmPackaged parameters for packaging helm chart (`helm package`).
   760  type HelmPackaged struct {
   761  	// Version sets the `version` on the chart to this semver version.
   762  	Version string `yaml:"version,omitempty"`
   763  
   764  	// AppVersion sets the `appVersion` on the chart to this version.
   765  	AppVersion string `yaml:"appVersion,omitempty"`
   766  }
   767  
   768  // HelmImageStrategy adds image configurations to the Helm `values` file.
   769  type HelmImageStrategy struct {
   770  	HelmImageConfig `yaml:",inline"`
   771  }
   772  
   773  // HelmImageConfig describes an image configuration.
   774  type HelmImageConfig struct {
   775  	// HelmFQNConfig is the image configuration uses the syntax `IMAGE-NAME=IMAGE-REPOSITORY:IMAGE-TAG`.
   776  	HelmFQNConfig *HelmFQNConfig `yaml:"fqn,omitempty" yamltags:"oneOf=helmImageStrategy"`
   777  
   778  	// HelmConventionConfig is the image configuration uses the syntax `IMAGE-NAME.repository=IMAGE-REPOSITORY, IMAGE-NAME.tag=IMAGE-TAG`.
   779  	HelmConventionConfig *HelmConventionConfig `yaml:"helm,omitempty" yamltags:"oneOf=helmImageStrategy"`
   780  }
   781  
   782  // HelmFQNConfig is the image config to use the FullyQualifiedImageName as param to set.
   783  type HelmFQNConfig struct {
   784  	// Property defines the image config.
   785  	Property string `yaml:"property,omitempty"`
   786  }
   787  
   788  // HelmConventionConfig is the image config in the syntax of image.repository and image.tag.
   789  type HelmConventionConfig struct {
   790  	// ExplicitRegistry separates `image.registry` to the image config syntax. Useful for some charts e.g. `postgresql`.
   791  	ExplicitRegistry bool `yaml:"explicitRegistry,omitempty"`
   792  }
   793  
   794  // LogsConfig configures how container logs are printed as a result of a deployment.
   795  type LogsConfig struct {
   796  	// Prefix defines the prefix shown on each log line. Valid values are
   797  	// `container`: prefix logs lines with the name of the container.
   798  	// `podAndContainer`: prefix logs lines with the names of the pod and of the container.
   799  	// `auto`: same as `podAndContainer` except that the pod name is skipped if it's the same as the container name.
   800  	// `none`: don't add a prefix.
   801  	// Defaults to `auto`.
   802  	Prefix string `yaml:"prefix,omitempty"`
   803  }
   804  
   805  // Artifact are the items that need to be built, along with the context in which
   806  // they should be built.
   807  type Artifact struct {
   808  	// ImageName is the name of the image to be built.
   809  	// For example: `gcr.io/k8s-skaffold/example`.
   810  	ImageName string `yaml:"image,omitempty" yamltags:"required"`
   811  
   812  	// Workspace is the directory containing the artifact's sources.
   813  	// Defaults to `.`.
   814  	Workspace string `yaml:"context,omitempty" skaffold:"filepath"`
   815  
   816  	// Sync *beta* lists local files synced to pods instead
   817  	// of triggering an image build when modified.
   818  	// If no files are listed, sync all the files and infer the destination.
   819  	// Defaults to `infer: ["**/*"]`.
   820  	Sync *Sync `yaml:"sync,omitempty"`
   821  
   822  	// ArtifactType describes how to build an artifact.
   823  	ArtifactType `yaml:",inline"`
   824  
   825  	// Dependencies describes build artifacts that this artifact depends on.
   826  	Dependencies []*ArtifactDependency `yaml:"requires,omitempty"`
   827  }
   828  
   829  // Sync *beta* specifies what files to sync into the container.
   830  // This is a list of sync rules indicating the intent to sync for source files.
   831  // If no files are listed, sync all the files and infer the destination.
   832  // Defaults to `infer: ["**/*"]`.
   833  type Sync struct {
   834  	// Manual lists manual sync rules indicating the source and destination.
   835  	Manual []*SyncRule `yaml:"manual,omitempty" yamltags:"oneOf=sync"`
   836  
   837  	// Infer lists file patterns which may be synced into the container
   838  	// The container destination is inferred by the builder
   839  	// based on the instructions of a Dockerfile.
   840  	// Available for docker and kaniko artifacts and custom
   841  	// artifacts that declare dependencies on a dockerfile.
   842  	Infer []string `yaml:"infer,omitempty" yamltags:"oneOf=sync"`
   843  
   844  	// Auto delegates discovery of sync rules to the build system.
   845  	// Only available for jib and buildpacks.
   846  	Auto *bool `yaml:"auto,omitempty" yamltags:"oneOf=sync"`
   847  }
   848  
   849  // SyncRule specifies which local files to sync to remote folders.
   850  type SyncRule struct {
   851  	// Src is a glob pattern to match local paths against.
   852  	// Directories should be delimited by `/` on all platforms.
   853  	// For example: `"css/**/*.css"`.
   854  	Src string `yaml:"src,omitempty" yamltags:"required"`
   855  
   856  	// Dest is the destination path in the container where the files should be synced to.
   857  	// For example: `"app/"`
   858  	Dest string `yaml:"dest,omitempty" yamltags:"required"`
   859  
   860  	// Strip specifies the path prefix to remove from the source path when
   861  	// transplanting the files into the destination folder.
   862  	// For example: `"css/"`
   863  	Strip string `yaml:"strip,omitempty"`
   864  }
   865  
   866  // Profile is used to override any `build`, `test` or `deploy` configuration.
   867  type Profile struct {
   868  	// Name is a unique profile name.
   869  	// For example: `profile-prod`.
   870  	Name string `yaml:"name,omitempty" yamltags:"required"`
   871  
   872  	// Activation criteria by which a profile can be auto-activated.
   873  	// The profile is auto-activated if any one of the activations are triggered.
   874  	// An activation is triggered if all of the criteria (env, kubeContext, command) are triggered.
   875  	Activation []Activation `yaml:"activation,omitempty"`
   876  
   877  	// Patches lists patches applied to the configuration.
   878  	// Patches use the JSON patch notation.
   879  	Patches []JSONPatch `yaml:"patches,omitempty"`
   880  
   881  	// Pipeline contains the definitions to replace the default skaffold pipeline.
   882  	Pipeline `yaml:",inline"`
   883  }
   884  
   885  // JSONPatch patch to be applied by a profile.
   886  type JSONPatch struct {
   887  	// Op is the operation carried by the patch: `add`, `remove`, `replace`, `move`, `copy` or `test`.
   888  	// Defaults to `replace`.
   889  	Op string `yaml:"op,omitempty"`
   890  
   891  	// Path is the position in the yaml where the operation takes place.
   892  	// For example, this targets the `dockerfile` of the first artifact built.
   893  	// For example: `/build/artifacts/0/docker/dockerfile`.
   894  	Path string `yaml:"path,omitempty" yamltags:"required"`
   895  
   896  	// From is the source position in the yaml, used for `copy` or `move` operations.
   897  	From string `yaml:"from,omitempty"`
   898  
   899  	// Value is the value to apply. Can be any portion of yaml.
   900  	Value *util.YamlpatchNode `yaml:"value,omitempty"`
   901  }
   902  
   903  // Activation criteria by which a profile is auto-activated.
   904  type Activation struct {
   905  	// Env is a `key=pattern` pair. The profile is auto-activated if an Environment
   906  	// Variable `key` matches the pattern. If the pattern starts with `!`, activation
   907  	// happens if the remaining pattern is _not_ matched. The pattern matches if the
   908  	// Environment Variable value is exactly `pattern`, or the regex `pattern` is
   909  	// found in it. An empty `pattern` (e.g. `env: "key="`) always only matches if
   910  	// the Environment Variable is undefined or empty.
   911  	// For example: `ENV=production`
   912  	Env string `yaml:"env,omitempty"`
   913  
   914  	// KubeContext is a Kubernetes context for which the profile is auto-activated.
   915  	// For example: `minikube`.
   916  	KubeContext string `yaml:"kubeContext,omitempty"`
   917  
   918  	// Command is a Skaffold command for which the profile is auto-activated.
   919  	// For example: `dev`.
   920  	Command string `yaml:"command,omitempty"`
   921  }
   922  
   923  // ArtifactType describes how to build an artifact.
   924  type ArtifactType struct {
   925  	// DockerArtifact *beta* describes an artifact built from a Dockerfile.
   926  	DockerArtifact *DockerArtifact `yaml:"docker,omitempty" yamltags:"oneOf=artifact"`
   927  
   928  	// BazelArtifact *beta* requires bazel CLI to be installed and the sources to
   929  	// contain [Bazel](https://bazel.build/) configuration files.
   930  	BazelArtifact *BazelArtifact `yaml:"bazel,omitempty" yamltags:"oneOf=artifact"`
   931  
   932  	// JibArtifact builds images using the
   933  	// [Jib plugins for Maven or Gradle](https://github.com/GoogleContainerTools/jib/).
   934  	JibArtifact *JibArtifact `yaml:"jib,omitempty" yamltags:"oneOf=artifact"`
   935  
   936  	// KanikoArtifact builds images using [kaniko](https://github.com/GoogleContainerTools/kaniko).
   937  	KanikoArtifact *KanikoArtifact `yaml:"kaniko,omitempty" yamltags:"oneOf=artifact"`
   938  
   939  	// BuildpackArtifact builds images using [Cloud Native Buildpacks](https://buildpacks.io/).
   940  	BuildpackArtifact *BuildpackArtifact `yaml:"buildpacks,omitempty" yamltags:"oneOf=artifact"`
   941  
   942  	// CustomArtifact *beta* builds images using a custom build script written by the user.
   943  	CustomArtifact *CustomArtifact `yaml:"custom,omitempty" yamltags:"oneOf=artifact"`
   944  }
   945  
   946  // ArtifactDependency describes a specific build dependency for an artifact.
   947  type ArtifactDependency struct {
   948  	// ImageName is a reference to an artifact's image name.
   949  	ImageName string `yaml:"image" yamltags:"required"`
   950  	// Alias is a token that is replaced with the image reference in the builder definition files.
   951  	// For example, the `docker` builder will use the alias as a build-arg key.
   952  	// Defaults to the value of `image`.
   953  	Alias string `yaml:"alias,omitempty"`
   954  }
   955  
   956  // BuildpackArtifact *alpha* describes an artifact built using [Cloud Native Buildpacks](https://buildpacks.io/).
   957  // It can be used to build images out of project's sources without any additional configuration.
   958  type BuildpackArtifact struct {
   959  	// Builder is the builder image used.
   960  	Builder string `yaml:"builder" yamltags:"required"`
   961  
   962  	// RunImage overrides the stack's default run image.
   963  	RunImage string `yaml:"runImage,omitempty"`
   964  
   965  	// Env are environment variables, in the `key=value` form,  passed to the build.
   966  	// Values can use the go template syntax.
   967  	// For example: `["key1=value1", "key2=value2", "key3={{.ENV_VARIABLE}}"]`.
   968  	Env []string `yaml:"env,omitempty"`
   969  
   970  	// Buildpacks is a list of strings, where each string is a specific buildpack to use with the builder.
   971  	// If you specify buildpacks the builder image automatic detection will be ignored. These buildpacks will be used to build the Image from your source code.
   972  	// Order matters.
   973  	Buildpacks []string `yaml:"buildpacks,omitempty"`
   974  
   975  	// TrustBuilder indicates that the builder should be trusted.
   976  	TrustBuilder bool `yaml:"trustBuilder,omitempty"`
   977  
   978  	// ProjectDescriptor is the path to the project descriptor file.
   979  	// Defaults to `project.toml` if it exists.
   980  	ProjectDescriptor string `yaml:"projectDescriptor,omitempty"`
   981  
   982  	// Dependencies are the file dependencies that skaffold should watch for both rebuilding and file syncing for this artifact.
   983  	Dependencies *BuildpackDependencies `yaml:"dependencies,omitempty"`
   984  }
   985  
   986  // BuildpackDependencies *alpha* is used to specify dependencies for an artifact built by buildpacks.
   987  type BuildpackDependencies struct {
   988  	// Paths should be set to the file dependencies for this artifact, so that the skaffold file watcher knows when to rebuild and perform file synchronization.
   989  	Paths []string `yaml:"paths,omitempty" yamltags:"oneOf=dependency"`
   990  
   991  	// Ignore specifies the paths that should be ignored by skaffold's file watcher. If a file exists in both `paths` and in `ignore`, it will be ignored, and will be excluded from both rebuilds and file synchronization.
   992  	// Will only work in conjunction with `paths`.
   993  	Ignore []string `yaml:"ignore,omitempty"`
   994  }
   995  
   996  // CustomArtifact *beta* describes an artifact built from a custom build script
   997  // written by the user. It can be used to build images with builders that aren't directly integrated with skaffold.
   998  type CustomArtifact struct {
   999  	// BuildCommand is the command executed to build the image.
  1000  	BuildCommand string `yaml:"buildCommand,omitempty"`
  1001  	// Dependencies are the file dependencies that skaffold should watch for both rebuilding and file syncing for this artifact.
  1002  	Dependencies *CustomDependencies `yaml:"dependencies,omitempty"`
  1003  }
  1004  
  1005  // CustomDependencies *beta* is used to specify dependencies for an artifact built by a custom build script.
  1006  // Either `dockerfile` or `paths` should be specified for file watching to work as expected.
  1007  type CustomDependencies struct {
  1008  	// Dockerfile should be set if the artifact is built from a Dockerfile, from which skaffold can determine dependencies.
  1009  	Dockerfile *DockerfileDependency `yaml:"dockerfile,omitempty" yamltags:"oneOf=dependency"`
  1010  
  1011  	// Command represents a custom command that skaffold executes to obtain dependencies. The output of this command *must* be a valid JSON array.
  1012  	Command string `yaml:"command,omitempty" yamltags:"oneOf=dependency"`
  1013  
  1014  	// Paths should be set to the file dependencies for this artifact, so that the skaffold file watcher knows when to rebuild and perform file synchronization.
  1015  	Paths []string `yaml:"paths,omitempty" yamltags:"oneOf=dependency"`
  1016  
  1017  	// Ignore specifies the paths that should be ignored by skaffold's file watcher. If a file exists in both `paths` and in `ignore`, it will be ignored, and will be excluded from both rebuilds and file synchronization.
  1018  	// Will only work in conjunction with `paths`.
  1019  	Ignore []string `yaml:"ignore,omitempty"`
  1020  }
  1021  
  1022  // CustomTest describes the custom test command provided by the user.
  1023  // Custom tests are run after an image build whenever build or test dependencies are changed.
  1024  type CustomTest struct {
  1025  	// Command is the custom command to be executed.  If the command exits with a non-zero return
  1026  	// code, the test will be considered to have failed.
  1027  	Command string `yaml:"command" yamltags:"required"`
  1028  
  1029  	// TimeoutSeconds sets the wait time for skaffold for the command to complete.
  1030  	// If unset or 0, Skaffold will wait until the command completes.
  1031  	TimeoutSeconds int `yaml:"timeoutSeconds,omitempty"`
  1032  
  1033  	// Dependencies are additional test-specific file dependencies; changes to these files will re-run this test.
  1034  	Dependencies *CustomTestDependencies `yaml:"dependencies,omitempty"`
  1035  }
  1036  
  1037  // CustomTestDependencies is used to specify dependencies for custom test command.
  1038  // `paths` should be specified for file watching to work as expected.
  1039  type CustomTestDependencies struct {
  1040  	// Command represents a command that skaffold executes to obtain dependencies. The output of this command *must* be a valid JSON array.
  1041  	Command string `yaml:"command,omitempty" yamltags:"oneOf=dependency"`
  1042  
  1043  	// Paths should be set to the file dependencies for this command, so that the skaffold file watcher knows when to retest and perform file synchronization.
  1044  	// For example: `["src/test/**"]`
  1045  	Paths []string `yaml:"paths,omitempty" yamltags:"oneOf=dependency" skaffold:"filepath"`
  1046  
  1047  	// Ignore specifies the paths that should be ignored by skaffold's file watcher. If a file exists in both `paths` and in `ignore`, it will be ignored, and will be excluded from both retest and file synchronization.
  1048  	// Will only work in conjunction with `paths`.
  1049  	Ignore []string `yaml:"ignore,omitempty" skaffold:"filepath"`
  1050  }
  1051  
  1052  // DockerfileDependency *beta* is used to specify a custom build artifact that is built from a Dockerfile. This allows skaffold to determine dependencies from the Dockerfile.
  1053  type DockerfileDependency struct {
  1054  	// Path locates the Dockerfile relative to workspace.
  1055  	Path string `yaml:"path,omitempty"`
  1056  
  1057  	// BuildArgs are key/value pairs used to resolve values of `ARG` instructions in a Dockerfile.
  1058  	// Values can be constants or environment variables via the go template syntax.
  1059  	// For example: `{"key1": "value1", "key2": "value2", "key3": "'{{.ENV_VARIABLE}}'"}`.
  1060  	BuildArgs map[string]*string `yaml:"buildArgs,omitempty"`
  1061  }
  1062  
  1063  // KanikoArtifact describes an artifact built from a Dockerfile,
  1064  // with kaniko.
  1065  type KanikoArtifact struct {
  1066  
  1067  	// Cleanup to clean the filesystem at the end of the build.
  1068  	Cleanup bool `yaml:"cleanup,omitempty"`
  1069  
  1070  	// Insecure if you want to push images to a plain HTTP registry.
  1071  	Insecure bool `yaml:"insecure,omitempty"`
  1072  
  1073  	// InsecurePull if you want to pull images from a plain HTTP registry.
  1074  	InsecurePull bool `yaml:"insecurePull,omitempty"`
  1075  
  1076  	// NoPush if you only want to build the image, without pushing to a registry.
  1077  	NoPush bool `yaml:"noPush,omitempty"`
  1078  
  1079  	// Force building outside of a container.
  1080  	Force bool `yaml:"force,omitempty"`
  1081  
  1082  	// LogTimestamp to add timestamps to log format.
  1083  	LogTimestamp bool `yaml:"logTimestamp,omitempty"`
  1084  
  1085  	// Reproducible is used to strip timestamps out of the built image.
  1086  	Reproducible bool `yaml:"reproducible,omitempty"`
  1087  
  1088  	// SingleSnapshot is takes a single snapshot of the filesystem at the end of the build.
  1089  	// So only one layer will be appended to the base image.
  1090  	SingleSnapshot bool `yaml:"singleSnapshot,omitempty"`
  1091  
  1092  	// SkipTLS skips TLS certificate validation when pushing to a registry.
  1093  	SkipTLS bool `yaml:"skipTLS,omitempty"`
  1094  
  1095  	// SkipTLSVerifyPull skips TLS certificate validation when pulling from a registry.
  1096  	SkipTLSVerifyPull bool `yaml:"skipTLSVerifyPull,omitempty"`
  1097  
  1098  	// SkipUnusedStages builds only used stages if defined to true.
  1099  	// Otherwise it builds by default all stages, even the unnecessaries ones until it reaches the target stage / end of Dockerfile.
  1100  	SkipUnusedStages bool `yaml:"skipUnusedStages,omitempty"`
  1101  
  1102  	// UseNewRun to Use the experimental run implementation for detecting changes without requiring file system snapshots.
  1103  	// In some cases, this may improve build performance by 75%.
  1104  	UseNewRun bool `yaml:"useNewRun,omitempty"`
  1105  
  1106  	// WhitelistVarRun is used to ignore `/var/run` when taking image snapshot.
  1107  	// Set it to false to preserve /var/run/* in destination image.
  1108  	WhitelistVarRun bool `yaml:"whitelistVarRun,omitempty"`
  1109  
  1110  	// DockerfilePath locates the Dockerfile relative to workspace.
  1111  	// Defaults to `Dockerfile`.
  1112  	DockerfilePath string `yaml:"dockerfile,omitempty"`
  1113  
  1114  	// Target is to indicate which build stage is the target build stage.
  1115  	Target string `yaml:"target,omitempty"`
  1116  
  1117  	// InitImage is the image used to run init container which mounts kaniko context.
  1118  	InitImage string `yaml:"initImage,omitempty"`
  1119  
  1120  	// Image is the Docker image used by the Kaniko pod.
  1121  	// Defaults to the latest released version of `gcr.io/kaniko-project/executor`.
  1122  	Image string `yaml:"image,omitempty"`
  1123  
  1124  	// DigestFile to specify a file in the container. This file will receive the digest of a built image.
  1125  	// This can be used to automatically track the exact image built by kaniko.
  1126  	DigestFile string `yaml:"digestFile,omitempty"`
  1127  
  1128  	// ImageNameWithDigestFile specify a file to save the image name with digest of the built image to.
  1129  	ImageNameWithDigestFile string `yaml:"imageNameWithDigestFile,omitempty"`
  1130  
  1131  	// LogFormat <text|color|json> to set the log format.
  1132  	LogFormat string `yaml:"logFormat,omitempty"`
  1133  
  1134  	// OCILayoutPath is to specify a directory in the container where the OCI image layout of a built image will be placed.
  1135  	// This can be used to automatically track the exact image built by kaniko.
  1136  	OCILayoutPath string `yaml:"ociLayoutPath,omitempty"`
  1137  
  1138  	// RegistryMirror if you want to use a registry mirror instead of default `index.docker.io`.
  1139  	RegistryMirror string `yaml:"registryMirror,omitempty"`
  1140  
  1141  	// SnapshotMode is how Kaniko will snapshot the filesystem.
  1142  	SnapshotMode string `yaml:"snapshotMode,omitempty"`
  1143  
  1144  	// TarPath is path to save the image as a tarball at path instead of pushing the image.
  1145  	TarPath string `yaml:"tarPath,omitempty"`
  1146  
  1147  	// Verbosity <panic|fatal|error|warn|info|debug|trace> to set the logging level.
  1148  	Verbosity string `yaml:"verbosity,omitempty"`
  1149  
  1150  	// InsecureRegistry is to use plain HTTP requests when accessing a registry.
  1151  	InsecureRegistry []string `yaml:"insecureRegistry,omitempty"`
  1152  
  1153  	// SkipTLSVerifyRegistry skips TLS certificate validation when accessing a registry.
  1154  	SkipTLSVerifyRegistry []string `yaml:"skipTLSVerifyRegistry,omitempty"`
  1155  
  1156  	// Env are environment variables passed to the kaniko pod.
  1157  	// It also accepts environment variables via the go template syntax.
  1158  	// For example: `[{"name": "key1", "value": "value1"}, {"name": "key2", "value": "value2"}, {"name": "key3", "value": "'{{.ENV_VARIABLE}}'"}]`.
  1159  	Env []v1.EnvVar `yaml:"env,omitempty"`
  1160  
  1161  	// Cache configures Kaniko caching. If a cache is specified, Kaniko will
  1162  	// use a remote cache which will speed up builds.
  1163  	Cache *KanikoCache `yaml:"cache,omitempty"`
  1164  
  1165  	// RegistryCertificate is to provide a certificate for TLS communication with a given registry.
  1166  	// my.registry.url: /path/to/the/certificate.cert is the expected format.
  1167  	RegistryCertificate map[string]*string `yaml:"registryCertificate,omitempty"`
  1168  
  1169  	// Label key: value to set some metadata to the final image.
  1170  	// This is equivalent as using the LABEL within the Dockerfile.
  1171  	Label map[string]*string `yaml:"label,omitempty"`
  1172  
  1173  	// BuildArgs are arguments passed to the docker build.
  1174  	// It also accepts environment variables and generated values via the go template syntax.
  1175  	// Exposed generated values: IMAGE_REPO, IMAGE_NAME, IMAGE_TAG.
  1176  	// For example: `{"key1": "value1", "key2": "value2", "key3": "'{{.ENV_VARIABLE}}'"}`.
  1177  	BuildArgs map[string]*string `yaml:"buildArgs,omitempty"`
  1178  
  1179  	// VolumeMounts are volume mounts passed to kaniko pod.
  1180  	VolumeMounts []v1.VolumeMount `yaml:"volumeMounts,omitempty"`
  1181  }
  1182  
  1183  // DockerArtifact describes an artifact built from a Dockerfile,
  1184  // usually using `docker build`.
  1185  type DockerArtifact struct {
  1186  	// DockerfilePath locates the Dockerfile relative to workspace.
  1187  	// Defaults to `Dockerfile`.
  1188  	DockerfilePath string `yaml:"dockerfile,omitempty"`
  1189  
  1190  	// Target is the Dockerfile target name to build.
  1191  	Target string `yaml:"target,omitempty"`
  1192  
  1193  	// BuildArgs are arguments passed to the docker build.
  1194  	// For example: `{"key1": "value1", "key2": "value2"}`.
  1195  	BuildArgs map[string]*string `yaml:"buildArgs,omitempty"`
  1196  
  1197  	// NetworkMode is passed through to docker and overrides the
  1198  	// network configuration of docker builder. If unset, use whatever
  1199  	// is configured in the underlying docker daemon. Valid modes are
  1200  	// `host`: use the host's networking stack.
  1201  	// `bridge`: use the bridged network configuration.
  1202  	// `container:<name|id>`: reuse another container's network stack.
  1203  	// `none`: no networking in the container.
  1204  	NetworkMode string `yaml:"network,omitempty"`
  1205  
  1206  	// CacheFrom lists the Docker images used as cache sources.
  1207  	// For example: `["golang:1.10.1-alpine3.7", "alpine:3.7"]`.
  1208  	CacheFrom []string `yaml:"cacheFrom,omitempty"`
  1209  
  1210  	// NoCache used to pass in --no-cache to docker build to prevent caching.
  1211  	NoCache bool `yaml:"noCache,omitempty"`
  1212  
  1213  	// Squash is used to pass in --squash to docker build to squash docker image layers into single layer.
  1214  	Squash bool `yaml:"squash,omitempty"`
  1215  
  1216  	// Secret contains information about a local secret passed to `docker build`,
  1217  	// along with optional destination information.
  1218  	Secret *DockerSecret `yaml:"secret,omitempty"`
  1219  
  1220  	// SSH is used to pass in --ssh to docker build to use SSH agent. Format is "default|<id>[=<socket>|<key>[,<key>]]".
  1221  	SSH string `yaml:"ssh,omitempty"`
  1222  }
  1223  
  1224  // DockerSecret contains information about a local secret passed to `docker build`,
  1225  // along with optional destination information.
  1226  type DockerSecret struct {
  1227  	// ID is the id of the secret.
  1228  	ID string `yaml:"id,omitempty" yamltags:"required"`
  1229  
  1230  	// Source is the path to the secret on the host machine.
  1231  	Source string `yaml:"src,omitempty"`
  1232  
  1233  	// Destination is the path in the container to mount the secret.
  1234  	Destination string `yaml:"dst,omitempty"`
  1235  }
  1236  
  1237  // BazelArtifact describes an artifact built with [Bazel](https://bazel.build/).
  1238  type BazelArtifact struct {
  1239  	// BuildTarget is the `bazel build` target to run.
  1240  	// For example: `//:skaffold_example.tar`.
  1241  	BuildTarget string `yaml:"target,omitempty" yamltags:"required"`
  1242  
  1243  	// BuildArgs are additional args to pass to `bazel build`.
  1244  	// For example: `["-flag", "--otherflag"]`.
  1245  	BuildArgs []string `yaml:"args,omitempty"`
  1246  }
  1247  
  1248  // JibArtifact builds images using the
  1249  // [Jib plugins for Maven and Gradle](https://github.com/GoogleContainerTools/jib/).
  1250  type JibArtifact struct {
  1251  	// Project selects which sub-project to build for multi-module builds.
  1252  	Project string `yaml:"project,omitempty"`
  1253  
  1254  	// Flags are additional build flags passed to the builder.
  1255  	// For example: `["--no-build-cache"]`.
  1256  	Flags []string `yaml:"args,omitempty"`
  1257  
  1258  	// Type the Jib builder type; normally determined automatically. Valid types are
  1259  	// `maven`: for Maven.
  1260  	// `gradle`: for Gradle.
  1261  	Type string `yaml:"type,omitempty"`
  1262  
  1263  	// BaseImage overrides the configured jib base image.
  1264  	BaseImage string `yaml:"fromImage,omitempty"`
  1265  }
  1266  
  1267  // UnmarshalYAML provides a custom unmarshaller to deal with
  1268  // https://github.com/GoogleContainerTools/skaffold/issues/4175
  1269  func (clusterDetails *ClusterDetails) UnmarshalYAML(value *yaml.Node) error {
  1270  	// We do this as follows
  1271  	// 1. We zero out the fields in the node that require custom processing
  1272  	// 2. We unmarshal all the non special fields using the aliased type resource
  1273  	//    we use an alias type to avoid recursion caused by invoking this function infinitely
  1274  	// 3. We deserialize the special fields as required.
  1275  	type ClusterDetailsForUnmarshaling ClusterDetails
  1276  
  1277  	volumes, remaining, err := util.UnmarshalClusterVolumes(value)
  1278  
  1279  	if err != nil {
  1280  		return err
  1281  	}
  1282  
  1283  	// Unmarshal the remaining values
  1284  	aux := (*ClusterDetailsForUnmarshaling)(clusterDetails)
  1285  	err = yaml.Unmarshal(remaining, aux)
  1286  
  1287  	if err != nil {
  1288  		return err
  1289  	}
  1290  
  1291  	clusterDetails.Volumes = volumes
  1292  	return nil
  1293  }
  1294  
  1295  // UnmarshalYAML provides a custom unmarshaller to deal with
  1296  // https://github.com/GoogleContainerTools/skaffold/issues/4175
  1297  func (ka *KanikoArtifact) UnmarshalYAML(value *yaml.Node) error {
  1298  	// We do this as follows
  1299  	// 1. We zero out the fields in the node that require custom processing
  1300  	// 2. We unmarshal all the non special fields using the aliased type resource
  1301  	//    we use an alias type to avoid recursion caused by invoking this function infinitely
  1302  	// 3. We deserialize the special fields as required.
  1303  	type KanikoArtifactForUnmarshaling KanikoArtifact
  1304  
  1305  	mounts, remaining, err := util.UnmarshalKanikoArtifact(value)
  1306  
  1307  	if err != nil {
  1308  		return err
  1309  	}
  1310  
  1311  	// Unmarshal the remaining values
  1312  	aux := (*KanikoArtifactForUnmarshaling)(ka)
  1313  	err = yaml.Unmarshal(remaining, aux)
  1314  
  1315  	if err != nil {
  1316  		return err
  1317  	}
  1318  
  1319  	ka.VolumeMounts = mounts
  1320  	return nil
  1321  }
  1322  
  1323  // MarshalYAML provides a custom marshaller to deal with
  1324  // https://github.com/GoogleContainerTools/skaffold/issues/4175
  1325  func (clusterDetails *ClusterDetails) MarshalYAML() (interface{}, error) {
  1326  	// We do this as follows
  1327  	// 1. We zero out the fields in the node that require custom processing
  1328  	// 2. We marshall all the non special fields using the aliased type resource
  1329  	//    we use an alias type to avoid recursion caused by invoking this function infinitely
  1330  	// 3. We unmarshal to a map
  1331  	// 4. We marshal the special fields to json and unmarshal to a map
  1332  	//    * This leverages the json struct annotations to marshal as expected
  1333  	// 5. We combine the two maps and return
  1334  	type ClusterDetailsForUnmarshaling ClusterDetails
  1335  
  1336  	// Marshal volumes to a list. Use json because the Kubernetes resources have json annotations.
  1337  	volumes := clusterDetails.Volumes
  1338  
  1339  	j, err := json.Marshal(volumes)
  1340  
  1341  	if err != nil {
  1342  		return err, nil
  1343  	}
  1344  
  1345  	vList := []interface{}{}
  1346  
  1347  	if err := json.Unmarshal(j, &vList); err != nil {
  1348  		return nil, err
  1349  	}
  1350  
  1351  	// Make a deep copy of clusterDetails because we need to zero out volumes and we don't want to modify the
  1352  	// current object.
  1353  	aux := &ClusterDetailsForUnmarshaling{}
  1354  
  1355  	b, err := json.Marshal(clusterDetails)
  1356  
  1357  	if err != nil {
  1358  		return nil, err
  1359  	}
  1360  
  1361  	if err := json.Unmarshal(b, aux); err != nil {
  1362  		return nil, err
  1363  	}
  1364  
  1365  	aux.Volumes = nil
  1366  
  1367  	marshaled, err := yaml.Marshal(aux)
  1368  
  1369  	if err != nil {
  1370  		return nil, err
  1371  	}
  1372  
  1373  	m := map[string]interface{}{}
  1374  
  1375  	err = yaml.Unmarshal(marshaled, m)
  1376  
  1377  	if len(vList) > 0 {
  1378  		m["volumes"] = vList
  1379  	}
  1380  	return m, err
  1381  }
  1382  
  1383  // MarshalYAML provides a custom marshaller to deal with
  1384  // https://github.com/GoogleContainerTools/skaffold/issues/4175
  1385  func (ka *KanikoArtifact) MarshalYAML() (interface{}, error) {
  1386  	// We do this as follows
  1387  	// 1. We zero out the fields in the node that require custom processing
  1388  	// 2. We marshal all the non special fields using the aliased type resource
  1389  	//    we use an alias type to avoid recursion caused by invoking this function infinitely
  1390  	// 3. We unmarshal to a map
  1391  	// 4. We marshal the special fields to json and unmarshal to a map
  1392  	//    * This leverages the json struct annotations to marshal as expected
  1393  	// 5. We combine the two maps and return
  1394  	type KanikoArtifactForUnmarshaling KanikoArtifact
  1395  
  1396  	// Marshal volumes to a map. User json because the Kubernetes resources have json annotations.
  1397  	volumeMounts := ka.VolumeMounts
  1398  
  1399  	j, err := json.Marshal(volumeMounts)
  1400  
  1401  	if err != nil {
  1402  		return err, nil
  1403  	}
  1404  
  1405  	vList := []interface{}{}
  1406  
  1407  	if err := json.Unmarshal(j, &vList); err != nil {
  1408  		return nil, err
  1409  	}
  1410  
  1411  	// Make a deep copy of kanikoArtifact because we need to zero out volumeMounts and we don't want to modify the
  1412  	// current object.
  1413  	aux := &KanikoArtifactForUnmarshaling{}
  1414  
  1415  	b, err := json.Marshal(ka)
  1416  
  1417  	if err != nil {
  1418  		return nil, err
  1419  	}
  1420  
  1421  	if err := json.Unmarshal(b, aux); err != nil {
  1422  		return nil, err
  1423  	}
  1424  	aux.VolumeMounts = nil
  1425  
  1426  	marshaled, err := yaml.Marshal(aux)
  1427  
  1428  	if err != nil {
  1429  		return nil, err
  1430  	}
  1431  
  1432  	m := map[string]interface{}{}
  1433  
  1434  	err = yaml.Unmarshal(marshaled, m)
  1435  
  1436  	if len(vList) > 0 {
  1437  		m["volumeMounts"] = vList
  1438  	}
  1439  	return m, err
  1440  }