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