#!/bin/bash # build packages one by one, then upload the binary package to the repository server # Details: # https://github.com/archlinux32/builder/wiki/Build-system#build-packages # TODOs: # use different build commands for different repositories - do we need this actually? # send logs of failed builds # handle failed uploads to the build master # be more user friendly: let preset a limit on the number of packages being built . "${0%/*}/../conf/default.conf" while true; do package="$( ssh \ -i "${master_build_server_identity}" \ -p "${master_build_server_port}" \ "${master_build_server_user}@${master_build_server}" \ 'get-assignment' )" case $? in # 0: ok, I gave you an assignment 0) repository="${package##* }" package="${package% *}" mod_git_revision="${package##* }" package="${package% *}" git_revision="${package##* }" package="${package% *}" # Update git repositories (official packages, community packages and the repository of package customizations). for repo in "${repo_paths[@]}"; do git -C "${repo}" clean -df git -C "${repo}" reset --hard git -C "${repo}" checkout master git -C "${repo}" pull done git -C "${repo_paths["$(find_repository_with_commit "${git_revision}")"]}" checkout "${git_revision}" &> /dev/null git -C "${repo_paths["archlinux32"]}" checkout "${mod_git_revision}" &> /dev/null PKGBUILD="$(find_pkgbuild "${package}" "${repository}")" if [ ! -r "${PKGBUILD}" ]; then echo "can't find PKGBUILD to package '${package}' from repository '${repository}': '${PKGBUILD}'" exit 1 fi cd "${PKGBUILD%/*}" success=false for parameters in '' '-c'; do rm -f *.pkg.tar.xz if staging-i686-build ${parameters}; then # build successful ls -1 *.pkg.tar.xz | \ xargs -rn1 gpg --detach-sign tar -c *.pkg.tar.xz{,.sig} | \ ssh \ -i "${master_build_server_identity}" \ -p "${master_build_server_port}" \ "${master_build_server_user}@${master_build_server}" \ 'return-assignment' "${package}" "${git_revision}" "${mod_git_revision}" "${repository}" success=true break fi done if ! ${success}; then ssh \ -i "${master_build_server_identity}" \ -p "${master_build_server_port}" \ "${master_build_server_user}@${master_build_server}" \ 'return-assignment' "${package}" "${git_revision}" "${mod_git_revision}" "${repository}" 'ERROR' fi echo 'This is the end.' exit 0 continue ;; # 1: come back (shortly) later - I was running already 1) sleep $[15+$RANDOM%30] continue ;; # 2: come back later - there are still packages to be built, # but currently none has all its dependencies ready 2) sleep $[60+$RANDOM%30] continue ;; # 3: come back after the next run of get-package-updates - currently # there are no pending packages 3) >&2 echo 'Done. No more packages left to build.' exit 0 ;; # 4: come back, when you've done your work - you hit the limit on # maximum allowed parallel jobs per ip 4) >&2 echo 'ERROR: There are too many parallel builds running on this machine.' exit 1 ;; *) >&2 echo "ERROR: Unknown exit code $?." exit 1 ;; esac done