Cirrus: Add RHEL-7 testing

Add necessary tweaks to base-image build/import process so that image
can successfully boot with networking enabled.  Build the base image and
update ``.cirrus.yml`` accordingly.

Also make a minor improvement to cache-image building to help save space in
GCP image storage.  Namely, instead of storing every produced image, export
them into google storage buckets w/ life-cycle enabled.  For production use,
they may be converted back into GCE images, otherwise they will expire after
a time.

Signed-off-by: Chris Evich <cevich@redhat.com>
This commit is contained in:
Chris Evich
2019-01-21 08:48:15 -05:00
parent b71088a01e
commit 8ca6706be0
9 changed files with 85 additions and 28 deletions

View File

@ -31,7 +31,7 @@ env:
PRIOR_FEDORA_CACHE_IMAGE_NAME: "fedora-28-libpod-7f4cd1f7" PRIOR_FEDORA_CACHE_IMAGE_NAME: "fedora-28-libpod-7f4cd1f7"
UBUNTU_CACHE_IMAGE_NAME: "ubuntu-18-libpod-7f4cd1f7" UBUNTU_CACHE_IMAGE_NAME: "ubuntu-18-libpod-7f4cd1f7"
# RHEL_CACHE_IMAGE_NAME: "rhel-8-notready" # RHEL_CACHE_IMAGE_NAME: "rhel-8-notready"
# PRIOR_RHEL_CACHE_IMAGE_NAME: "rhel-7-libpod-7f4cd1f7" PRIOR_RHEL_CACHE_IMAGE_NAME: "rhel-7-libpod-7f4cd1f7"
# CENTOS_CACHE_IMAGE_NAME: "centos-7-notready" # CENTOS_CACHE_IMAGE_NAME: "centos-7-notready"
#### ####
@ -45,9 +45,9 @@ env:
CRIU_COMMIT: "c74b83cd49c00589c0c0468ba5fe685b67fdbd0a" CRIU_COMMIT: "c74b83cd49c00589c0c0468ba5fe685b67fdbd0a"
RUNC_COMMIT: "25f3f893c86d07426df93b7aa172f33fdf093fbd" RUNC_COMMIT: "25f3f893c86d07426df93b7aa172f33fdf093fbd"
# CSV of cache-image names to build (see $PACKER_BASE/libpod_images.json) # CSV of cache-image names to build (see $PACKER_BASE/libpod_images.json)
PACKER_BUILDS: "ubuntu-18,fedora-29,fedora-28" # TODO: fah-29,rhel-7,centos-7 PACKER_BUILDS: "ubuntu-18,fedora-29,fedora-28,rhel-7" # TODO: rhel-8,centos-7
# Version of packer to use # Version of packer to use
PACKER_VER: "1.3.1" PACKER_VER: "1.3.2"
# Special image w/ nested-libvirt + tools for creating new cache and base images # Special image w/ nested-libvirt + tools for creating new cache and base images
IMAGE_BUILDER_CACHE_IMAGE_NAME: "image-builder-image-1541772081" IMAGE_BUILDER_CACHE_IMAGE_NAME: "image-builder-image-1541772081"
# Google-maintained base-image names # Google-maintained base-image names
@ -58,7 +58,7 @@ env:
PRIOR_FEDORA_BASE_IMAGE: "fedora-cloud-base-28-1-1-1544474897" PRIOR_FEDORA_BASE_IMAGE: "fedora-cloud-base-28-1-1-1544474897"
FAH_BASE_IMAGE: "fedora-atomichost-29-20181025-1-1541787861" FAH_BASE_IMAGE: "fedora-atomichost-29-20181025-1-1541787861"
# RHEL image must be imported, google bills extra for their native image. # RHEL image must be imported, google bills extra for their native image.
RHEL_BASE_IMAGE: "rhel-guest-image-7-6-210-x86-64-qcow2-1541783972" RHEL_BASE_IMAGE: "rhel-guest-image-7-6-210-x86-64-qcow2-1548099756"
#### ####
#### Credentials and other secret-sauces, decrypted at runtime when authorized. #### Credentials and other secret-sauces, decrypted at runtime when authorized.
@ -134,6 +134,7 @@ build_each_commit_task:
- git fetch --depth $CIRRUS_CLONE_DEPTH origin $CIRRUS_BASE_BRANCH - git fetch --depth $CIRRUS_CLONE_DEPTH origin $CIRRUS_BASE_BRANCH
- env GOPATH=/var/tmp/go/ make build-all-new-commits GIT_BASE_BRANCH=origin/$CIRRUS_BASE_BRANCH - env GOPATH=/var/tmp/go/ make build-all-new-commits GIT_BASE_BRANCH=origin/$CIRRUS_BASE_BRANCH
# This task does the unit and integration testing for every platform # This task does the unit and integration testing for every platform
testing_task: testing_task:
@ -154,10 +155,10 @@ testing_task:
image_name: "${FEDORA_CACHE_IMAGE_NAME}" image_name: "${FEDORA_CACHE_IMAGE_NAME}"
image_name: "${PRIOR_FEDORA_CACHE_IMAGE_NAME}" image_name: "${PRIOR_FEDORA_CACHE_IMAGE_NAME}"
image_name: "${UBUNTU_CACHE_IMAGE_NAME}" image_name: "${UBUNTU_CACHE_IMAGE_NAME}"
image_name: "${PRIOR_RHEL_CACHE_IMAGE_NAME}"
# TODO: tests fail # TODO: tests fail
# image_name: "${RHEL_CACHE_IMAGE_NAME} # image_name: "${RHEL_CACHE_IMAGE_NAME}"
# image_name: "${PRIOR_RHEL_CACHE_IMAGE_NAME}
# image_name: "${CENTOS_CACHE_IMAGE_NAME}" # image_name: "${CENTOS_CACHE_IMAGE_NAME}"
timeout_in: 120m timeout_in: 120m
@ -191,9 +192,9 @@ optional_testing_task:
image_name: "${FEDORA_CACHE_IMAGE_NAME}" image_name: "${FEDORA_CACHE_IMAGE_NAME}"
image_name: "${PRIOR_FEDORA_CACHE_IMAGE_NAME}" image_name: "${PRIOR_FEDORA_CACHE_IMAGE_NAME}"
image_name: "${UBUNTU_CACHE_IMAGE_NAME}" image_name: "${UBUNTU_CACHE_IMAGE_NAME}"
image_name: "${PRIOR_RHEL_CACHE_IMAGE_NAME}"
# TODO: Make these work (also build_images_task below) # TODO: Make these work (also build_images_task below)
# image_name: "${RHEL_CACHE_IMAGE_NAME} # image_name: "${RHEL_CACHE_IMAGE_NAME}"
# image_name: "${PRIOR_RHEL_CACHE_IMAGE_NAME}
# image_name: "${CENTOS_CACHE_IMAGE_NAME}" # image_name: "${CENTOS_CACHE_IMAGE_NAME}"
timeout_in: 60m timeout_in: 60m

