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