Remove the use of the cache for single-arch container images

This is a partially revert of
https://cos-review.git.corp.google.com/c/cos/tools/+/45593.

List of container images are single-arch and don't benefit much from the
caching stretagy. Using `docker build` without caching also helps to
generate provenance and SBOMs natively.

The list is:

cos_gpu_installer_v1
cos_ova_converter
cos_gpu_config_builder
cos_gpu_driver_builder
cos_kernel_devenv

BUG=b/397501766
TEST=presubmit

Change-Id: I72775a58cc6b11488957ae560262c8ad03629f05
Reviewed-on: https://cos-review.googlesource.com/c/cos/tools/+/97849
Tested-by: Chenglong Tang <chenglongtang@google.com>
Reviewed-by: Robert Kolchmeyer <rkolchmeyer@google.com>
Cloud-Build: GCB Service account <228075978874@cloudbuild.gserviceaccount.com>
diff --git a/src/cmd/cos_gpu_config_builder/cloudbuild.yaml b/src/cmd/cos_gpu_config_builder/cloudbuild.yaml
index 5446833..3c83024 100644
--- a/src/cmd/cos_gpu_config_builder/cloudbuild.yaml
+++ b/src/cmd/cos_gpu_config_builder/cloudbuild.yaml
@@ -1,26 +1,43 @@
 options:
-  env:
-  - 'DOCKER_CLI_EXPERIMENTAL=enabled'
+  requestedVerifyOption: VERIFIED
+substitutions:
+  _IMAGE_NAME: cos-gpu-config-builder
+  _IMAGE_FOLDER_NAME: cos_gpu_config_builder
+  _RUN_PATH: .
+
 steps:
 - name: 'gcr.io/cloud-builders/docker'
-  args: ['buildx', 'create', '--name', 'builder']
-- name: 'gcr.io/cloud-builders/docker'
-  args: ['buildx', 'use', 'builder']
-- name: 'gcr.io/cloud-builders/docker'
+  id: build-and-tag
   entrypoint: 'bash'
   args:
     - '-c'
     - |
+      TAGS=""
       if [ "$_BUILD_TYPE" == "presubmit" ]; then
-        # If it's presubmit, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with TAG_NAME and presubmit-TAG_NAME tags
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_config_builder/Dockerfile' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:${_BUILD_TYPE}-${_TAG_NAME}' --cache-from 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:latest' --push '.'
+        # For presubmit build, we push presubmit-{BUILD_ID} tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME}"
       elif [ "$_BUILD_TYPE" == "official" ]; then
-        # If it's official, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with TAG_NAME, official-TAG_NAME and latest tags
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_config_builder/Dockerfile' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:${_BUILD_TYPE}-${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:latest' --cache-from 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:latest' --push '.'
-        # If it's official, also push to gcr.io
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_config_builder/Dockerfile' -t 'gcr.io/${_OUTPUT_PROJECT}/cos-gpu-config-builder:latest' -t 'gcr.io/${_OUTPUT_PROJECT}/cos-gpu-config-builder:${_TAG_NAME}' --cache-from 'gcr.io/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-config-builder:latest' --push '.'
+        # For official build, we push presubmit-{BUILD_ID} and latest tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME} latest"
       else
         echo "Invalid BUILD_TYPE: $_BUILD_TYPE"
         exit 1
       fi
+
+      # Build and tag for gcr-io-dev. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+        docker push "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+      done
+
+      # Build and tag for gcr.io. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+        docker push "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+      done
+images:
+- 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}'
+- 'gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}'
 timeout: 3600s
diff --git a/src/cmd/cos_gpu_driver_builder/cloudbuild.yaml b/src/cmd/cos_gpu_driver_builder/cloudbuild.yaml
index 4af11cc..1b00e18 100644
--- a/src/cmd/cos_gpu_driver_builder/cloudbuild.yaml
+++ b/src/cmd/cos_gpu_driver_builder/cloudbuild.yaml
@@ -1,26 +1,43 @@
 options:
-  env:
-  - 'DOCKER_CLI_EXPERIMENTAL=enabled'
+  requestedVerifyOption: VERIFIED
+substitutions:
+  _IMAGE_NAME: cos-gpu-driver-builder
+  _IMAGE_FOLDER_NAME: cos_gpu_driver_builder
+  _RUN_PATH: .
+
 steps:
 - name: 'gcr.io/cloud-builders/docker'
