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

     1  /*
     2  Copyright 2019 The Skaffold Authors
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package v1beta16
    18  
    19  import (
    20  	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/util"
    21  )
    22  
    23  // !!! WARNING !!! This config version is already released, please DO NOT MODIFY the structs in this file.
    24  const Version string = "skaffold/v1beta16"
    25  
    26  // NewSkaffoldConfig creates a SkaffoldConfig
    27  func NewSkaffoldConfig() util.VersionedConfig {
    28  	return new(SkaffoldConfig)
    29  }
    30  
    31  // SkaffoldConfig holds the fields parsed from the Skaffold configuration file (skaffold.yaml).
    32  type SkaffoldConfig struct {
    33  	// APIVersion is the version of the configuration.
    34  	APIVersion string `yaml:"apiVersion" yamltags:"required"`
    35  
    36  	// Kind is always `Config`. Defaults to `Config`.
    37  	Kind string `yaml:"kind" yamltags:"required"`
    38  
    39  	// Metadata holds additional information about the config.
    40  	Metadata Metadata `yaml:"metadata,omitempty"`
    41  
    42  	// Pipeline defines the Build/Test/Deploy phases.
    43  	Pipeline `yaml:",inline"`
    44  
    45  	// Profiles *beta* can override be used to `build`, `test` or `deploy` configuration.
    46  	Profiles []Profile `yaml:"profiles,omitempty"`
    47  }
    48  
    49  // Metadata holds an optional name of the project.
    50  type Metadata struct {
    51  	// Name is an identifier for the project.
    52  	Name string `yaml:"name,omitempty"`
    53  }
    54  
    55  // Pipeline describes a Skaffold pipeline.
    56  type Pipeline struct {
    57  	// Build describes how images are built.
    58  	Build BuildConfig `yaml:"build,omitempty"`
    59  
    60  	// Test describes how images are tested.
    61  	Test []*TestCase `yaml:"test,omitempty"`
    62  
    63  	// Deploy describes how images are deployed.
    64  	Deploy DeployConfig `yaml:"deploy,omitempty"`
    65  
    66  	// PortForward describes user defined resources to port-forward.
    67  	PortForward []*PortForwardResource `yaml:"portForward,omitempty"`
    68  }
    69  
    70  func (c *SkaffoldConfig) GetVersion() string {
    71  	return c.APIVersion
    72  }
    73  
    74  // ResourceType describes the Kubernetes resource types used for port forwarding.
    75  type ResourceType string
    76  
    77  // PortForwardResource describes a resource to port forward.
    78  type PortForwardResource struct {
    79  	// Type is the Kubernetes type that should be port forwarded.
    80  	// Acceptable resource types include: `Service`, `Pod` and Controller resource type that has a pod spec: `ReplicaSet`, `ReplicationController`, `Deployment`, `StatefulSet`, `DaemonSet`, `Job`, `CronJob`.
    81  	Type ResourceType `yaml:"resourceType,omitempty"`
    82  
    83  	// Name is the name of the Kubernetes resource to port forward.
    84  	Name string `yaml:"resourceName,omitempty"`
    85  
    86  	// Namespace is the namespace of the resource to port forward.
    87  	Namespace string `yaml:"namespace,omitempty"`
    88  
    89  	// Port is the resource port that will be forwarded.
    90  	Port int `yaml:"port,omitempty"`
    91  
    92  	// LocalPort is the local port to forward to. If the port is unavailable, Skaffold will choose a random open port to forward to. *Optional*.
    93  	LocalPort int `yaml:"localPort,omitempty"`
    94  }
    95  
    96  // BuildConfig contains all the configuration for the build steps.
    97  type BuildConfig struct {
    98  	// Artifacts lists the images you're going to be building.
    99  	Artifacts []*Artifact `yaml:"artifacts,omitempty"`
   100  
   101  	// InsecureRegistries is a list of registries declared by the user to be insecure.
   102  	// These registries will be connected to via HTTP instead of HTTPS.
   103  	InsecureRegistries []string `yaml:"insecureRegistries,omitempty"`
   104  
   105  	// TagPolicy *beta* determines how images are tagged.
   106  	// A few strategies are provided here, although you most likely won't need to care!
   107  	// If not specified, it defaults to `gitCommit: {variant: Tags}`.
   108  	TagPolicy TagPolicy `yaml:"tagPolicy,omitempty"`
   109  
   110  	BuildType `yaml:",inline"`
   111  }
   112  
   113  // TagPolicy contains all the configuration for the tagging step.
   114  type TagPolicy struct {
   115  	// GitTagger *beta* tags images with the git tag or commit of the artifact's workspace.
   116  	GitTagger *GitTagger `yaml:"gitCommit,omitempty" yamltags:"oneOf=tag"`
   117  
   118  	// ShaTagger *beta* tags images with their sha256 digest.
   119  	ShaTagger *ShaTagger `yaml:"sha256,omitempty" yamltags:"oneOf=tag"`
   120  
   121  	// EnvTemplateTagger *beta* tags images with a configurable template string.
   122  	EnvTemplateTagger *EnvTemplateTagger `yaml:"envTemplate,omitempty" yamltags:"oneOf=tag"`
   123  
   124  	// DateTimeTagger *beta* tags images with the build timestamp.
   125  	DateTimeTagger *DateTimeTagger `yaml:"dateTime,omitempty" yamltags:"oneOf=tag"`
   126  }
   127  
   128  // ShaTagger *beta* tags images with their sha256 digest.
   129  type ShaTagger struct{}
   130  
   131  // GitTagger *beta* tags images with the git tag or commit of the artifact's workspace.
   132  type GitTagger struct {
   133  	// Variant determines the behavior of the git tagger. Valid variants are
   134  	// `Tags` (default): use git tags or fall back to abbreviated commit hash.
   135  	// `CommitSha`: use the full git commit sha.
   136  	// `AbbrevCommitSha`: use the abbreviated git commit sha.
   137  	// `TreeSha`: use the full tree hash of the artifact workingdir.
   138  	// `AbbrevTreeSha`: use the abbreviated tree hash of the artifact workingdir.
   139  	Variant string `yaml:"variant,omitempty"`
   140  }
   141  
   142  // EnvTemplateTagger *beta* tags images with a configurable template string.
   143  type EnvTemplateTagger struct {
   144  	// Template used to produce the image name and tag.
   145  	// See golang [text/template](https://golang.org/pkg/text/template/).
   146  	// The template is executed against the current environment,
   147  	// with those variables injected:
   148  	//   IMAGE_NAME   |  Name of the image being built, as supplied in the artifacts section.
   149  	// For example: `{{.RELEASE}}-{{.IMAGE_NAME}}`.
   150  	Template string `yaml:"template,omitempty" yamltags:"required"`
   151  }
   152  
   153  // DateTimeTagger *beta* tags images with the build timestamp.
   154  type DateTimeTagger struct {
   155  	// Format formats the date and time.
   156  	// See [#Time.Format](https://golang.org/pkg/time/#Time.Format).
   157  	// Defaults to `2006-01-02_15-04-05.999_MST`.
   158  	Format string `yaml:"format,omitempty"`
   159  
   160  	// TimeZone sets the timezone for the date and time.
   161  	// See [Time.LoadLocation](https://golang.org/pkg/time/#Time.LoadLocation).
   162  	// Defaults to the local timezone.
   163  	TimeZone string `yaml:"timezone,omitempty"`
   164  }
   165  
   166  // BuildType contains the specific implementation and parameters needed
   167  // for the build step. Only one field should be populated.
   168  type BuildType struct {
   169  	// LocalBuild *beta* describes how to do a build on the local docker daemon
   170  	// and optionally push to a repository.
   171  	LocalBuild *LocalBuild `yaml:"local,omitempty" yamltags:"oneOf=build"`
   172  
   173  	// GoogleCloudBuild *beta* describes how to do a remote build on
   174  	// [Google Cloud Build](https://cloud.google.com/cloud-build/).
   175  	GoogleCloudBuild *GoogleCloudBuild `yaml:"googleCloudBuild,omitempty" yamltags:"oneOf=build"`
   176  
   177  	// Cluster *beta* describes how to do an on-cluster build.
   178  	Cluster *ClusterDetails `yaml:"cluster,omitempty" yamltags:"oneOf=build"`
   179  }
   180  
   181  // LocalBuild *beta* describes how to do a build on the local docker daemon
   182  // and optionally push to a repository.
   183  type LocalBuild struct {
   184  	// Push should images be pushed to a registry.
   185  	// If not specified, images are pushed only if the current Kubernetes context
   186  	// connects to a remote cluster.
   187  	Push *bool `yaml:"push,omitempty"`
   188  
   189  	// UseDockerCLI use `docker` command-line interface instead of Docker Engine APIs.
   190  	UseDockerCLI bool `yaml:"useDockerCLI,omitempty"`
   191  
   192  	// UseBuildkit use BuildKit to build Docker images. If unspecified, uses the Docker default.
   193  	UseBuildkit *bool `yaml:"useBuildkit,omitempty"`
   194  }
   195  
   196  // GoogleCloudBuild *beta* describes how to do a remote build on
   197  // [Google Cloud Build](https://cloud.google.com/cloud-build/docs/).
   198  // Docker and Jib artifacts can be built on Cloud Build. The `projectId` needs
   199  // to be provided and the currently logged in user should be given permissions to trigger
   200  // new builds.
   201  type GoogleCloudBuild struct {
   202  	// ProjectID is the ID of your Cloud Platform Project.
   203  	// If it is not provided, Skaffold will guess it from the image name.
   204  	// For example, given the artifact image name `gcr.io/myproject/image`, Skaffold
   205  	// will use the `myproject` GCP project.
   206  	ProjectID string `yaml:"projectId,omitempty"`
   207  
   208  	// DiskSizeGb is the disk size of the VM that runs the build.
   209  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#buildoptions).
   210  	DiskSizeGb int64 `yaml:"diskSizeGb,omitempty"`
   211  
   212  	// MachineType is the type of the VM that runs the build.
   213  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#buildoptions).
   214  	MachineType string `yaml:"machineType,omitempty"`
   215  
   216  	// Timeout is the amount of time (in seconds) that this build should be allowed to run.
   217  	// See [Cloud Build Reference](https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds#resource-build).
   218  	Timeout string `yaml:"timeout,omitempty"`
   219  
   220  	// DockerImage is the image that runs a Docker build.
   221  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   222  	// Defaults to `gcr.io/cloud-builders/docker`.
   223  	DockerImage string `yaml:"dockerImage,omitempty"`
   224  
   225  	// KanikoImage is the image that runs a Kaniko build.
   226  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   227  	// Defaults to `gcr.io/kaniko-project/executor`.
   228  	KanikoImage string `yaml:"kanikoImage,omitempty"`
   229  
   230  	// MavenImage is the image that runs a Maven build.
   231  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   232  	// Defaults to `gcr.io/cloud-builders/mvn`.
   233  	MavenImage string `yaml:"mavenImage,omitempty"`
   234  
   235  	// GradleImage is the image that runs a Gradle build.
   236  	// See [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders).
   237  	// Defaults to `gcr.io/cloud-builders/gradle`.
   238  	GradleImage string `yaml:"gradleImage,omitempty"`
   239  
   240  	// Concurrency is how many artifacts can be built concurrently. 0 means "no-limit"
   241  	// Defaults to 0.
   242  	Concurrency int `yaml:"concurrency,omitempty"`
   243  }
   244  
   245  // LocalDir configures how Kaniko mounts sources directly via an `emptyDir` volume.
   246  type LocalDir struct {
   247  	// InitImage is the image used to run init container which mounts kaniko context.
   248  	InitImage string `yaml:"initImage,omitempty"`
   249  }
   250  
   251  // KanikoBuildContext contains the different fields available to specify
   252  // a Kaniko build context.
   253  type KanikoBuildContext struct {
   254  	// GCSBucket is the GCS bucket to which sources are uploaded.
   255  	// Kaniko will need access to that bucket to download the sources.
   256  	GCSBucket string `yaml:"gcsBucket,omitempty" yamltags:"oneOf=buildContext"`
   257  
   258  	// LocalDir configures how Kaniko mounts sources directly via an `emptyDir` volume.
   259  	LocalDir *LocalDir `yaml:"localDir,omitempty" yamltags:"oneOf=buildContext"`
   260  }
   261  
   262  // KanikoCache configures Kaniko caching. If a cache is specified, Kaniko will
   263  // use a remote cache which will speed up builds.
   264  type KanikoCache struct {
   265  	// Repo is a remote repository to store cached layers. If none is specified, one will be
   266  	// inferred from the image name. See [Kaniko Caching](https://github.com/GoogleContainerTools/kaniko#caching).
   267  	Repo string `yaml:"repo,omitempty"`
   268  	// HostPath specifies a path on the host that is mounted to each pod as read only cache volume containing base images.
   269  	// If set, must exist on each node and prepopulated with kaniko-warmer.
   270  	HostPath string `yaml:"hostPath,omitempty"`
   271  }
   272  
   273  // ClusterDetails *beta* describes how to do an on-cluster build.
   274  type ClusterDetails struct {
   275  	// HTTPProxy for kaniko pod.
   276  	HTTPProxy string `yaml:"HTTP_PROXY,omitempty"`
   277  
   278  	// HTTPSProxy for kaniko pod.
   279  	HTTPSProxy string `yaml:"HTTPS_PROXY,omitempty"`
   280  
   281  	// PullSecret is the path to the Google Cloud service account secret key file.
   282  	PullSecret string `yaml:"pullSecret,omitempty"`
   283  
   284  	// PullSecretName is the name of the Kubernetes secret for pulling the files
   285  	// from the build context and pushing the final image. If given, the secret needs to
   286  	// contain the Google Cloud service account secret key under the key `kaniko-secret`.
   287  	// Defaults to `kaniko-secret`.
   288  	PullSecretName string `yaml:"pullSecretName,omitempty"`
   289  
   290  	// PullSecretMountPath is the path the pull secret will be mounted at within the running container.
   291  	PullSecretMountPath string `yaml:"pullSecretMountPath,omitempty"`
   292  
   293  	// Namespace is the Kubernetes namespace.
   294  	// Defaults to current namespace in Kubernetes configuration.
   295  	Namespace string `yaml:"namespace,omitempty"`
   296  
   297  	// Timeout is the amount of time (in seconds) that this build is allowed to run.
   298  	// Defaults to 20 minutes (`20m`).
   299  	Timeout string `yaml:"timeout,omitempty"`
   300  
   301  	// DockerConfig describes how to mount the local Docker configuration into a pod.
   302  	DockerConfig *DockerConfig `yaml:"dockerConfig,omitempty"`
   303  
   304  	// Resources define the resource requirements for the kaniko pod.
   305  	Resources *ResourceRequirements `yaml:"resources,omitempty"`
   306  
   307  	// Concurrency is how many artifacts can be built concurrently. 0 means "no-limit"
   308  	// Defaults to 0.
   309  	Concurrency int `yaml:"concurrency,omitempty"`
   310  }
   311  
   312  // DockerConfig contains information about the docker `config.json` to mount.
   313  type DockerConfig struct {
   314  	// Path is the path to the docker `config.json`.
   315  	Path string `yaml:"path,omitempty"`
   316  
   317  	// SecretName is the Kubernetes secret that contains the `config.json` Docker configuration.
   318  	// Note that the expected secret type is not 'kubernetes.io/dockerconfigjson' but 'Opaque'.
   319  	SecretName string `yaml:"secretName,omitempty"`
   320  }
   321  
   322  // ResourceRequirements describes the resource requirements for the kaniko pod.
   323  type ResourceRequirements struct {
   324  	// 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.
   325  	Requests *ResourceRequirement `yaml:"requests,omitempty"`
   326  
   327  	// 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.
   328  	Limits *ResourceRequirement `yaml:"limits,omitempty"`
   329  }
   330  
   331  // ResourceRequirement stores the CPU/Memory requirements for the pod.
   332  type ResourceRequirement struct {
   333  	// CPU the number cores to be used.
   334  	// For example: `2`, `2.0` or `200m`.
   335  	CPU string `yaml:"cpu,omitempty"`
   336  
   337  	// Memory the amount of memory to allocate to the pod.
   338  	// For example: `1Gi` or `1000Mi`.
   339  	Memory string `yaml:"memory,omitempty"`
   340  }
   341  
   342  // TestCase is a list of structure tests to run on images that Skaffold builds.
   343  type TestCase struct {
   344  	// ImageName is the artifact on which to run those tests.
   345  	// For example: `gcr.io/k8s-skaffold/example`.
   346  	ImageName string `yaml:"image" yamltags:"required"`
   347  
   348  	// StructureTests lists the [Container Structure Tests](https://github.com/GoogleContainerTools/container-structure-test)
   349  	// to run on that artifact.
   350  	// For example: `["./test/*"]`.
   351  	StructureTests []string `yaml:"structureTests,omitempty"`
   352  }
   353  
   354  // DeployConfig contains all the configuration needed by the deploy steps.
   355  type DeployConfig struct {
   356  	DeployType `yaml:",inline"`
   357  
   358  	// StatusCheckDeadlineSeconds *beta* is the deadline for deployments to stabilize in seconds.
   359  	StatusCheckDeadlineSeconds int `yaml:"statusCheckDeadlineSeconds,omitempty"`
   360  
   361  	// KubeContext is the Kubernetes context that Skaffold should deploy to.
   362  	// For example: `minikube`.
   363  	KubeContext string `yaml:"kubeContext,omitempty"`
   364  }
   365  
   366  // DeployType contains the specific implementation and parameters needed
   367  // for the deploy step. Only one field should be populated.
   368  type DeployType struct {
   369  	// HelmDeploy *beta* uses the `helm` CLI to apply the charts to the cluster.
   370  	HelmDeploy *HelmDeploy `yaml:"helm,omitempty" yamltags:"oneOf=deploy"`
   371  
   372  	// KubectlDeploy *beta* uses a client side `kubectl apply` to deploy manifests.
   373  	// You'll need a `kubectl` CLI version installed that's compatible with your cluster.
   374  	KubectlDeploy *KubectlDeploy `yaml:"kubectl,omitempty" yamltags:"oneOf=deploy"`
   375  
   376  	// KustomizeDeploy *beta* uses the `kustomize` CLI to "patch" a deployment for a target environment.
   377  	KustomizeDeploy *KustomizeDeploy `yaml:"kustomize,omitempty" yamltags:"oneOf=deploy"`
   378  }
   379  
   380  // KubectlDeploy *beta* uses a client side `kubectl apply` to deploy manifests.
   381  // You'll need a `kubectl` CLI version installed that's compatible with your cluster.
   382  type KubectlDeploy struct {
   383  	// Manifests lists the Kubernetes yaml or json manifests.
   384  	// Defaults to `["k8s/*.yaml"]`.
   385  	Manifests []string `yaml:"manifests,omitempty"`
   386  
   387  	// RemoteManifests lists Kubernetes manifests in remote clusters.
   388  	RemoteManifests []string `yaml:"remoteManifests,omitempty"`
   389  
   390  	// Flags are additional flags passed to `kubectl`.
   391  	Flags KubectlFlags `yaml:"flags,omitempty"`
   392  }
   393  
   394  // KubectlFlags are additional flags passed on the command
   395  // line to kubectl either on every command (Global), on creations (Apply)
   396  // or deletions (Delete).
   397  type KubectlFlags struct {
   398  	// Global are additional flags passed on every command.
   399  	Global []string `yaml:"global,omitempty"`
   400  
   401  	// Apply are additional flags passed on creations (`kubectl apply`).
   402  	Apply []string `yaml:"apply,omitempty"`
   403  
   404  	// Delete are additional flags passed on deletions (`kubectl delete`).
   405  	Delete []string `yaml:"delete,omitempty"`
   406  }
   407  
   408  // HelmDeploy *beta* uses the `helm` CLI to apply the charts to the cluster.
   409  type HelmDeploy struct {
   410  	// Releases is a list of Helm releases.
   411  	Releases []HelmRelease `yaml:"releases,omitempty" yamltags:"required"`
   412  
   413  	// Flags are additional option flags that are passed on the command
   414  	// line to `helm`.
   415  	Flags HelmDeployFlags `yaml:"flags,omitempty"`
   416  }
   417  
   418  // HelmDeployFlags are additional option flags that are passed on the command
   419  // line to `helm`.
   420  type HelmDeployFlags struct {
   421  	// Global are additional flags passed on every command.
   422  	Global []string `yaml:"global,omitempty"`
   423  
   424  	// Install are additional flags passed to (`helm install`).
   425  	Install []string `yaml:"install,omitempty"`
   426  
   427  	// Upgrade are additional flags passed to (`helm upgrade`).
   428  	Upgrade []string `yaml:"upgrade,omitempty"`
   429  }
   430  
   431  // KustomizeDeploy *beta* uses the `kustomize` CLI to "patch" a deployment for a target environment.
   432  type KustomizeDeploy struct {
   433  	// KustomizePath is the path to Kustomization files.
   434  	// Defaults to `.`.
   435  	KustomizePath string `yaml:"path,omitempty"`
   436  
   437  	// Flags are additional flags passed to `kubectl`.
   438  	Flags KubectlFlags `yaml:"flags,omitempty"`
   439  
   440  	// BuildArgs are additional args passed to `kustomize build`.
   441  	BuildArgs []string `yaml:"buildArgs,omitempty"`
   442  }
   443  
   444  // HelmRelease describes a helm release to be deployed.
   445  type HelmRelease struct {
   446  	// Name is the name of the Helm release.
   447  	Name string `yaml:"name,omitempty" yamltags:"required"`
   448  
   449  	// ChartPath is the path to the Helm chart.
   450  	ChartPath string `yaml:"chartPath,omitempty" yamltags:"required"`
   451  
   452  	// ValuesFiles are the paths to the Helm `values` files.
   453  	ValuesFiles []string `yaml:"valuesFiles,omitempty"`
   454  
   455  	// Values are key-value pairs supplementing the Helm `values` file.
   456  	Values map[string]string `yaml:"values,omitempty,omitempty"`
   457  
   458  	// Namespace is the Kubernetes namespace.
   459  	Namespace string `yaml:"namespace,omitempty"`
   460  
   461  	// Version is the version of the chart.
   462  	Version string `yaml:"version,omitempty"`
   463  
   464  	// SetValues are key-value pairs.
   465  	// If present, Skaffold will send `--set` flag to Helm CLI and append all pairs after the flag.
   466  	SetValues map[string]string `yaml:"setValues,omitempty"`
   467  
   468  	// SetValueTemplates are key-value pairs.
   469  	// If present, Skaffold will try to parse the value part of each key-value pair using
   470  	// environment variables in the system, then send `--set` flag to Helm CLI and append
   471  	// all parsed pairs after the flag.
   472  	SetValueTemplates map[string]string `yaml:"setValueTemplates,omitempty"`
   473  
   474  	// SetFiles are key-value pairs.
   475  	// If present, Skaffold will send `--set-file` flag to Helm CLI and append all pairs after the flag.
   476  	SetFiles map[string]string `yaml:"setFiles,omitempty"`
   477  
   478  	// Wait if `true`, Skaffold will send `--wait` flag to Helm CLI.
   479  	// Defaults to `false`.
   480  	Wait bool `yaml:"wait,omitempty"`
   481  
   482  	// RecreatePods if `true`, Skaffold will send `--recreate-pods` flag to Helm CLI
   483  	// when upgrading a new version of a chart in subsequent dev loop deploy.
   484  	// Defaults to `false`.
   485  	RecreatePods bool `yaml:"recreatePods,omitempty"`
   486  
   487  	// SkipBuildDependencies should build dependencies be skipped.
   488  	SkipBuildDependencies bool `yaml:"skipBuildDependencies,omitempty"`
   489  
   490  	// UseHelmSecrets instructs skaffold to use secrets plugin on deployment.
   491  	UseHelmSecrets bool `yaml:"useHelmSecrets,omitempty"`
   492  
   493  	// Remote specifies whether the chart path is remote, or exists on the host filesystem.
   494  	// `remote: true` implies `skipBuildDependencies: true`.
   495  	Remote bool `yaml:"remote,omitempty"`
   496  
   497  	// Overrides are key-value pairs.
   498  	// If present, Skaffold will build a Helm `values` file that overrides
   499  	// the original and use it to call Helm CLI (`--f` flag).
   500  	Overrides util.HelmOverrides `yaml:"overrides,omitempty"`
   501  
   502  	// Packaged parameters for packaging helm chart (`helm package`).
   503  	Packaged *HelmPackaged `yaml:"packaged,omitempty"`
   504  
   505  	// ImageStrategy adds image configurations to the Helm `values` file.
   506  	ImageStrategy HelmImageStrategy `yaml:"imageStrategy,omitempty"`
   507  }
   508  
   509  // HelmPackaged parameters for packaging helm chart (`helm package`).
   510  type HelmPackaged struct {
   511  	// Version sets the `version` on the chart to this semver version.
   512  	Version string `yaml:"version,omitempty"`
   513  
   514  	// AppVersion sets the `appVersion` on the chart to this version.
   515  	AppVersion string `yaml:"appVersion,omitempty"`
   516  }
   517  
   518  // HelmImageStrategy adds image configurations to the Helm `values` file.
   519  type HelmImageStrategy struct {
   520  	HelmImageConfig `yaml:",inline"`
   521  }
   522  
   523  // HelmImageConfig describes an image configuration.
   524  type HelmImageConfig struct {
   525  	// HelmFQNConfig is the image configuration uses the syntax `IMAGE-NAME=IMAGE-REPOSITORY:IMAGE-TAG`.
   526  	HelmFQNConfig *HelmFQNConfig `yaml:"fqn,omitempty" yamltags:"oneOf=helmImageStrategy"`
   527  
   528  	// HelmConventionConfig is the image configuration uses the syntax `IMAGE-NAME.repository=IMAGE-REPOSITORY, IMAGE-NAME.tag=IMAGE-TAG`.
   529  	HelmConventionConfig *HelmConventionConfig `yaml:"helm,omitempty" yamltags:"oneOf=helmImageStrategy"`
   530  }
   531  
   532  // HelmFQNConfig is the image config to use the FullyQualifiedImageName as param to set.
   533  type HelmFQNConfig struct {
   534  	// Property defines the image config.
   535  	Property string `yaml:"property,omitempty"`
   536  }
   537  
   538  // HelmConventionConfig is the image config in the syntax of image.repository and image.tag.
   539  type HelmConventionConfig struct {
   540  	// ExplicitRegistry separates `image.registry` to the image config syntax. Useful for some charts e.g. `postgresql`.
   541  	ExplicitRegistry bool `yaml:"explicitRegistry,omitempty"`
   542  }
   543  
   544  // Artifact are the items that need to be built, along with the context in which
   545  // they should be built.
   546  type Artifact struct {
   547  	// ImageName is the name of the image to be built.
   548  	// For example: `gcr.io/k8s-skaffold/example`.
   549  	ImageName string `yaml:"image,omitempty" yamltags:"required"`
   550  
   551  	// Workspace is the directory containing the artifact's sources.
   552  	// Defaults to `.`.
   553  	Workspace string `yaml:"context,omitempty"`
   554  
   555  	// Sync *alpha* lists local files synced to pods instead
   556  	// of triggering an image build when modified.
   557  	Sync *Sync `yaml:"sync,omitempty"`
   558  
   559  	// ArtifactType describes how to build an artifact.
   560  	ArtifactType `yaml:",inline"`
   561  }
   562  
   563  // Sync *alpha* specifies what files to sync into the container.
   564  // This is a list of sync rules indicating the intent to sync for source files.
   565  type Sync struct {
   566  	// Manual lists manual sync rules indicating the source and destination.
   567  	Manual []*SyncRule `yaml:"manual,omitempty" yamltags:"oneOf=sync"`
   568  
   569  	// Infer lists file patterns which may be synced into the container.
   570  	// The container destination is inferred by the builder.
   571  	// Currently only available for docker artifacts.
   572  	Infer []string `yaml:"infer,omitempty" yamltags:"oneOf=sync"`
   573  }
   574  
   575  // SyncRule specifies which local files to sync to remote folders.
   576  type SyncRule struct {
   577  	// Src is a glob pattern to match local paths against.
   578  	// Directories should be delimited by `/` on all platforms.
   579  	// For example: `"css/**/*.css"`.
   580  	Src string `yaml:"src,omitempty" yamltags:"required"`
   581  
   582  	// Dest is the destination path in the container where the files should be synced to.
   583  	// For example: `"app/"`
   584  	Dest string `yaml:"dest,omitempty" yamltags:"required"`
   585  
   586  	// Strip specifies the path prefix to remove from the source path when
   587  	// transplanting the files into the destination folder.
   588  	// For example: `"css/"`
   589  	Strip string `yaml:"strip,omitempty"`
   590  }
   591  
   592  // Profile *beta* profiles are used to override any `build`, `test` or `deploy` configuration.
   593  type Profile struct {
   594  	// Name is a unique profile name.
   595  	// For example: `profile-prod`.
   596  	Name string `yaml:"name,omitempty" yamltags:"required"`
   597  
   598  	// Pipeline contains the definitions to replace the default skaffold pipeline.
   599  	Pipeline `yaml:",inline"`
   600  
   601  	// Patches lists patches applied to the configuration.
   602  	// Patches use the JSON patch notation.
   603  	Patches []JSONPatch `yaml:"patches,omitempty"`
   604  
   605  	// Activation criteria by which a profile can be auto-activated.
   606  	// The profile is auto-activated if any one of the activations are triggered.
   607  	// An activation is triggered if all of the criteria (env, kubeContext, command) are triggered.
   608  	Activation []Activation `yaml:"activation,omitempty"`
   609  }
   610  
   611  // JSONPatch patch to be applied by a profile.
   612  type JSONPatch struct {
   613  	// Op is the operation carried by the patch: `add`, `remove`, `replace`, `move`, `copy` or `test`.
   614  	// Defaults to `replace`.
   615  	Op string `yaml:"op,omitempty"`
   616  
   617  	// Path is the position in the yaml where the operation takes place.
   618  	// For example, this targets the `dockerfile` of the first artifact built.
   619  	// For example: `/build/artifacts/0/docker/dockerfile`.
   620  	Path string `yaml:"path,omitempty" yamltags:"required"`
   621  
   622  	// From is the source position in the yaml, used for `copy` or `move` operations.
   623  	From string `yaml:"from,omitempty"`
   624  
   625  	// Value is the value to apply. Can be any portion of yaml.
   626  	Value *util.YamlpatchNode `yaml:"value,omitempty"`
   627  }
   628  
   629  // Activation criteria by which a profile is auto-activated.
   630  type Activation struct {
   631  	// Env is a `key=pattern` pair. The profile is auto-activated if an Environment
   632  	// Variable `key` matches the pattern. If the pattern starts with `!`, activation
   633  	// happens if the remaining pattern is _not_ matched. The pattern matches if the
   634  	// Environment Variable value is exactly `pattern`, or the regex `pattern` is
   635  	// found in it. An empty `pattern` (e.g. `env: "key="`) always only matches if
   636  	// the Environment Variable is undefined or empty.
   637  	// For example: `ENV=production`
   638  	Env string `yaml:"env,omitempty"`
   639  
   640  	// KubeContext is a Kubernetes context for which the profile is auto-activated.
   641  	// For example: `minikube`.
   642  	KubeContext string `yaml:"kubeContext,omitempty"`
   643  
   644  	// Command is a Skaffold command for which the profile is auto-activated.
   645  	// For example: `dev`.
   646  	Command string `yaml:"command,omitempty"`
   647  }
   648  
   649  // ArtifactType describes how to build an artifact.
   650  type ArtifactType struct {
   651  	// DockerArtifact *beta* describes an artifact built from a Dockerfile.
   652  	DockerArtifact *DockerArtifact `yaml:"docker,omitempty" yamltags:"oneOf=artifact"`
   653  
   654  	// BazelArtifact *beta* requires bazel CLI to be installed and the sources to
   655  	// contain [Bazel](https://bazel.build/) configuration files.
   656  	BazelArtifact *BazelArtifact `yaml:"bazel,omitempty" yamltags:"oneOf=artifact"`
   657  
   658  	// JibArtifact *alpha* builds images using the
   659  	// [Jib plugins for Maven or Gradle](https://github.com/GoogleContainerTools/jib/).
   660  	JibArtifact *JibArtifact `yaml:"jib,omitempty" yamltags:"oneOf=artifact"`
   661  
   662  	// KanikoArtifact *alpha* builds images using [kaniko](https://github.com/GoogleContainerTools/kaniko).
   663  	KanikoArtifact *KanikoArtifact `yaml:"kaniko,omitempty" yamltags:"oneOf=artifact"`
   664  
   665  	// CustomArtifact *alpha* builds images using a custom build script written by the user.
   666  	CustomArtifact *CustomArtifact `yaml:"custom,omitempty" yamltags:"oneOf=artifact"`
   667  }
   668  
   669  // CustomArtifact *alpha* describes an artifact built from a custom build script
   670  // written by the user. It can be used to build images with builders that aren't directly integrated with skaffold.
   671  type CustomArtifact struct {
   672  	// BuildCommand is the command executed to build the image.
   673  	BuildCommand string `yaml:"buildCommand,omitempty"`
   674  	// Dependencies are the file dependencies that skaffold should watch for both rebuilding and file syncing for this artifact.
   675  	Dependencies *CustomDependencies `yaml:"dependencies,omitempty"`
   676  }
   677  
   678  // CustomDependencies *alpha* is used to specify dependencies for an artifact built by a custom build script.
   679  // Either `dockerfile` or `paths` should be specified for file watching to work as expected.
   680  type CustomDependencies struct {
   681  	// Dockerfile should be set if the artifact is built from a Dockerfile, from which skaffold can determine dependencies.
   682  	Dockerfile *DockerfileDependency `yaml:"dockerfile,omitempty" yamltags:"oneOf=dependency"`
   683  	// Command represents a custom command that skaffold executes to obtain dependencies. The output of this command *must* be a valid JSON array.
   684  	Command string `yaml:"command,omitempty" yamltags:"oneOf=dependency"`
   685  	// 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.
   686  	Paths []string `yaml:"paths,omitempty" yamltags:"oneOf=dependency"`
   687  	// 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.
   688  	// Will only work in conjunction with `paths`.
   689  	Ignore []string `yaml:"ignore,omitempty"`
   690  }
   691  
   692  // DockerfileDependency *alpha* is used to specify a custom build artifact that is built from a Dockerfile. This allows skaffold to determine dependencies from the Dockerfile.
   693  type DockerfileDependency struct {
   694  	// Path locates the Dockerfile relative to workspace.
   695  	Path string `yaml:"path,omitempty"`
   696  
   697  	// BuildArgs are arguments passed to the docker build.
   698  	// It also accepts environment variables via the go template syntax.
   699  	// For example: `{"key1": "value1", "key2": "value2", "key3": "{{.ENV_VARIABLE}}"}`.
   700  	BuildArgs map[string]*string `yaml:"buildArgs,omitempty"`
   701  }
   702  
   703  // KanikoArtifact *alpha* describes an artifact built from a Dockerfile,
   704  // with kaniko.
   705  type KanikoArtifact struct {
   706  	// AdditionalFlags are additional flags to be passed to Kaniko command line.
   707  	// See [Kaniko Additional Flags](https://github.com/GoogleContainerTools/kaniko#additional-flags).
   708  	// Deprecated - instead the named, unique fields should be used, e.g. `buildArgs`, `cache`, `target`.
   709  	AdditionalFlags []string `yaml:"flags,omitempty"`
   710  
   711  	// DockerfilePath locates the Dockerfile relative to workspace.
   712  	// Defaults to `Dockerfile`.
   713  	DockerfilePath string `yaml:"dockerfile,omitempty"`
   714  
   715  	// Target is the Dockerfile target name to build.
   716  	Target string `yaml:"target,omitempty"`
   717  
   718  	// BuildArgs are arguments passed to the docker build.
   719  	// It also accepts environment variables via the go template syntax.
   720  	// For example: `{"key1": "value1", "key2": "value2", "key3": "{{.ENV_VARIABLE}}"}`.
   721  	BuildArgs map[string]*string `yaml:"buildArgs,omitempty"`
   722  
   723  	// BuildContext is where the build context for this artifact resides.
   724  	BuildContext *KanikoBuildContext `yaml:"buildContext,omitempty"`
   725  
   726  	// Image is the Docker image used by the Kaniko pod.
   727  	// Defaults to the latest released version of `gcr.io/kaniko-project/executor`.
   728  	Image string `yaml:"image,omitempty"`
   729  
   730  	// Cache configures Kaniko caching. If a cache is specified, Kaniko will
   731  	// use a remote cache which will speed up builds.
   732  	Cache *KanikoCache `yaml:"cache,omitempty"`
   733  
   734  	// Reproducible is used to strip timestamps out of the built image.
   735  	Reproducible bool `yaml:"reproducible,omitempty"`
   736  
   737  	// SkipTLS skips TLS verification when pulling and pushing the image.
   738  	SkipTLS bool `yaml:"skipTLS,omitempty"`
   739  }
   740  
   741  // DockerArtifact *beta* describes an artifact built from a Dockerfile,
   742  // usually using `docker build`.
   743  type DockerArtifact struct {
   744  	// DockerfilePath locates the Dockerfile relative to workspace.
   745  	// Defaults to `Dockerfile`.
   746  	DockerfilePath string `yaml:"dockerfile,omitempty"`
   747  
   748  	// Target is the Dockerfile target name to build.
   749  	Target string `yaml:"target,omitempty"`
   750  
   751  	// BuildArgs are arguments passed to the docker build.
   752  	// For example: `{"key1": "value1", "key2": "value2"}`.
   753  	BuildArgs map[string]*string `yaml:"buildArgs,omitempty"`
   754  
   755  	// NetworkMode is passed through to docker and overrides the
   756  	// network configuration of docker builder. If unset, use whatever
   757  	// is configured in the underlying docker daemon. Valid modes are
   758  	// `host`: use the host's networking stack.
   759  	// `bridge`: use the bridged network configuration.
   760  	// `none`: no networking in the container.
   761  	NetworkMode string `yaml:"network,omitempty"`
   762  
   763  	// CacheFrom lists the Docker images used as cache sources.
   764  	// For example: `["golang:1.10.1-alpine3.7", "alpine:3.7"]`.
   765  	CacheFrom []string `yaml:"cacheFrom,omitempty"`
   766  
   767  	// NoCache used to pass in --no-cache to docker build to prevent caching.
   768  	NoCache bool `yaml:"noCache,omitempty"`
   769  }
   770  
   771  // BazelArtifact *beta* describes an artifact built with [Bazel](https://bazel.build/).
   772  type BazelArtifact struct {
   773  	// BuildTarget is the `bazel build` target to run.
   774  	// For example: `//:skaffold_example.tar`.
   775  	BuildTarget string `yaml:"target,omitempty" yamltags:"required"`
   776  
   777  	// BuildArgs are additional args to pass to `bazel build`.
   778  	// For example: `["-flag", "--otherflag"]`.
   779  	BuildArgs []string `yaml:"args,omitempty"`
   780  }
   781  
   782  // JibArtifact *alpha* builds images using the
   783  // [Jib plugins for Maven and Gradle](https://github.com/GoogleContainerTools/jib/).
   784  type JibArtifact struct {
   785  	// Project selects which sub-project to build for multi-module builds.
   786  	Project string `yaml:"project,omitempty"`
   787  
   788  	// Flags are additional build flags passed to the builder.
   789  	// For example: `["--no-build-cache"]`.
   790  	Flags []string `yaml:"args,omitempty"`
   791  
   792  	// Type the Jib builder type; normally determined automatically. Valid types are
   793  	// `maven`: for Maven.
   794  	// `gradle`: for Gradle.
   795  	Type string `yaml:"type,omitempty"`
   796  }