#!/bin/bash
usage()
{
cat << EOF
usage: $0 -d <distribution> -s <signame(s)> -t <tag(s)>
This script generate new build target in koji for SIGS.
OPTIONS:
-a ARCHES : Force arches e.g : "x86_64","aarch64 i686", etc...
-b : Enable non public bootstrap repo (SCLO SIG only)
-c COLLECTION : Enable collection in the buildroot e.g : mariadb100
-d DISTRIBUTION : 5 6 7
-p SIG PROJECT NAME : cloud6-<openstack>, sclo-<mariadb100>, etc...
-r SIG PROJECT RELEASE NAME : cloud6-openstack-<juno>
-s SIG NAME : cloud
-t DISTTAGS : "el7 el7.centos el7_0"
-x : delete old -build tag and then recreate.
EOF
}
optiona=false
optionb=false
optiond=false
options=false
optiont=false
optionc=false
optionp=false
optionr=false
optionx=false
while getopts ":hxba:d:s:t:c:p:r:" OPTION
do
case $OPTION in
h)
usage
exit 0
;;
a)
optiona=true
ARCHES="${OPTARG}"
;;
b)
optionb=true
;;
d)
optiond=true
DISTS="${OPTARG}"
;;
s)
options=true
SIGS="${OPTARG}"
;;
r)
optionr=true
RELEASES="${OPTARG}"
;;
p)
optionp=true
PROJECTS="${OPTARG}"
;;
t)
optiont=true
TAGS="${OPTARG}"
;;
c)
optionc=true
COLLECTIONS="${OPTARG}"
;;
x)
optionx=true
;;
?)
exit 0
;;
:)
echo "Option -$OPTARG requires an argument."
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if ! ( $optiond && $options && $optiont )
then
usage
exit 0
fi
# Check if user is allowed to send command to koji and has 'admin' permission
KOJI=`which koji`
PERMS=`$KOJI list-permissions --mine`
ADMIN=false
CONFIG_PATH="$(dirname $BASH_SOURCE)/sigs"
for P in $PERMS
do
[[ $P == 'admin' ]] && ADMIN=true && break
done
if [ "$ADMIN" != true ]
then
echo "[ERROR] Koji misconfigure/missing admin privilege for creating SIG tags"
exit 1
fi
for DIST in $DISTS
do
case $DIST in
5) echo "* Checking distribution el$DIST configuration..."; ( ! $optiona ) && ARCHES="i386 x86_64"; DEFAULT_DISTTAG="el5"
;;
6) echo "* Checking distribution el$DIST configuration..."; ( ! $optiona ) && ARCHES="i686 x86_64"; DEFAULT_DISTTAG="el6"
;;
7) echo "* Checking distribution el$DIST configuration..."; ( ! $optiona ) && ARCHES="x86_64"; DEFAULT_DISTTAG="el7.centos"
;;
8) echo "* Checking distribution el$DIST configuration..."; ( ! $optiona ) && ARCHES="x86_64 aarch64 ppc64le"; DEFAULT_DISTTAG="el8"
;;
8s) echo "* Checking distribution el$DIST configuration..."; ( ! $optiona ) && ARCHES="x86_64 aarch64 ppc64le"; DEFAULT_DISTTAG="el8s"
;;
*) echo "It seems your distribution el${DIST} is unsupported" && continue
;;
esac
$KOJI list-tags | grep buildsys${DIST} &> /dev/null
[ $? -gt 0 ] && echo " -> [ERROR] Something is wrong buildsys${DIST} tag not found." && continue
if [[ "x$DIST" == "x8" || "x$DIST" == "x8s" ]]
then
$KOJI list-external-repos | grep ^centos${DIST}-baseos &> /dev/null
[ $? -gt 0 ] && echo " -> [ERROR] centos${DIST}-baseos external repo not configured in koji." && continue
else
$KOJI list-external-repos | grep ^centos${DIST}-os &> /dev/null
[ $? -gt 0 ] && echo " -> [ERROR] centos${DIST}-os external repo not configured in koji." && continue
$KOJI list-external-repos | grep ^centos${DIST}-updates &> /dev/null
[ $? -gt 0 ] && echo " -> [ERROR] centos${DIST}-updates external repo not configured in koji." && continue
$KOJI list-external-repos | grep ^centos${DIST}-extras &> /dev/null
[ $? -gt 0 ] && echo " -> [ERROR] centos${DIST}-extras external repo not configured in koji." && continue
fi
for SIG in $SIGS
do
# reset values from SIG configuation file
BUILDROOT_DEFAULT=""
echo " -> Checking $SIG config..."
$KOJI add-user $SIG &> /dev/null
[ $? -eq 0 ] && echo "Creating user : ${SIG}" && $KOJI grant-permission --new build-${SIG} $SIG
SIGNAME="${SIG}"
SIG="${SIG}${DIST}"
# Check for SIG-common and create it if not present.
# $KOJI list-tags | grep $SIG-common-candidate &> /dev/null
for PROJECT in $PROJECTS
do
P_SIG="${SIG}-${PROJECT}"
# Add sig project options here FIXME add a command line option for oneshot buildroot fixes.
case ${PROJECT} in
#openstack)
# echo "Reading ${PROJECT} additional configs..."
# BUILDROOT_PKGS_EXTRAS="openstack-macros"
# ;;
*)
BUILDROOT_PKGS_EXTRAS=""
;;
esac
# Check for -common
#$KOJI list-tags | grep $P_SIG-common-candidate &> /dev/null
#if [ $? -gt 0 ]
#then
# echo "Creating tag : ${P_SIG}-common"
# $KOJI add-tag $P_SIG-common-candidate
#
#fi
for RELEASE in $RELEASES
do
R_SIG="${P_SIG}-${RELEASE}"
$KOJI list-tags | grep $R_SIG-candidate &> /dev/null
[ $? -gt 0 ] && echo "Creating tag : ${R_SIG}-candidate" && $KOJI add-tag $R_SIG-candidate && $KOJI edit-tag $R_SIG-candidate --perm=build-${SIGNAME} --arches "${ARCHES}"
$KOJI list-tags | grep $R_SIG-testing &> /dev/null
[ $? -gt 0 ] && echo "Creating tag : ${R_SIG}-testing" && $KOJI add-tag $R_SIG-testing && $KOJI edit-tag $R_SIG-testing --perm=build-${SIGNAME} --arches "${ARCHES}"
$KOJI list-tags | grep $R_SIG-release &> /dev/null
[ $? -gt 0 ] && echo "Creating tag : ${R_SIG}-release" && $KOJI add-tag $R_SIG-release && $KOJI edit-tag $R_SIG-release --perm=build-${SIGNAME} --arches "${ARCHES}"
for TAG in $TAGS
do
# Add collection support abuse TAG variable
REALTAG=$TAG
if ( $optionc )
then
# Abandon collection in the name for the tag, not pratical
# TAG="$TAG-$COLLECTIONS"
TAG="$TAG"
fi
$KOJI list-tags | grep $R_SIG-$TAG-build &> /dev/null
if [ $? -eq 0 ]
then
if ( $optionx )
then
echo " -> deleting buildroot $R_SIG-$TAG-build"
$KOJI remove-tag $R_SIG-$TAG-build
else
echo " -> $R_SIG-$TAG-build tag already exists. skipping." && continue
fi
fi
echo " -> creating $R_SIG-$TAG"
$KOJI add-tag --arches "$ARCHES" $R_SIG-$TAG-build
$KOJI add-target $R_SIG-$TAG $R_SIG-$TAG-build $R_SIG-candidate
# For external repo priorites are increased by 5, Priority 5
if [[ "x$DIST" == "x7" || "x$DIST" == "x8" || "x$DIST" == "x8s" ]]
then
if [[ "x$DIST" == "x8" || "x$DIST" == "x8s" ]]
then
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-cr --mode bare
else
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-cr
fi
fi
if [[ "x$DIST" == "x8" || "x$DIST" == "x8s" ]]
then
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-extras --mode bare
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-powertools --mode bare
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-appstream --mode bare
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-baseos --mode bare
$KOJI edit-tag $R_SIG-$TAG-build --extra="mock.package_manager=dnf"
$KOJI edit-tag $R_SIG-$TAG-build --extra="mock.new_chroot=1"
else
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-extras
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-updates
$KOJI add-external-repo --tag=$R_SIG-$TAG-build centos${DIST}-os
fi
# START bootstrap
if ( $optionb )
then
# START bootstrap for sclo
if [ "x${SIGNAME}" == "xsclo" ]
then
# Priority 15
$KOJI add-external-repo --tag=$R_SIG-$TAG-build sclo${DIST}-bootstrap
fi
# END bootstrap for scl
# Other repo can be added here if needed in the future
# if [ "x${SIGNAME}" == "xABC" ]
# Let's use $SIGNAME$DIST-bootstrap to be consistent
fi
# END bootstrap
$KOJI add-group $R_SIG-$TAG-build build
$KOJI add-group $R_SIG-$TAG-build srpm-build
# Add <collection>-build to the buildroot if collection enabled
if [ -f $CONFIG_PATH/$SIGNAME/$PROJECT/config.sh ]
then
echo "Using specific $SIGNAME/$PROJECT options: "
echo "###"
cat $CONFIG_PATH/$SIGNAME/$PROJECT/config.sh
echo "###"
source $CONFIG_PATH/$SIGNAME/$PROJECT/config.sh
else
BUILDROOT_DEFAULT="curl bash bzip2 coreutils cpio diffutils redhat-release findutils gawk gcc gcc-c++ grep gzip info make patch redhat-rpm-config rpm-build sed shadow-utils tar unzip util-linux-ng which buildsys-tools tar"
COMMON_INHERITANCE=true
fi
if ( $optionc )
then
$KOJI add-group-pkg $R_SIG-$TAG-build build $BUILDROOT_DEFAULT buildsys-macros-$REALTAG $COLLECTIONS-build scl-utils-build
$KOJI add-group-pkg $R_SIG-$TAG-build srpm-build $BUILDROOT_DEFAULT buildsys-macros-$REALTAG $COLLECTIONS-build scl-utils-build
else
$KOJI add-group-pkg $R_SIG-$TAG-build build $BUILDROOT_DEFAULT buildsys-macros-$REALTAG $BUILDROOT_PKGS_EXTRAS
$KOJI add-group-pkg $R_SIG-$TAG-build srpm-build $BUILDROOT_DEFAULT buildsys-macros-$REALTAG $BUILDROOT_PKGS_EXTRAS
fi
if [[ "x$DIST" == "x8" || "x$DIST" == "x8s" ]]
then
$KOJI add-tag-inheritance --priority 5 $R_SIG-$TAG-build buildsys${DIST}-release
else
$KOJI add-tag-inheritance --priority 5 $R_SIG-$TAG-build buildsys${DIST}
fi
$KOJI add-tag-inheritance --priority 10 $R_SIG-$TAG-build $R_SIG-candidate
# If -common exists for the project add it
if [ "x$RELEASE" != "xcommon" ] && [ "x$COMMON_INHERITANCE" != "xfalse" ]
then
$KOJI list-tags | grep $P_SIG-common-candidate &> /dev/null
[ $? -eq 0 ] && echo "Adding $P_SIG-common-candidate as inheritance" && $KOJI add-tag-inheritance --priority 15 $R_SIG-$TAG-build $P_SIG-common-candidate
fi
# Add SIG -common if it exists
if [ "x$COMMON_INHERITANCE" != "xfalse" ]
then
$KOJI list-tags | grep $SIG-common-candidate &> /dev/null
[ $? -eq 0 ] && echo "Adding $SIG-common-candidate as inheritance" && $KOJI add-tag-inheritance --priority 20 $R_SIG-$TAG-build $SIG-common-candidate
fi
# Check if disttag has corresponding buildsys-macros-disttag
if [[ "x$DIST" == "x8" || "x$DIST" == "x8s" ]]
then
$KOJI list-tagged buildsys${DIST}-release | grep buildsys-macros-$REALTAG &> /dev/null
else
$KOJI list-tagged buildsys${DIST} | grep buildsys-macros-$REALTAG &> /dev/null
fi
if [ $? -gt 0 ]
then
if [ "x$REALTAG" != "x$DEFAULT_DISTTAG" ]
then
echo " -> [WARN] buildsys-macros-$REALTAG rpm not found. Please build it within koji on target buildsys${DIST}"
#TODO ; generate spec file from template for overriding macros
[ -f $PWD/etc/buildsys.spec.template ] && echo " -> Generating buildsys-macros-$TAG.spec"
fi
fi
done
done
done
done
done