-  args: ['buildx', 'create', '--name', 'builder']
-- name: 'gcr.io/cloud-builders/docker'
-  args: ['buildx', 'use', 'builder']
-- name: 'gcr.io/cloud-builders/docker'
+  id: build-and-tag
   entrypoint: 'bash'
   args:
     - '-c'
     - |
+      TAGS=""
       if [ "$_BUILD_TYPE" == "presubmit" ]; then
-        # If it's presubmit, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with TAG_NAME and presubmit-TAG_NAME tags
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_driver_builder/Dockerfile' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:${_BUILD_TYPE}-${_TAG_NAME}' --cache-from 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:latest' --push '.'
+        # For presubmit build, we push presubmit-{BUILD_ID} tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME}"
       elif [ "$_BUILD_TYPE" == "official" ]; then
-        # If it's official, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with TAG_NAME, official-TAG_NAME and latest tags
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_driver_builder/Dockerfile' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:${_BUILD_TYPE}-${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:latest' --cache-from 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:latest' --push '.'
-        # If it's official, also push to gcr.io
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_driver_builder/Dockerfile' -t 'gcr.io/${_OUTPUT_PROJECT}/cos-gpu-driver-builder:latest' -t 'gcr.io/${_OUTPUT_PROJECT}/cos-gpu-driver-builder:${_TAG_NAME}' --cache-from 'gcr.io/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-driver-builder:latest' --push '.'
+        # For official build, we push presubmit-{BUILD_ID} and latest tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME} latest"
       else
         echo "Invalid BUILD_TYPE: $_BUILD_TYPE"
         exit 1
       fi
-timeout: 3600s
\ No newline at end of file
+
+      # Build and tag for gcr-io-dev. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+        docker push "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+      done
+
+      # Build and tag for gcr.io. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+        docker push "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+      done
+images:
+- 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}'
+- 'gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}'
+timeout: 3600s
diff --git a/src/cmd/cos_gpu_installer_v1/cloudbuild.yaml b/src/cmd/cos_gpu_installer_v1/cloudbuild.yaml
index 783af7b..f0eddc7 100644
--- a/src/cmd/cos_gpu_installer_v1/cloudbuild.yaml
+++ b/src/cmd/cos_gpu_installer_v1/cloudbuild.yaml
@@ -1,46 +1,42 @@
-# Copyright 2017 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# GCP Container Builder build request in YAML format.
-# See https://cloud.google.com/container-builder/docs/ for details.
-
 options:
-  env:
-  - 'DOCKER_CLI_EXPERIMENTAL=enabled'
+  requestedVerifyOption: VERIFIED
+substitutions:
+  _IMAGE_NAME: cos-gpu-installer-v1
+  _IMAGE_FOLDER_NAME: cos_gpu_installer_v1/cos-gpu-installer-docker
+  _RUN_PATH: src/cmd/cos_gpu_installer_v1/cos-gpu-installer-docker/
 steps:
 - name: 'gcr.io/cloud-builders/docker'
-  args: ['buildx', 'create', '--name', 'builder']
-- name: 'gcr.io/cloud-builders/docker'
-  args: ['buildx', 'use', 'builder']
-- name: 'gcr.io/cloud-builders/docker'
+  id: build-and-tag
   entrypoint: 'bash'
   args:
     - '-c'
     - |
+      TAGS=""
       if [ "$_BUILD_TYPE" == "presubmit" ]; then
-        # If it's presubmit, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with TAG_NAME and presubmit-TAG_NAME tags
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_installer_v1/cos-gpu-installer-docker/Dockerfile' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:${_BUILD_TYPE}-${_TAG_NAME}' --cache-from 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:latest' --push 'src/cmd/cos_gpu_installer_v1/cos-gpu-installer-docker/'
-        docker pull us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:${_TAG_NAME}
+        # For presubmit build, we push presubmit-{BUILD_ID} tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME}"
       elif [ "$_BUILD_TYPE" == "official" ]; then