View File

@ -42,15 +42,33 @@ then
fi fi
fi fi
set -x
cd "$GOSRC/$PACKER_BASE" cd "$GOSRC/$PACKER_BASE"
# Separate PR-produced images from those produced on master.
if [[ "${CIRRUS_BRANCH:-}" == "master" ]]
then
POST_MERGE_BUCKET_SUFFIX="-master"
else
POST_MERGE_BUCKET_SUFFIX=""
fi
make libpod_images \ make libpod_images \
PACKER_BUILDS=$PACKER_BUILDS \ PACKER_BUILDS=$PACKER_BUILDS \
PACKER_VER=$PACKER_VER \ PACKER_VER=$PACKER_VER \
GOSRC=$GOSRC \ GOSRC=$GOSRC \
SCRIPT_BASE=$SCRIPT_BASE \ SCRIPT_BASE=$SCRIPT_BASE \
PACKER_BASE=$PACKER_BASE \ PACKER_BASE=$PACKER_BASE \
POST_MERGE_BUCKET_SUFFIX=$POST_MERGE_BUCKET_SUFFIX \
BUILT_IMAGE_SUFFIX=$BUILT_IMAGE_SUFFIX BUILT_IMAGE_SUFFIX=$BUILT_IMAGE_SUFFIX
record_timestamp "cache-image build end" record_timestamp "cache-image build end"
# When successful, upload manifest of produced images using a filename unique
# to this build.
URI="gs://packer-import${POST_MERGE_BUCKET_SUFFIX}/manifest${BUILT_IMAGE_SUFFIX}.json"
gsutil cp packer-manifest.json "$URI"
echo "Finished."
echo "Any tarball URI's referenced above at at $URI"
echo "may be used to create VM images suitable for use in"
echo ".cirrus.yml as values for the 'image_name' keys."

