diff --git a/Makefile b/Makefile index c8d2919..d2e9d5d 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ clean: install: install-locales @install -d $(DESTDIR)$(datadir);\ cp -a makedist $(DESTDIR)$(datadir)/;\ - install -d $(DESTDIR)$(sysconfdir)/makedist;\ + install -d -m0600 $(DESTDIR)$(sysconfdir)/makedist;\ cp -a config/config $(DESTDIR)$(sysconfdir)/makedist/config;\ install -d $(DESTDIR)$(sysconfdir)/sysconfig;\ cp -a config/makedist $(DESTDIR)$(sysconfdir)/sysconfig/makedist;\ diff --git a/bin/makedist-docker b/bin/makedist-docker new file mode 100755 index 0000000..20bbd24 --- /dev/null +++ b/bin/makedist-docker @@ -0,0 +1,107 @@ +#!/bin/bash +# makedist-docker - push rootfs images to docker hub +# Copyright (c) 2024 by Silvan Calarco +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +makedist_me="${0##*/}" + +copyleft="\ +makedist-docker - push rootfs images to docker hub +Copyright (c) 2024 by Silvan Calarco +" + +echo "$copyleft" + +function usage() { + echo "\ +usage: $makedist_me target language + +Example: +$makedist_me rootfs-base en +" >&2 +} + +TARGET=$1 +LANGUAGE=$2 + +[ "${TARGET}" -a "${LANGUAGE}" ] || { + usage + exit 1 +} + +. /etc/sysconfig/makedist + +BASEDIR=${REPODIR_LOCAL}/media/rolling/${TARGET}/${LANGUAGE} + +[ "${DOCKER_USER}" -a "${DOCKER_TOKEN}" ] || { + echo "ERROR: missing docker credentials; exiting." + exit 1 +} + +[ "${DOCKER_REPOSITORY}" ] || { + echo "ERROR: missing DOCKER_REPOSITORY declaration; exiting." + exit 1 +} + +create_and_push_manifest() { + local MANIFEST_TAG="$1" + local MANIFESTS_LIST="$2" + local SNAPSHOT_VERSION="$3" + local PLATFORM + + docker manifest rm ${MANIFEST_TAG} + docker manifest create ${MANIFEST_TAG} ${MANIFESTS_LIST} + + for ARCH in x86_64 aarch64 i586; do + if [ "${ARCH}" == "aarch64" ]; then + PLATFORM="arm64" + elif [ "${ARCH}" == "x86_64" ]; then + PLATFORM="amd64" + elif [ "${ARCH}" == "i586" ]; then + PLATFORM="386" + fi + docker manifest annotate ${MANIFEST_TAG} \ + ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION}-${ARCH} \ + --os linux --arch ${PLATFORM} + done + + echo "Pushing manifest with tag ${MANIFEST_TAG}..." + docker manifest push ${MANIFEST_TAG} +} + +docker login -u ${DOCKER_USER} -p ${DOCKER_TOKEN} + +MANIFESTS_LIST="" + +for ARCH in x86_64 aarch64 i586; do + if [ "${ARCH}" == "aarch64" ]; then + PLATFORM="linux/arm64" + elif [ "${ARCH}" == "x86_64" ]; then + PLATFORM="linux/amd64" + elif [ "${ARCH}" == "i586" ]; then + PLATFORM="linux/386" + fi + ROOTFS_ARCHIVE=`readlink -f ${BASEDIR}/openmamba-${TARGET}-${LANGUAGE}-snapshot.${ARCH}.tar.xz` + SNAPSHOT_VERSION=`echo ${ROOTFS_ARCHIVE} | sed "s|.*snapshot-\([0-9]*\).*|\1|"` + if [ "$SNAPSHOT_VERSION" == "" ]; then + echo "ERROR: unable to find snapshot version from ${ROOTFS_ARCHIVE}; skipping ${ARCH}..." + continue + fi + IMAGE_TAG="snapshot-${SNAPSHOT_VERSION}-${ARCH}" + if [ -z "$(docker images -q ${DOCKER_REPOSITORY}:${IMAGE_TAG} 2>/dev/null)" ]; then + echo "Importing `basename ${ROOTFS_ARCHIVE}` (arch:${ARCH};version:${SNAPSHOT_VERSION})..." + xzcat ${ROOTFS_ARCHIVE} | docker import --platform ${PLATFORM} - ${DOCKER_REPOSITORY}:${IMAGE_TAG} || exit 1 + else + echo "Image ${DOCKER_REPOSITORY}:${IMAGE_TAG} already exists locally" + fi + docker push ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION}-${ARCH} + MANIFESTS_LIST="${MANIFESTS_LIST} ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION}-${ARCH}" +done + +# Prepare multiplatform manifest +create_and_push_manifest ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION} "${MANIFESTS_LIST}" ${SNAPSHOT_VERSION} +create_and_push_manifest ${DOCKER_REPOSITORY}:latest "${MANIFESTS_LIST}" ${SNAPSHOT_VERSION} diff --git a/config/makedist b/config/makedist index 588de46..050234a 100644 --- a/config/makedist +++ b/config/makedist @@ -8,6 +8,10 @@ MILESTONES="milestone3 milestone2 devel" PROJECTURL=https://openmamba.org #TORRENTURL=http://torrent.mambasoft.it:8080/announce +DOCKER_USER="" +DOCKER_TOKEN="" +DOCKER_REPOSITORY="openmamba/openmamba" + # list of supported languages # HTML_LANGS="it en" @@ -85,7 +89,7 @@ else # MEDIA_SUBPLATFORM[3]= # MEDIA_VARIANT[3]= # MEDIA_LANGUAGES[3]="it en" -# MEDIA_ARCHS[3]="arm aarch64 i586 x86_64" +# MEDIA_ARCHS[3]="aarch64 i586 x86_64" # MEDIA_MONTHDAY[3]=25 # MEDIA_MILESTONE[4]=devel @@ -95,7 +99,7 @@ else # MEDIA_SUBPLATFORM[4]= # MEDIA_VARIANT[4]= # MEDIA_LANGUAGES[4]="it en" -# MEDIA_ARCHS[4]="arm aarch64 i586 x86_64" +# MEDIA_ARCHS[4]="aarch64 i586 x86_64" # MEDIA_MONTHDAY[4]=20 fi