-        # If it's official, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with TAG_NAME, official-TAG_NAME and latest tags
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_installer_v1/cos-gpu-installer-docker/Dockerfile' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:${_BUILD_TYPE}-${_TAG_NAME}' -t 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:latest' --cache-from 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:latest' --push 'src/cmd/cos_gpu_installer_v1/cos-gpu-installer-docker/'
-        docker pull us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-gpu-installer-v1:${_TAG_NAME}
-        # If it's official, also push to gcr.io
-        docker buildx build --build-arg 'BUILDKIT_INLINE_CACHE=1' -f 'src/cmd/cos_gpu_installer_v1/cos-gpu-installer-docker/Dockerfile' -t 'gcr.io/${_OUTPUT_PROJECT}/cos-gpu-installer-v1:latest' -t 'gcr.io/${_OUTPUT_PROJECT}/cos-gpu-installer-v1:${_TAG_NAME}' --cache-from 'gcr.io/${_OUTPUT_PROJECT}/cos-gpu-installer-v1:latest' --push 'src/cmd/cos_gpu_installer_v1/cos-gpu-installer-docker/'
-        docker pull gcr.io/${_OUTPUT_PROJECT}/cos-gpu-installer-v1:${_TAG_NAME}
+        # For official build, we push presubmit-{BUILD_ID} and latest tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME} latest"
       else
         echo "Invalid BUILD_TYPE: $_BUILD_TYPE"
         exit 1
       fi
+
+      # Build and tag for gcr-io-dev. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+        docker push "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+      done
+
+      # Build and tag for gcr.io. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+        docker push "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+      done
+images:
+- 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}'
+- 'gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}'
 timeout: 3600s
diff --git a/src/cmd/cos_kernel_devenv/cloudbuild.yaml b/src/cmd/cos_kernel_devenv/cloudbuild.yaml
index 03d09e4..21c0a0a 100644
--- a/src/cmd/cos_kernel_devenv/cloudbuild.yaml
+++ b/src/cmd/cos_kernel_devenv/cloudbuild.yaml
@@ -1,40 +1,43 @@
-# Copyright 2023 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
 options:
-  env:
-  - 'DOCKER_CLI_EXPERIMENTAL=enabled'
+  requestedVerifyOption: VERIFIED
+substitutions:
+  _IMAGE_NAME: cos-kernel-devenv
+  _IMAGE_FOLDER_NAME: cos_kernel_devenv
+  _RUN_PATH: src/cmd/cos_kernel_devenv/
+
 steps:
-- id: 'build-and-push'
-  name: 'gcr.io/cloud-builders/docker'
+- name: 'gcr.io/cloud-builders/docker'
+  id: build-and-tag
   entrypoint: 'bash'
   args:
     - '-c'
     - |
-      docker buildx create --name builder
-      docker buildx use builder
+      TAGS=""
       if [ "$_BUILD_TYPE" == "presubmit" ]; then
-        # If it's presubmit, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with BUILD_ID, presubmit-BUILD_ID tags
-        docker buildx build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:latest -f src/cmd/cos_kernel_devenv/Dockerfile -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:${_TAG_NAME} -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:${_BUILD_TYPE}-${_TAG_NAME} --push src/cmd/cos_kernel_devenv/
-        docker pull us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:${_TAG_NAME}
+        # For presubmit build, we push presubmit-{BUILD_ID} tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME}"
       elif [ "$_BUILD_TYPE" == "official" ]; then
-        # If it's official, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with latest tag, BUILD_ID and official-BUILD_ID tags
-        docker buildx build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:latest -f src/cmd/cos_kernel_devenv/Dockerfile -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:${_TAG_NAME} -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:${_BUILD_TYPE}-${_TAG_NAME} -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:latest --push src/cmd/cos_kernel_devenv/
-        docker pull us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-kernel-devenv:${_TAG_NAME}
-        # If it's official, push to cos-infra-prod/gcr.io. This will be depreciated after exit gates are done.
-        docker buildx build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from gcr.io/${_OUTPUT_PROJECT}/cos-kernel-devenv:latest -f src/cmd/cos_kernel_devenv/Dockerfile -t gcr.io/${_OUTPUT_PROJECT}/cos-kernel-devenv:latest -t gcr.io/${_OUTPUT_PROJECT}/cos-kernel-devenv:${_TAG_NAME} --push src/cmd/cos_kernel_devenv/
-        docker pull gcr.io/${_OUTPUT_PROJECT}/cos-kernel-devenv:${_TAG_NAME}
+        # For official build, we push presubmit-{BUILD_ID} and latest tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME} latest"
       else
         echo "Invalid BUILD_TYPE: $_BUILD_TYPE"
         exit 1