View File

@ -3,7 +3,7 @@
# builder name(s) from applicable YAML file, # builder name(s) from applicable YAML file,
# e.g for names see libpod_images.yml # e.g for names see libpod_images.yml
PACKER_VER ?= 1.3.1 PACKER_VER ?= 1.3.2
PACKER_DIST_FILENAME := packer_${PACKER_VER}_linux_amd64.zip PACKER_DIST_FILENAME := packer_${PACKER_VER}_linux_amd64.zip
# Only needed for libpod_base_images target # Only needed for libpod_base_images target
@ -11,6 +11,7 @@ TIMESTAMP := $(shell date +%s)
GOSRC ?= $(shell realpath "./../../../") GOSRC ?= $(shell realpath "./../../../")
PACKER_BASE ?= contrib/cirrus/packer PACKER_BASE ?= contrib/cirrus/packer
SCRIPT_BASE ?= contrib/cirrus SCRIPT_BASE ?= contrib/cirrus
POST_MERGE_BUCKET_SUFFIX ?=
# For debugging nested-virt, use # For debugging nested-virt, use
#TTYDEV := $(shell tty) #TTYDEV := $(shell tty)
@ -50,10 +51,6 @@ endif
-var PACKER_BASE=$(PACKER_BASE) \ -var PACKER_BASE=$(PACKER_BASE) \
-var SCRIPT_BASE=$(SCRIPT_BASE) \ -var SCRIPT_BASE=$(SCRIPT_BASE) \
libpod_images.json libpod_images.json
@echo ""
@echo "Finished. The images mentioned above, and in packer-manifest.json"
@echo "can be used in .cirrus.yml as values for the 'image_name' keys"
@echo ""
cidata.ssh: cidata.ssh:
ssh-keygen -f $@ -P "" -q ssh-keygen -f $@ -P "" -q
@ -100,9 +97,6 @@ endif
-var RHEL_IMAGE_FILE=$(RHEL_IMAGE_FILE) \ -var RHEL_IMAGE_FILE=$(RHEL_IMAGE_FILE) \
-var RHEL_CSUM_FILE=$(RHEL_CSUM_FILE) \ -var RHEL_CSUM_FILE=$(RHEL_CSUM_FILE) \
-var 'RHSM_COMMAND=$(RHSM_COMMAND)' \ -var 'RHSM_COMMAND=$(RHSM_COMMAND)' \
-var POST_MERGE_BUCKET_SUFFIX=$(POST_MERGE_BUCKET_SUFFIX) \
-only $(PACKER_BUILDS) \ -only $(PACKER_BUILDS) \
libpod_base_images.json libpod_base_images.json
@echo ""
@echo "Finished. The images mentioned above, and in packer-manifest.json"
@echo "can be used in .cirrus.yml as values for the *_BASE_IMAGE keys."
@echo ""

View File

@ -25,6 +25,7 @@ ooe.sh sudo yum -y update
ooe.sh sudo yum -y install centos-release-scl epel-release ooe.sh sudo yum -y install centos-release-scl epel-release
ooe.sh sudo yum -y install \ ooe.sh sudo yum -y install \
PyYAML \
atomic-registries \ atomic-registries \
btrfs-progs-devel \ btrfs-progs-devel \
bzip2 \ bzip2 \

View File

@ -45,10 +45,13 @@ ooe.sh sudo yum -y install \
qemu-kvm-tools \ qemu-kvm-tools \
qemu-user \ qemu-user \
rsync \ rsync \
rng-tools \
unzip \ unzip \
util-linux \ util-linux \
vim vim
sudo systemctl enable rngd
sudo ln -s /usr/libexec/qemu-kvm /usr/bin/ sudo ln -s /usr/libexec/qemu-kvm /usr/bin/
sudo tee /etc/modprobe.d/kvm-nested.conf <<EOF sudo tee /etc/modprobe.d/kvm-nested.conf <<EOF

View File

