> For the complete documentation index, see [llms.txt](https://developer.harness.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.harness.io/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-upload-an-artifact.md).

# Build and push artifacts and images

There are many ways you can use Harness CI to upload artifacts.

You can use Harness CI to build image, push image, and upload artifacts, such as Docker images or test results. [Build and Push steps](#build-and-push) build your codebase and then push the resulting artifact to a container registry or cloud storage repo. [Upload Artifact steps](#upload-artifacts) upload any artifact.

### Build and push <a href="#build-and-push" id="build-and-push"></a>

Build and Push steps build your codebase and then push the artifact to a repo. You can:

* [Build and push to Docker Hub or a Docker registry](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push/build-and-push-to-docker-registry.md)
* [Build and push to Azure Container Registry (ACR)](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push/build-and-push-to-acr.md)
* [Build and push to Amazon Elastic Container Registry (ECR)](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push/build-and-push-to-ecr-step-settings.md)
* [Build and push to Google Artifact Registry (GAR)](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push/build-and-push-to-gar.md)
* [Build and push to GitHub Container Registry (GHCR)](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push/build-and-push-to-ghcr.md)
* [Build and push to a JFrog Artifactory Docker registry](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push/build-and-push-to-docker-jfrog.md)

For other non-Docker upload locations, you can use a script in a [Run step](/continuous-integration/use-harness-ci/use-harness-ci/run-step-settings.md) to build and upload the artifact.

{% hint style="info" %}
You can also:

* [Build images without pushing](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-without-push.md)
* [Build multi-architecture images](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-multi-arch.md)
* [Use Docker Buildx Bake for advanced multi-registry builds](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push/docker-buildx-bake.md)
  {% endhint %}

<details>

<summary>Video: Add a Build and Push step</summary>

The following video demonstrates how to add a **Build and Push** step to a Harness CI pipeline.

{% embed url="<https://www.youtube.com/embed/v3A4kF1Upqo?feature=oembed>" %}

</details>

#### Kubernetes cluster build infrastructures require root access <a href="#kubernetes-cluster-build-infrastructures-require-root-access" id="kubernetes-cluster-build-infrastructures-require-root-access"></a>

With Kubernetes cluster build infrastructures, Build and Push steps use [Chainguard's maintained Kaniko fork](https://github.com/chainguard-forks/kaniko/blob/main/README.md). Other build infrastructures use [drone-docker](https://github.com/drone-plugins/drone-docker/blob/master/README.md). Kaniko can run as non-root in many cases. Root access is only required when your Dockerfile performs privileged operations (e.g., installing system packages, modifying root-owned directories).

If your build runs as non-root (`runAsNonRoot: true`), and you want to run the Build and Push step as root, you can set **Run as User** to `0` on the Build and Push step to use the root user for that individual step only.

If your security policy doesn't allow running as root, go to [Build and push with non-root users](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/build-and-push-nonroot.md).

#### Pull images <a href="#pull-images" id="pull-images"></a>

You can pull and run images in your pipelines by declaring them in your steps' Image setting. For example, you could pull and run an image in a [Background step](/continuous-integration/use-harness-ci/use-harness-ci/manage-dependencies/background-step-settings.md) or [Run step](/continuous-integration/use-harness-ci/use-harness-ci/run-step-settings.md).

### Upload artifacts <a href="#upload-artifacts" id="upload-artifacts"></a>

Upload Artifacts steps upload artifacts. These steps *don't* include build commands. You can:

* [Upload artifacts to JFrog Artifactory non-Docker registries](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/upload-artifacts/upload-artifacts-to-jfrog.md)
* [Upload artifacts to GCS](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/upload-artifacts/upload-artifacts-to-gcs-step-settings.md)
* [Upload artifacts to S3](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/upload-artifacts/upload-artifacts-to-s3.md)
* [Upload artifacts to Sonatype Nexus](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/upload-artifacts/upload-artifacts-to-sonatype-nexus.md)
* [Upload Helm charts to container registries](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/upload-artifacts/upload-helm-chart.md)
* [Send artifacts by email](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/drone-email-plugin.md)
* Run any upload script in a [Run step](/continuous-integration/use-harness-ci/use-harness-ci/run-step-settings.md) or [use plugins](/continuous-integration/use-harness-ci/use-harness-ci/use-drone-plugins/explore-ci-plugins.md).

{% hint style="info" %}
**ARTIFACTS TAB**

Regardless of how you upload artifacts, you can [publish any artifact URL to the Artifacts tab](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/artifacts-tab.md).
{% endhint %}

#### Download artifacts <a href="#download-artifacts" id="download-artifacts"></a>

You can use Run steps and Plugin steps to download artifacts into your pipeline workspace.

For example:

* [Download artifacts from GCS](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/upload-artifacts/upload-artifacts-to-gcs-step-settings.md#download-artifacts-from-gcs)
* [Download artifacts from S3](/continuous-integration/use-harness-ci/use-harness-ci/build-and-upload-artifacts/upload-artifacts/upload-artifacts-to-s3.md#download-artifacts-from-s3)
* [Use the Download plugin](/continuous-integration/use-harness-ci/use-harness-ci/use-drone-plugins/run-a-drone-plugin-in-ci.md)
* [Run any script in a Run step](/continuous-integration/use-harness-ci/use-harness-ci/run-step-settings.md)
* [Manage dependencies](/continuous-integration/use-harness-ci/use-harness-ci/manage-dependencies.md)
* [Caching and data sharing](/continuous-integration/use-harness-ci/use-harness-ci/caching-ci-data.md)

### Troubleshoot building and pushing artifacts and images <a href="#troubleshoot-building-and-pushing-artifacts-and-images" id="troubleshoot-building-and-pushing-artifacts-and-images"></a>

Go to the [CI Knowledge Base](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md) for questions and issues related to building and pushing images or uploading artifacts, such as:

* [What drives the Build and Push steps? What is kaniko?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#what-drives-the-build-and-push-steps-what-is-kaniko)
* [Does a kaniko build use images cached locally on the node? Can I enable caching for kaniko?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#does-a-kaniko-build-use-images-cached-locally-on-the-node-can-i-enable-caching-for-kaniko)
* [Can I run Build and Push steps as root if my build infrastructure runs as non-root? What if my security policy doesn't allow running as root?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#can-i-run-build-and-push-steps-as-root-if-my-build-infrastructure-runs-as-non-root)
* [Can I set kaniko and drone-docker runtime flags, such as skip-tls-verify or custom-dns?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#can-i-set-kaniko-and-drone-docker-runtime-flags-such-as-skip-tls-verify-or-custom-dns)
* [Is remote caching supported in Build and Push steps?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#is-remote-caching-supported-in-build-and-push-steps)
* [Build and Push to ECR step fails with error building image, failed to execute command, exec format error.](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#build-and-push-to-ecr-step-fails-with-error-building-image-failed-to-execute-command-exec-format-error)
* [Where does the Build and Push to ECR step pull the base images specified in the Dockerfile?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#where-does-the-build-and-push-to-ecr-step-pull-the-base-images-specified-in-the-dockerfile)
* [Can I send artifacts by email?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#can-i-send-emails-from-ci-pipelines)
* [Can I run the Upload Artifacts to JFrog Artifactory step with a non-root user?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#can-i-run-the-upload-artifacts-to-jfrog-artifactory-step-with-a-non-root-user)
* [How do I show content on the Artifacts tab?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#how-do-i-show-content-on-the-artifacts-tab)
* [Does the Upload Artifacts to S3 step compress files before uploading them?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#does-the-upload-artifacts-to-s3-step-compress-files-before-uploading-them)
* [Can I use a specific version of kaniko or drone-docker?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/continuous-integration-faqs.md#is-there-a-way-to-use-a-newer-or-older-version-of-kaniko)
* [How do I fix this kaniko container runtime error: kaniko should only be run inside of a container?](/continuous-integration/troubleshooting-and-resources/ci-articles-and-faqs/articles/kaniko-container-runtime-error.md)

{% @harness-feedback/feedback %}