-      fi
\ No newline at end of file
+      fi
+
+      # Build and tag for gcr-io-dev. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+        docker push "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+      done
+
+      # Build and tag for gcr.io. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+        docker push "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+      done
+images:
+- 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}'
+- 'gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}'
+timeout: 3600s
diff --git a/src/cmd/cos_ova_converter/cloudbuild.yaml b/src/cmd/cos_ova_converter/cloudbuild.yaml
index e7e5f84..8832dd1 100644
--- a/src/cmd/cos_ova_converter/cloudbuild.yaml
+++ b/src/cmd/cos_ova_converter/cloudbuild.yaml
@@ -1,43 +1,43 @@
-# Copyright 2021 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an AS IS BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
 options:
-  env:
-    - 'DOCKER_CLI_EXPERIMENTAL=enabled'
+  requestedVerifyOption: VERIFIED
+substitutions:
+  _IMAGE_NAME: cos-ova-converter
+  _IMAGE_FOLDER_NAME: cos_ova_converter
+  _RUN_PATH: .
 
 steps:
-  - id: 'build-and-push'
-    name: 'gcr.io/cloud-builders/docker'
-    entrypoint: 'bash'
-    args:
-      - '-c'
-      - |
-        docker buildx create --name builder
-        docker buildx use builder
-        if [ "$_BUILD_TYPE" == "presubmit" ]; then
-          # If it's presubmit, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with BUILD_ID, presubmit-BUILD_ID tags
-          docker buildx build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:latest -f src/cmd/cos_ova_converter/Dockerfile -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:${_TAG_NAME} -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:${_BUILD_TYPE}-${_TAG_NAME} --push .
-          docker pull us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:${_TAG_NAME}
-        elif [ "$_BUILD_TYPE" == "official" ]; then
-          # If it's official, push to us-docker.pkg.dev/cos-infra-prod/gcr-io-dev with latest tag, BUILD_ID and official-BUILD_ID tags
-          docker buildx build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:latest -f src/cmd/cos_ova_converter/Dockerfile -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:${_TAG_NAME} -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:${_BUILD_TYPE}-${_TAG_NAME} -t us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:latest --push .
-          docker pull us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/cos-ova-converter:${_TAG_NAME}
-          # If it's official, push to cos-infra-prod/gcr.io. This will be depreciated after exit gates are done.
-          docker buildx build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from gcr.io/${_OUTPUT_PROJECT}/cos-ova-converter:latest -f src/cmd/cos_ova_converter/Dockerfile -t gcr.io/${_OUTPUT_PROJECT}/cos-ova-converter:latest -t gcr.io/${_OUTPUT_PROJECT}/cos-ova-converter:${_TAG_NAME} --push .
-          docker pull gcr.io/${_OUTPUT_PROJECT}/cos-ova-converter:${_TAG_NAME}
-        else
-          echo "Invalid BUILD_TYPE: $_BUILD_TYPE"
-          exit 1
-        fi
-    timeout: 7200s
\ No newline at end of file
+- name: 'gcr.io/cloud-builders/docker'
+  id: build-and-tag
+  entrypoint: 'bash'
+  args:
+    - '-c'
+    - |
+      TAGS=""
+      if [ "$_BUILD_TYPE" == "presubmit" ]; then
+        # For presubmit build, we push presubmit-{BUILD_ID} tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME}"
+      elif [ "$_BUILD_TYPE" == "official" ]; then
+        # For official build, we push presubmit-{BUILD_ID} and latest tag.
+        TAGS="${_BUILD_TYPE}-${_TAG_NAME} latest"
+      else
+        echo "Invalid BUILD_TYPE: $_BUILD_TYPE"
+        exit 1
+      fi
+
+      # Build and tag for gcr-io-dev. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}" "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+        docker push "us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:$$TAG"
+      done
+
+      # Build and tag for gcr.io. BUILD_ID tag is pushed by default.
+      docker build -f 'src/cmd/${_IMAGE_FOLDER_NAME}/Dockerfile' -t "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "${_RUN_PATH}"
+      for TAG in $$TAGS; do
+        docker tag "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}" "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+        docker push "gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:$$TAG"
+      done
+images:
+- 'us-docker.pkg.dev/${_OUTPUT_PROJECT}/gcr-io-dev/${_IMAGE_NAME}:${_TAG_NAME}'
+- 'gcr.io/${_OUTPUT_PROJECT}/${_IMAGE_NAME}:${_TAG_NAME}'
+timeout: 3600s