@ -105,7 +105,7 @@ builders:
ssh_username: 'root' ssh_username: 'root'
- <<: *nested_virt - <<: *nested_virt
name: 'prior_fedora' name: 'prior-fedora'
iso_url: '{{user `PRIOR_FEDORA_IMAGE_URL`}}' iso_url: '{{user `PRIOR_FEDORA_IMAGE_URL`}}'
iso_checksum_url: '{{user `PRIOR_FEDORA_CSUM_URL`}}' iso_checksum_url: '{{user `PRIOR_FEDORA_CSUM_URL`}}'
@ -161,7 +161,7 @@ provisioners:
post-processors: post-processors:
- - type: "compress" - - type: "compress"
only: ['fedora', 'prior_fedora', 'fah', 'rhel'] only: ['fedora', 'prior-fedora', 'fah', 'rhel']
output: '/tmp/{{build_name}}/disk.raw.tar.gz' output: '/tmp/{{build_name}}/disk.raw.tar.gz'
format: '.tar.gz' format: '.tar.gz'
compression_level: 9 compression_level: 9
@ -171,12 +171,12 @@ post-processors:
project_id: '{{user `GCP_PROJECT_ID`}}' project_id: '{{user `GCP_PROJECT_ID`}}'
account_file: '{{user `GOOGLE_APPLICATION_CREDENTIALS`}}' account_file: '{{user `GOOGLE_APPLICATION_CREDENTIALS`}}'
bucket: '{{user `XFERBUCKET`}}' bucket: '{{user `XFERBUCKET`}}'
gcs_object_name: '{{build_name}}-{{user `TIMESTAMP`}}-{{uuid}}.tar.gz' gcs_object_name: '{{build_name}}-{{user `TIMESTAMP`}}.tar.gz'
image_name: "{{user `FEDORA_BASE_IMAGE_NAME`}}-{{user `TIMESTAMP`}}" image_name: "{{user `FEDORA_BASE_IMAGE_NAME`}}-{{user `TIMESTAMP`}}"
image_description: 'Based on {{user `FEDORA_IMAGE_URL`}}' image_description: 'Based on {{user `FEDORA_IMAGE_URL`}}'
image_family: '{{user `FEDORA_BASE_IMAGE_NAME`}}' image_family: '{{user `FEDORA_BASE_IMAGE_NAME`}}'
- <<: *gcp_import - <<: *gcp_import
only: ['prior_fedora'] only: ['prior-fedora']
image_name: "{{user `PRIOR_FEDORA_BASE_IMAGE_NAME`}}-{{user `TIMESTAMP`}}" image_name: "{{user `PRIOR_FEDORA_BASE_IMAGE_NAME`}}-{{user `TIMESTAMP`}}"
image_description: 'Based on {{user `PRIOR_FEDORA_IMAGE_URL`}}' image_description: 'Based on {{user `PRIOR_FEDORA_IMAGE_URL`}}'
image_family: '{{user `PRIOR_FEDORA_BASE_IMAGE_NAME`}}' image_family: '{{user `PRIOR_FEDORA_BASE_IMAGE_NAME`}}'

View File

@ -29,6 +29,10 @@ variables:
SERVICE_ACCOUNT: '{{env `SERVICE_ACCOUNT`}}' SERVICE_ACCOUNT: '{{env `SERVICE_ACCOUNT`}}'
GOOGLE_APPLICATION_CREDENTIALS: '{{env `GOOGLE_APPLICATION_CREDENTIALS`}}' GOOGLE_APPLICATION_CREDENTIALS: '{{env `GOOGLE_APPLICATION_CREDENTIALS`}}'
# Used to separate images produced during PR testing from those
# produced from post-merge testing. Must be empty for PR testing.
POST_MERGE_BUCKET_SUFFIX: ''
# Don't leak sensitive values in error messages / output # Don't leak sensitive values in error messages / output
sensitive-variables: sensitive-variables:
- 'GCE_SSH_USERNAME' - 'GCE_SSH_USERNAME'
@ -84,13 +88,18 @@ provisioners:
- type: 'shell' - type: 'shell'
script: '{{user `GOSRC`}}/{{user `PACKER_BASE`}}/{{split build_name "-" 0}}_setup.sh' script: '{{user `GOSRC`}}/{{user `PACKER_BASE`}}/{{split build_name "-" 0}}_setup.sh'
environment_vars: environment_vars:
- 'SCRIPT_BASE={{user `SCRIPT_BASE`}}' - 'GOSRC=/tmp/libpod'
- 'CNI_COMMIT={{user `CNI_COMMIT`}}' - 'CNI_COMMIT={{user `CNI_COMMIT`}}'
- 'FEDORA_CNI_COMMIT={{user `FEDORA_CNI_COMMIT`}}' - 'FEDORA_CNI_COMMIT={{user `FEDORA_CNI_COMMIT`}}'
- 'CRIO_COMMIT={{user `CRIO_COMMIT`}}' - 'CRIO_COMMIT={{user `CRIO_COMMIT`}}'
- 'CRIU_COMMIT={{user `CRIU_COMMIT`}}' - 'CRIU_COMMIT={{user `CRIU_COMMIT`}}'
- 'RUNC_COMMIT={{user `RUNC_COMMIT`}}' - 'RUNC_COMMIT={{user `RUNC_COMMIT`}}'
- 'SCRIPT_BASE={{user `SCRIPT_BASE`}}'
- 'RHSM_COMMAND={{user `RHSM_COMMAND`}}' - 'RHSM_COMMAND={{user `RHSM_COMMAND`}}'
post-processors: post-processors:
- - type: 'manifest' # Store VM disk in GCP storage, where it will expire based on a defined
# lifecycle. This prevents GCE from filling with disused images.
- - type: 'googlecompute-export'
paths: ['gs://packer-import{{user `POST_MERGE_BUCKET_SUFFIX`}}/{{build_name}}{{user `BUILT_IMAGE_SUFFIX`}}.tar.gz']
- type: 'manifest' # writes packer-manifest.json

