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