This script can be distributed to multiple builders to build the various Fedora packages with mock. The setup commands for the server side are included (but commented) in the script below. Note: The script now requires an apache server to be running which allows for the new fedora-release package information to be retrieved for correct build tagging.
> httpd.conf
Alias /builds/ "/tmp/builds/" <Directory "/tmp/builds"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
> arm-builder.sh
#!/bin/bash # COMMON: variable definitions for this script SSHDHOST="1.2.3.4" SSHDUSER="builder" SSHDPASS="/tmp/sshkey" SSHDROOT="/tmp/builds" LOCLTEMP="/tmp/work" SSHDPRIO="${SSHDROOT}/prio" SSHDPKGS="${SSHDROOT}/pkgs" SSHDWORK="${SSHDROOT}/work" SSHDDONE="${SSHDROOT}/done" # SERVER: local and remote account setup #passwd ; chsh -s /bin/bash #mkdir -p ~/.ssh ; echo 'ssh-pub-key@local' > ~/.ssh/authorized_keys #chmod 700 ~/.ssh ~/.ssh/authorized_keys # SERVER: build directory creation #mkdir -p ${SSHDPRIO} ${SSHDPKGS} ${SSHDWORK} ${SSHDDONE} # SERVER: create intial build package files #koji list-tagged dist-f15 --latest > /tmp/list.txt #cd ${SSHDPKGS} ; tail -n +3 /tmp/list.txt | awk '{ print $1 }' | while read line ; do touch "$line" ; done # SERVER: initialize the most basic repo containing F15 release information #urls="http://kojipkgs.fedoraproject.org/packages/fedora-release/15/1" #cd ${SSHDDONE} ; wget "${urls}/src/fedora-release-15-1.src.rpm" "${urls}/noarch/fedora-release-15-1.noarch.rpm" "${urls}/noarch/fedora-release-rawhide-15-1.noarch.rpm" ; createrepo --update -d ${SSHDDONE} # CLIENT: save the ssh key for auto logins (echo '-----BEGIN ssh-pri-key-----') > ${SSHDPASS} chmod 700 ${SSHDPASS} # CLIENT: create a custom fedora repo file for the mock builds echo " config_opts['root'] = 'fedora-15-arm' config_opts['target_arch'] = 'armv5tel' config_opts['legal_host_arches'] = ('armv5tel', 'armv6l', 'armv7l') config_opts['chroot_setup_cmd'] = 'groupinstall buildsys-build' config_opts['dist'] = 'fc15' config_opts['plugin_conf']['root_cache_enable'] = False config_opts['plugin_conf']['yum_cache_enable'] = False config_opts['yum.conf'] = \"\"\" [main] cachedir=/var/cache/yum debuglevel=1 reposdir=/dev/null logfile=/var/log/yum.log retries=20 obsoletes=1 gpgcheck=0 assumeyes=1 syslog_ident=mock syslog_device= # repos [custom] name=fedora-custom baseurl=http://${SSHDHOST}/builds/done/ enabled=1 ### NOTE : USE A VAR HERE FOR THE PATH INSTEAD ### [f15-arm-koji] name=fedora15-arm-koji baseurl=http://arm.koji.fedoraproject.org/repos/dist-f15-build/latest/arm/ enabled=1 [fedora] name=fedora mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-13&arch=arm failovermethod=priority [updates-released] name=updates mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f13&arch=arm failovermethod=priority \"\"\" " > /etc/mock/fedora-15-arm.cfg chmod 755 /etc/mock/fedora-15-arm.cfg # CLIENT: create a tmp working directory for the pkg builds mkdir -p ${LOCLTEMP} chmod 777 ${LOCLTEMP} cd ${LOCLTEMP} # CLIENT: ensure that the mock user is in the mock group (not just primary) useradd -g mock mock usermod -G mock mock chsh -s /bin/bash mock # CLIENT: loop to keep building pkgs while true do # CLIENT: check for a random pkg and move it out of the directory so it can be worked on for dirn in ${SSHDPRIO} ${SSHDPKGS} do pkgn=$(ssh -i ${SSHDPASS} ${SSHDUSER}@${SSHDHOST} "pkgn=\$(ls -t ${dirn} | tail -n 1) ; if [ \"\${pkgn}\" != \"\" ] ; then mv ${dirn}/\${pkgn} ${SSHDWORK}/ ; echo \${pkgn} ; fi") if [ "${pkgn}" != "" ] then break fi done # CLIENT: remove any old build files rm -frv ${LOCLTEMP}/* # CLIENT: if we have a pkg then try to download the source if [ "${pkgn}" != "" ] then # CLIENT: download and build the package echo "Building [${dirn}/${pkgn}] in [`pwd`]" # CLIENT: download the source rpm pkg from the server scp -i ${SSHDPASS} ${SSHDUSER}@${SSHDHOST}:${SSHDWORK}/${pkgn} ./ if [ ! -s "${pkgn}" ] then # CLIENT: pkg prep rm -frv ${LOCLTEMP}/* pkgn=$(echo "${pkgn}" | sed -e 's/\.src\.rpm$//g') #koji download-build --arch=src "${pkgn}" urln=`python -c "import rpmUtils.miscutils ; (n,v,r,e,a)=rpmUtils.miscutils.splitFilename('${pkgn}') ; print('http://kojipkgs.fedoraproject.org/packages/%s/%s/%s.%s/src/${pkgn}.src.rpm' % (n,v,r,a))"` wget "${urln}" fi fi # CLIENT: check for and make any build files readable file=$(echo *) # CLIENT: if we have a source pkg then try to build it if [ -e "${file}" ] then # CLIENT: pkg prep chmod 755 * # CLIENT: build the source rpm in mock su -c "mock -vr fedora-15-arm --resultdir=${LOCLTEMP}/mock.${pkgn} ${LOCLTEMP}/${file}" - mock # CLIENT: copy any mock results back to the server scp -i ${SSHDPASS} -r mock.${pkgn} ${SSHDUSER}@${SSHDHOST}:${SSHDDONE}/ fi sleep 60 done
> repo.py
import os import sys import time repo = "/var/export/f15v5.0/repo" temp = "/var/export/f15v5.0/temp" def syse(comd, show=True): if (show): print(comd) os.system(comd) while (1): syse("find %s -type f -iname '*.[rx][pm][ml]' -exec ls --time-style='+%%s' -l {} \; 2> /dev/null | tr -s ' ' | cut -d ' ' -f 6- | sort -nr | head -n 1 | grep -i '.*\.rpm$' > /tmp/repo.txt" % (repo)) fobj = open("/tmp/repo.txt", "r") chek = fobj.read().strip() fobj.close() if (chek != ""): syse("echo \"Starting on [ `date` ]\" | tee -a ~/repo.log") syse("mkdir \"%s\" 2> /dev/null" % (temp)) # make sure the temp repo directory exists syse("rm -fr %s/* 2> /dev/null" % (temp)) # clear the temp repo directory for item in os.listdir(repo): syse("ln -s \"%s/%s\" \"%s/%s\"" % (repo, item, temp, item), show=False) syse("rm -fr \"%s/repodata\"" % (temp)) # remove any temp repo data links syse("cp -fr \"%s/repodata\" \"%s/\"" % (repo, temp)) # copy over the current repo data syse("createrepo --update -d \"%s\" --exclude=*debuginfo* --exclude=*.src.rpm" % (temp)) # create/update the new repo data syse("rm -fr \"%s/repodata\"" % (repo)) # remove the old repodata files syse("cp -fr \"%s/repodata\" \"%s/\"" % (temp, repo)) # copy over the new repo data syse("echo \"Ending on [ `date` ]\" | tee -a ~/repo.log") time.sleep(60) # sleep loop or risk fire!