View File

@ -16,6 +16,8 @@ req_env_var "
install_ooe install_ooe
rhsm_enable
echo "Setting up repos" echo "Setting up repos"
# Frequently needed # Frequently needed
ooe.sh sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm ooe.sh sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
@ -32,12 +34,15 @@ gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM EOM
rhsm_enable echo "Updating all packages"
ooe.sh sudo yum -y update
echo "Installing/removing packages" echo "Installing/removing packages"
ooe.sh sudo yum -y install google-compute-engine google-compute-engine-oslogin ooe.sh sudo yum -y install rng-tools google-compute-engine google-compute-engine-oslogin
ooe.sh sudo yum -y erase "cloud-init" "rh-amazon-rhui-client*" || true
echo "Enabling critical services"
ooe.sh sudo systemctl enable \ ooe.sh sudo systemctl enable \
rngd \
google-accounts-daemon \ google-accounts-daemon \
google-clock-skew-daemon \ google-clock-skew-daemon \
google-instance-setup \ google-instance-setup \
@ -47,6 +52,29 @@ ooe.sh sudo systemctl enable \
rhel_exit_handler # release subscription! rhel_exit_handler # release subscription!
echo "Configuring boot"
cat << "EOF" | sudo tee /etc/default/grub
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=38400"
GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0,38400n8"
GRUB_DISABLE_RECOVERY="true"
EOF
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
echo "Configuring networking"
ooe.sh sudo nmcli connection modify 'System eth0' 802-3-ethernet.mtu 1460
ooe.sh sudo nmcli connection modify 'System eth0' connection.autoconnect yes
ooe.sh sudo nmcli connection modify 'System eth0' connection.autoconnect-priority
ooe.sh sudo nmcli connection modify 'System eth0' ipv4.method auto
ooe.sh sudo nmcli connection modify 'System eth0' ipv4.dhcp-send-hostname yes
ooe.sh sudo nmcli connection modify 'System eth0' ipv4.dhcp-timeout 0
ooe.sh sudo nmcli connection modify 'System eth0' ipv4.never-default no
ooe.sh /usr/bin/google_instance_setup
rh_finalize rh_finalize
echo "SUCCESS!" echo "SUCCESS!"

View File

@ -31,6 +31,7 @@ ooe.sh sudo subscription-manager repos \
ooe.sh sudo yum -y update ooe.sh sudo yum -y update
ooe.sh sudo yum -y install \ ooe.sh sudo yum -y install \
PyYAML \
atomic-registries \ atomic-registries \
btrfs-progs-devel \ btrfs-progs-devel \
bzip2 \ bzip2 \
@ -64,9 +65,11 @@ ooe.sh sudo yum -y install \
protobuf-python \ protobuf-python \
python \ python \
python2-future \ python2-future \
python2-pyyaml \
python34-dateutil \ python34-dateutil \
python34-psutil \ python34-psutil \
python34-pytoml \ python34-pytoml \
python34-PyYAML \
runc \ runc \
skopeo-containers \ skopeo-containers \
unzip \ unzip \