From 68a03488ea9c738baff5c1d459707b1e7f3c2bb3 Mon Sep 17 00:00:00 2001 From: fbt Date: Mon, 10 Nov 2014 05:25:22 +0300 Subject: [PATCH] init --- builder-chroot.cfg.sh | 40 ++++++++++++++++++++++ builder-chroot.sh | 42 +++++++++++++++++++++++ makepkg-chroot.sh | 62 ++++++++++++++++++++++++++++++++++ mount-chroot.sh | 77 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 221 insertions(+) create mode 100755 builder-chroot.cfg.sh create mode 100755 builder-chroot.sh create mode 100755 makepkg-chroot.sh create mode 100755 mount-chroot.sh diff --git a/builder-chroot.cfg.sh b/builder-chroot.cfg.sh new file mode 100755 index 0000000..ddcc2b8 --- /dev/null +++ b/builder-chroot.cfg.sh @@ -0,0 +1,40 @@ +# The config for building packages in chroots + +cfg_git_repo="$HOME/git/pkgbuilds.git" + +cfg_build_dir="/tmp/build" +cfg_repos_dir="$HOME/public" +cfg_chroot_dir="/tmp/chroot/build" + +export GIT_DIR='.git' + +cfg_repos=( 'spark' 'spark-extra' ) + +cfg_packages=( + 'spark:spark-rc' + 'spark:sinit-spark' + 'spark:smdev' + 'spark:watchman-sm' + 'spark:watchman-sm-services-git' + 'spark:xorg-noudev-conf' + + 'spark-extra:zpm' + 'spark-extra:package-query' + + 'spark-extra:eudev' + + 'spark-extra:libsystemd-standalone' + 'spark-extra:systemd-dummy' + 'spark-extra:uselessd' + + 'spark-extra:scron' + 'spark-extra:sdhcp' + 'spark-extra:chromium-pepper-flash' + 'spark-extra:vte3-select-text' + 'spark-extra:termite' + 'spark-extra:sinit-sysvcompat' + 'spark-extra:posh' + 'spark-extra:teamviewer8' +) + +# 'spark-extra:cjdns-git' diff --git a/builder-chroot.sh b/builder-chroot.sh new file mode 100755 index 0000000..2933549 --- /dev/null +++ b/builder-chroot.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# A simple script to build packages into multiple repos + +err() { echo "$1" >&2; } + +build_pkg() { + local makepkg_output makepkg_exit_code makepkg_status + + IFS=':' read repo package <<< "$1" + + [[ -d "${cfg_build_dir}/${package}" ]] || { + err "Package ${package} doesn't exist in ${cfg_build_dir}" + return 1 + } + + [[ -d "${cfg_repos_dir}/${repo}" ]] || { + echo "Creating ${cfg_repos_dir}/${repo}" + mkdir -p "${cfg_repos_dir}/${repo}" || { + return 1 + } + } + + echo -n "Building ${package}... " + + cd "${cfg_build_dir}/${package}" + sudo /usr/local/bin/makepkg-chroot.sh "${cfg_build_dir}/${package}.chroot" "${cfg_repos_dir}/${repo}" +} + +main() { + source 'builder-chroot.cfg.sh' + + for i in "${cfg_packages[@]}"; do + build_pkg "$i" + done + + for i in "${cfg_repos[@]}"; do + cd "${cfg_repos_dir}/${i}" + repo-add -n "$i.db.tar.gz" *.pkg.tar.xz + done +} + +main diff --git a/makepkg-chroot.sh b/makepkg-chroot.sh new file mode 100755 index 0000000..c932ee1 --- /dev/null +++ b/makepkg-chroot.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +# Config +chroot_base='/var/chroot/root' + +# Functions +icat() { + while read; do + echo -e "$REPLY" + done +} + +build_script() { + icat <<- EOF + #!/bin/sh + + pacman -Sy &>pacman.log + + cd '/build'; chown builder:wheel /build + sudo -u builder PKGDEST='/pkg' makepkg -s --noconfirm -L &>makepkg.log + + makepkg_exit="\$?" + + case "\$makepkg_exit" in + 0) echo 'ok';; + 17) echo 'already built';; + *) echo 'FAIL';; + esac + + exit "\$makepkg_exit" + EOF +} + +main() { + chroot_dir="$1" + pkg_dest_dir="$2" + workdir="$PWD" + + [[ "${chroot_dir}" ]] || { usage; exit 1; } + + /usr/local/bin/mount-chroot.sh -s "$chroot_base" -n 'chroot_build' "$chroot_dir" + + mkdir -m777 "$chroot_dir/pkg" "$chroot_dir/build" + + mount --bind "$workdir" "$chroot_dir/build" + mount --bind "$pkg_dest_dir" "$chroot_dir/pkg" + + build_script > "${chroot_dir}/build/build.sh" + + #chmod 755 "${chroot_dir}/build/build.sh" + chroot "${chroot_dir}" sh /build/build.sh + + if /usr/local/bin/mount-chroot.sh -u "$chroot_dir"; then + rm -r "${chroot_dir}"{,.work} + else + err "Cannot unmount $chroot_dir" + exit 1 + fi +} + +main "$@" + diff --git a/mount-chroot.sh b/mount-chroot.sh new file mode 100755 index 0000000..e4b778c --- /dev/null +++ b/mount-chroot.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash + +err() { echo "$1" >&2; } + +usage() { +cat <<- EOF + Usage: "${0##*/}" [options] + Options: + -s chroot base dir + -n mount name + -u unmount chroot +EOF +} + +chroot.mount() { + for i in "$target_dir" "$chroot_base"; do + [[ "$i" ]] || { + usage + return 1 + } + done + + [[ -d "$chroot_base" ]] || { + err "Chroot base ($chroot_base) does not exist." + return 1 + } + + mount_name="${mount_name:-chroot}" + + for i in "$target_dir" "${target_dir}.work"; do + [[ -d "$i" ]] || { + mkdir -p "$i" || { + return 3 + } + } + done + + mount -t overlayfs -o lowerdir="$chroot_base",upperdir="$target_dir",workdir="${target_dir}.work" "$mount_name" "$target_dir" + mount -t proc "${mount_name}_proc" "${target_dir}/proc" + mount --rbind /dev "${target_dir}/dev" + mount --rbind /sys "${target_dir}/sys" +} + +chroot.umount() { + umount --recursive "$target_dir" +} + +main() { + while [[ "$1" ]]; do + case "$1" in + -s) chroot_base="$2"; shift;; + -n) mount_name="$2"; shift;; + -u) action='umount';; + + --) shift; break;; + -*) + err "Unknown key: $1" + usage + return 1 + ;; + *) break;; + esac + shift + done + + target_dir="$1" + action="${action:-mount}" + mount_name="${mount_name:-chroot}" + + case "$action" in + mount) chroot.mount;; + umount) chroot.umount;; + esac +} + +main "$@" +