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