|
| 1 | +--- |
| 2 | +title: "Defining dependencies between artifacts" |
| 3 | +linkTitle: "Build Dependencies" |
| 4 | +weight: 100 |
| 5 | +--- |
| 6 | + |
| 7 | +This page describes how to define dependencies between artifacts and reference them in the [docker builder]({{<relref "/docs/pipeline-stages/builders/docker" >}}). |
| 8 | + |
| 9 | +## Before you begin |
| 10 | + |
| 11 | +First, you will need to have Skaffold and a Kubernetes cluster set up. |
| 12 | +To learn more about how to set up Skaffold and a Kubernetes cluster, see the [quickstart docs]({{< relref "/docs/quickstart" >}}). |
| 13 | + |
| 14 | +## Tutorial - Simple artifact dependency |
| 15 | + |
| 16 | +This tutorial will be based on the [simple-artifact-dependency](https://github.com/GoogleContainerTools/skaffold/tree/master/examples/simple-artifact-dependency) example in our repository. |
| 17 | + |
| 18 | + |
| 19 | +## Adding an artifact dependency |
| 20 | + |
| 21 | +We have a `base` artifact which has a single Dockerfile that we build with the [docker builder]({{<relref "/docs/pipeline-stages/builders/docker" >}}): |
| 22 | + {{% readfile file="samples/builders/artifact-dependencies/Dockerfile.base" %}} |
| 23 | + |
| 24 | +This artifact is used as the base image for the `app` artifact. We express this dependency in the `skaffold.yaml` using the `requires` expression. |
| 25 | +{{% readfile file="samples/builders/artifact-dependencies/skaffold.yaml" %}} |
| 26 | + |
| 27 | +The image alias `BASE` is now available as a build-arg in the Dockerfile for `app`: |
| 28 | + |
| 29 | +{{% readfile file="samples/builders/artifact-dependencies/Dockerfile.app" %}} |
| 30 | + |
| 31 | +## Build and Deploy |
| 32 | + |
| 33 | +In the [simple-artifact-dependency](https://github.com/GoogleContainerTools/skaffold/tree/master/examples/simple-artifact-dependency) directory, run: |
| 34 | + |
| 35 | +```text |
| 36 | +skaffold dev |
| 37 | +``` |
| 38 | + |
| 39 | +If this is the first time you're running this, then it should build the artifacts, starting with `base` and later `app`. Skaffold can handle any arbitrary dependency graph between artifacts and schedule builds in the right order. It'll also report an error if it detects dependency cycles or self-loops. |
| 40 | + |
| 41 | +```text |
| 42 | +Checking cache... |
| 43 | + - base: Not found. Building |
| 44 | + - app: Not found. Building |
| 45 | +
|
| 46 | +Building [base]... |
| 47 | +<docker build logs here> |
| 48 | +
|
| 49 | +Building [app]... |
| 50 | +<docker build logs here> |
| 51 | +``` |
| 52 | +It will then deploy a single container pod, while also monitoring for file changes. |
| 53 | + |
| 54 | +```text |
| 55 | +Watching for changes... |
| 56 | +[simple-artifact-dependency-app] Hello World |
| 57 | +[simple-artifact-dependency-app] Hello World |
| 58 | +``` |
| 59 | + |
| 60 | +Modify the text in file `base/hello.txt` to something else instead: |
| 61 | + |
| 62 | +```text |
| 63 | +Hello World!!! |
| 64 | +``` |
| 65 | + |
| 66 | +This will trigger a rebuild for the `base` artifact, and since `app` artifact depends on `base` it'll also trigger a rebuild for that. After deployment stabilizes, it should now show the logs reflecting this change: |
| 67 | + |
| 68 | +```text |
| 69 | +Watching for changes... |
| 70 | +[simple-artifact-dependency-app] Hello World!!! |
| 71 | +[simple-artifact-dependency-app] Hello World!!! |
| 72 | +``` |
| 73 | + |
| 74 | +## Cleanup |
| 75 | + |
| 76 | +Hitting `Ctrl + C` on a running Skaffold process should end it and cleanup its deployments. If there are still persisting objects then you can issue `skaffold delete` command to attempt the cleanup again. |
0 commit comments