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