diff --git a/release/Makefile b/release/Makefile --- a/release/Makefile +++ b/release/Makefile @@ -83,6 +83,9 @@ .if !defined(NOSRC) DISTRIBUTIONS+= src.txz .endif +.if defined(WITH_OCIIMAGES) && !empty(WITH_OCIIMAGES) +DISTRIBUTIONS+= container-image-static.txz container-image-dynamic.txz container-image-minimal.txz +.endif RELEASE_TARGETS= ftp IMAGES= @@ -156,6 +159,20 @@ --exclude 'usr/ports/INDEX*' --exclude work usr/ports | \ ${XZ_CMD} > ${.OBJDIR}/ports.txz ) +.if defined(WITH_OCIIMAGES) && !empty(WITH_OCIIMAGES) +oci-images: + sh ${.CURDIR}/scripts/make-oci-images.sh ${REVISION} ${BRANCH} ${TARGET_ARCH} + +.for _IMG in static dynamic minimal +container-image-${_IMG}.txz: oci-images + skopeo copy \ + containers-storage:localhost/freebsd${REVISION:R}-${_IMG}:latest \ + oci-archive:${.OBJDIR}/container-image-${_IMG}.tar:freebsd${REVISION:R}-${_IMG}:${REVISION}-${BRANCH}-${TARGET_ARCH} + ${XZ_CMD} < ${.OBJDIR}/container-image-${_IMG}.tar > ${.OBJDIR}/container-image-${_IMG}.txz +.endfor + +.endif + disc1: packagesystem # Install system mkdir -p ${.TARGET} diff --git a/release/release.conf.sample b/release/release.conf.sample --- a/release/release.conf.sample +++ b/release/release.conf.sample @@ -114,3 +114,7 @@ ## If WITH_CLOUDWARE is set to a non-empty value, this is a list of providers ## to create disk images. #CLOUDWARE="EC2 GCE OCI VAGRANT-VIRTUALBOX VAGRANT-VMWARE" + +## If WITH_OCIIMAGES is set to a non-empty value, build Open Container +## Initiative (ICO) base images as part of the release. +#WITH_OCIIMAGES= diff --git a/release/release.sh b/release/release.sh --- a/release/release.sh +++ b/release/release.sh @@ -120,6 +120,9 @@ # cloud providers as part of the release. WITH_CLOUDWARE= + # Set to non-empty to build OCI images as part of the release + WITH_OCIIMAGES= + return 0 } # env_setup() @@ -288,6 +291,42 @@ fi fi + if [ ! -z "${WITH_OCIIMAGES}" ]; then + # Install buildah and skopeo from ports if the ports tree is available; + # otherwise install the pkg. + if [ -d ${CHROOTDIR}/usr/ports ]; then + # Trick the ports 'run-autotools-fixup' target to do the right + # thing. + _OSVERSION=$(chroot ${CHROOTDIR} /usr/bin/uname -U) + REVISION=$(chroot ${CHROOTDIR} make -C /usr/src/release -V REVISION) + BRANCH=$(chroot ${CHROOTDIR} make -C /usr/src/release -V BRANCH) + UNAME_r=${REVISION}-${BRANCH} + GITUNSETOPTS="CONTRIB CURL CVS GITWEB GUI HTMLDOCS" + GITUNSETOPTS="${GITUNSETOPTS} ICONV NLS P4 PERL" + GITUNSETOPTS="${GITUNSETOPTS} SEND_EMAIL SUBTREE SVN" + GITUNSETOPTS="${GITUNSETOPTS} PCRE PCRE2" + PBUILD_FLAGS="OSVERSION=${_OSVERSION} BATCH=yes" + PBUILD_FLAGS="${PBUILD_FLAGS} UNAME_r=${UNAME_r}" + PBUILD_FLAGS="${PBUILD_FLAGS} OSREL=${REVISION}" + PBUILD_FLAGS="${PBUILD_FLAGS} WRKDIRPREFIX=/tmp/ports" + PBUILD_FLAGS="${PBUILD_FLAGS} DISTDIR=/tmp/distfiles" + for _PORT in sysutils/buildah sysutils/skopeo; do + eval chroot ${CHROOTDIR} env ${PBUILD_FLAGS} make -C \ + /usr/ports/${_PORT} \ + FORCE_PKG_REGISTER=1 deinstall install clean distclean + done + else + eval chroot ${CHROOTDIR} env ASSUME_ALWAYS_YES=yes \ + pkg install -y sysutils/buildah sysutils/skopeo + eval chroot ${CHROOTDIR} env ASSUME_ALWAYS_YES=yes \ + pkg clean -y + fi + # Use the vfs storage driver so that this works whether or not + # the build directory is on ZFS. The images are small so the + # performance difference is negligible. + eval chroot ${CHROOTDIR} sed -I .bak -e '/^driver/s/zfs/vfs/' /usr/local/etc/containers/storage.conf + fi + if [ ! -z "${EMBEDDEDPORTS}" ]; then _OSVERSION=$(chroot ${CHROOTDIR} /usr/bin/uname -U) REVISION=$(chroot ${CHROOTDIR} make -C /usr/src/release -V REVISION) @@ -323,6 +362,9 @@ fi eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} buildworld eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_KMAKEFLAGS} buildkernel + if [ ! -z "${WITH_OCIIMAGES}" ]; then + eval chroot ${CHROOTDIR} make -C /usr/src ${RELEASE_WMAKEFLAGS} packages + fi return 0 } # chroot_build_target @@ -343,7 +385,8 @@ VMFORMATS=\"${VMFORMATS}\" VMSIZE=${VMSIZE}" fi eval chroot ${CHROOTDIR} make -C /usr/src/release \ - ${RELEASE_RMAKEFLAGS} release + ${RELEASE_RMAKEFLAGS} release \ + WITH_OCIIMAGES=${WITH_OCIIMAGES} eval chroot ${CHROOTDIR} make -C /usr/src/release \ ${RELEASE_RMAKEFLAGS} install DESTDIR=/R \ WITH_COMPRESSED_IMAGES=${WITH_COMPRESSED_IMAGES} \ diff --git a/release/scripts/make-manifest.sh b/release/scripts/make-manifest.sh --- a/release/scripts/make-manifest.sh +++ b/release/scripts/make-manifest.sh @@ -14,6 +14,9 @@ src="System source tree" lib32="32-bit compatibility libraries" tests="Test suite" +oci_static="OCI base image for static-linked workloads" +oci_dynamic="OCI base image for dynamic-linked workloads" +oci_minimal="OCI base image for minimal shell workloads" desc_base="${base} (MANDATORY)" desc_base_dbg="${base} (Debugging)" @@ -26,6 +29,9 @@ desc_ports="${ports}" desc_src="${src}" desc_tests="${tests}" +desc_oci_static="${oci_static} (Optional)" +desc_oci_dynamic="${oci_dynamic} (Optional)" +desc_oci_minimal="${oci_minimal} (Optional)" default_src=off default_ports=off @@ -35,6 +41,9 @@ default_kernel_alt=off default_kernel_dbg=on default_kernel_alt_dbg=off +default_oci_static=off +default_oci_dynamic=off +default_oci_minimal=off for i in ${*}; do dist="${i}" diff --git a/release/scripts/make-oci-images.sh b/release/scripts/make-oci-images.sh new file mode 100644 --- /dev/null +++ b/release/scripts/make-oci-images.sh @@ -0,0 +1,106 @@ +#! /bin/sh + +# Build Open Container Initiative (OCI) container images. +# +# Three images are built: +# +# - static which contains mtree directories, SSL certificates and a few other +# config files +# - dynamic which adds some dynamic libs on top of static +# - minimal which adds FreeBSD-runtime to support minimal shell workloads + +buildah rmi -af + +rev=$1; shift +branch=$1; shift +arch=$1; shift + +major=${rev%.*} +minor=${rev#*.} + +abi=FreeBSD:${major}:${arch} + +echo "Building OCI images for ${abi}" + +workdir=$(mktemp -d -t oci-images) + +mkdir ${workdir}/repos +cat > ${workdir}/repos/base.conf < /dev/null +mtree -deU -p $m/var -f /etc/mtree/BSD.var.dist > /dev/null +mtree -deU -p $m/usr -f /etc/mtree/BSD.usr.dist > /dev/null +mtree -deU -p $m/usr/include -f /etc/mtree/BSD.include.dist > /dev/null +mtree -deU -p $m/usr/lib -f /etc/mtree/BSD.debug.dist > /dev/null +install_packages ${workdir} $m FreeBSD-caroot FreeBSD-zoneinfo +cp /etc/master.passwd $m/etc +pwd_mkdb -p -d $m/etc $m/etc/master.passwd || return $? +cp /etc/group $m/etc || return $? +cp /etc/termcap.small $m/etc/termcap.small || return $? +cp /etc/termcap.small $m/usr/share/misc/termcap || return $? +env DESTDIR=$m /usr/sbin/certctl rehash +# Generate a suitable repo config for pkgbase +case ${branch} in + CURRENT|STABLE|BETA*) + repo=base_latest + ;; + *) + repo=base_release_${minor} + ;; +esac +mkdir -p $m/usr/local/etc/pkg/repos +cat > $m/usr/local/etc/pkg/repos/base.conf <