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

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