base-image-builder/cloudbuild.yaml (134 lines of code) (raw):
# Copyright 2019 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.
steps:
- id: 'clone_community_builders'
name: 'gcr.io/cloud-builders/git'
args: ['clone', 'https://github.com/GoogleCloudPlatform/cloud-builders-community']
- id: 'add_packer_builder'
waitFor: ['clone_community_builders']
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: "bash"
args:
- '-c'
- |
PACKER_BUILDER_VERSION_STRING=$(gcloud container images list-tags gcr.io/$PROJECT_ID/packer --format='value(tags)' | grep latest )
PACKER_BUILDER_VERSION=$(echo "$$PACKER_BUILDER_VERSION_STRING" | awk -F',' '{print $1}')
NESTED_VIRT_IMAGE=$(gcloud compute images list --no-standard-images --filter 'family:nested-virt' --format 'value(name)')
NESTED_PACKER_IMAGE=$(gcloud compute images list --no-standard-images --filter 'family:nested-packer' --format 'value(name)')
if [ -z $$PACKER_BUILDER_VERSION ]; then
cd cloud-builders-community/packer
gcloud builds submit .
else
echo "Using packer version : $$PACKER_BUILDER_VERSION"
fi
if [ -z $$NESTED_VIRT_IMAGE ]; then
echo "No preexisting images with nested-virtualization enabled exist"
else
echo "Found GCE Image(s) with Nested Virtualzation Enabled : $$NESTED_VIRT_IMAGE"
echo $$NESTED_VIRT_IMAGE > /workspace/nested-images-versions.txt
fi
if [ -z $$NESTED_PACKER_IMAGE ]; then
echo "No preexisting images with nested-virtualization enabled and packer installed exist"
else
echo "Found GCE Image(s) with Nested Virtualzation Enabled and packer installed : $$NESTED_PACKER_IMAGE"
echo $$NESTED_PACKER_IMAGE > /workspace/nested-packer-images-versions.txt
fi
- id: 'create_nested_virtualization_image'
name: 'gcr.io/$PROJECT_ID/packer'
entrypoint: bash
waitFor: ['add_packer_builder']
args:
- '-c'
- |
function create_nested_gce_image(){
cat <<NESTED_VIRT_SPEC>nested-virt-spec.json
{
"builders": [
{
"image_name": "nested-virtualization-centos-7",
"type": "googlecompute",
"project_id": "$PROJECT_ID",
"source_image_family": "centos-7",
"image_family": "nested-virt",
"ssh_username": "packer",
"zone": "${_IMAGE_ZONE}",
"image_licenses": ["projects/vm-options/global/licenses/enable-vmx"]
}
]
}
NESTED_VIRT_SPEC
packer validate nested-virt-spec.json
packer build -force nested-virt-spec.json
}
if [ ${_BUILD_NESTED_VIRT_IMAGE} == 'true' ]; then
create_nested_gce_image
else
if [ -f /workspace/nested-images-versions.txt ]; then
NESTED_VIRT_IMAGE_VERSION=$(cat /workspace/nested-images-versions.txt)
echo "Skipping the nested-virt Image Build b/c existing version(s) found: $$NESTED_VIRT_IMAGE_VERSION"
else
create_nested_gce_image
fi
fi
- id: create_packer_agent
waitFor: 'create_nested_virtualization_image'
name: 'gcr.io/$PROJECT_ID/packer'
entrypoint: "bash"
args:
- '-c'
- |
function create_packer_agent_image(){
echo '#!/bin/bash' > packer-install-script.sh
cat <<PACKER_INSTALL>>packer-install-script.sh
yum update -y && yum install git unzip wget qemu-kvm -y
echo "export PATH=$_PATH:/usr/libexec" > /etc/profile.d/libexec-path.sh
source /etc/profile.d/libexec-path.sh
curl -LO \
https://releases.hashicorp.com/packer/1.3.0/packer_1.3.0_linux_amd64.zip
unzip packer_1.3.0_linux_amd64.zip
cp packer /usr/bin/packerio
PACKER_INSTALL
cat <<AGENT_SPEC>agent-spec.json
{
"builders": [
{
"type": "googlecompute",
"image_name": "nested-packer-image-${_AGENT_VERSION}",
"image_family": "nested-packer",
"project_id": "$PROJECT_ID",
"source_image": "nested-virtualization-centos-7",
"ssh_username": "packer",
"zone": "${_IMAGE_ZONE}",
"min_cpu_platform": "Intel Haswell",
"startup_script_file": "packer-install-script.sh"
}
]
}
AGENT_SPEC
packer validate agent-spec.json
packer build -force agent-spec.json
}
if [ ${_BUILD_PACKER_AGENT_IMAGE} == 'true' ]; then
create_packer_agent_image
else
if [ -f /workspace/nested-packer-images-versions.txt ]; then
NESTED_PACKER_IMAGE_VERSION=$(cat /workspace/nested-packer-images-versions.txt)
echo "Skipping the nested-virt packer Image Build b/c existing version(s) found: $$NESTED_PACKER_IMAGE_VERSION"
else
create_packer_agent_image
fi
fi
- id: 'build_base-image-builder_builder'
name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/base-image-builder:latest', '.' ]
- id: 'push_base-image-builder_builder'
name: 'gcr.io/cloud-builders/docker'
waitFor: ['build_base-image-builder_builder']
args: ['push', 'gcr.io/$PROJECT_ID/base-image-builder:latest']
images: ['gcr.io/$PROJECT_ID/base-image-builder:latest']
timeout: 1200s
substitutions:
_PATH: '\$PATH'
_IMAGE_ZONE: 'us-central1-f'
_AGENT_VERSION: 'v1'
_BUILD_NESTED_VIRT_IMAGE: 'true'
_BUILD_PACKER_AGENT_IMAGE: 'true'
tags: ['cloud-builders-community']