Skip to content

Instantly share code, notes, and snippets.

@MuhammetDilmac
Last active January 18, 2017 10:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save MuhammetDilmac/9a00fdc3c6c2aea58b21cabb09671be4 to your computer and use it in GitHub Desktop.
Save MuhammetDilmac/9a00fdc3c6c2aea58b21cabb09671be4 to your computer and use it in GitHub Desktop.
piBuild uygulaması bulunduğunuz dizindeki dosyalar ile docker uygulaması içinde pisi paketi oluşturan bir bash scriptidir.
#!/usr/bin/env bash
#
# Kurulum için;
# sudo wget https://gist.githubusercontent.com/MuhammetDilmac/9a00fdc3c6c2aea58b21cabb09671be4/raw/767277730be88febbcaeedd455835b92ea721ce1/pibuild.sh --no-check-certificate -O /usr/bin/pibuild && sudo chmod +x /usr/bin/pibuild
#
#
# Kullanım;
# Scripti kullanmak için pspec.xml, actions.py ve translations.xml dosyasının bulunduğu dizinde pibuild yazmanız yeterlidir.
# Oluşan çıktı dosyalarını pibuild dizini içinde bulabilirsiniz.
#
# Set Variables
CURRENT_PATH="$(pwd)"
DOCKER_SERVICE_RUN="/var/run/docker.sock"
COLOR_RED=`tput setaf 1`
COLOR_GREEN=`tput setaf 2`
COLOR_RESET=`tput sgr0`
COLOR_BLUE=`tput setaf 4`
PSPEC_FILE="pspec.xml"
ACTIONS_FILE="actions.py"
TRANSLATIONS_FILE="translations.xml"
CONTAINER_IMAGE="ertugerata/pisi-chroot-farm"
PIBUILD_PATH="${CURRENT_PATH}/pibuild"
CONTAINER_NAME=""
CONTAINER_BUILD_SCRIPT=""
REQUIRE_KERNEL=" "
IGNORE_SANDBOX=" --ignore-sandbox "
GONULLU_PATH=" "
SANDBOX_PACKAGES=" "
KERNEL_REQUIREMENT_PACKAGES=" "
GONULLU_VERSION=""
ACCEPTABLE_GONULLU_VERSION="113"
DOCKER_STATUS=""
DOCKER_START_TIME=""
# Set Functions
function error_log {
echo "${COLOR_RED}[-] ${1}${COLOR_RESET}"
}
function success_log {
echo "${COLOR_GREEN}[+] ${1}${COLOR_RESET}"
}
function info_log {
echo "${COLOR_BLUE}[*] ${1}${COLOR_RESET}"
}
function go_exit {
error_log "PiBuild uygulamasından çıkılıyor."
exit
}
function list_include_item {
local list="$1"
local item="$2"
if [[ $list =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] ; then
# yes, list include item
result=0
else
result=1
fi
return $result
}
function check_exist_and_exit {
if [ ! -e "$1" ]; then
error_log "Bulunduğunuz dizinde $1 dosyası bulunamadı!"
go_exit
fi
}
info_log "Pisi Build Uygulamasına Hoş Geldiniz!"
info_log "Bulunduğunuz dizin: ${CURRENT_PATH}"
check_exist_and_exit $PSPEC_FILE
check_exist_and_exit $ACTIONS_FILE
check_exist_and_exit $TRANSLATIONS_FILE
info_log "Docker servisi kontrol ediliyor."
if [ ! -S "${DOCKER_SERVICE_RUN}" ]; then
error_log "İlk olarak docker servisini açmanız gerekmekte."
go_exit
fi
GONULLU_PATH=$(python3 -c "exec(\"import gonullu\\nimport os\\nprint(os.path.dirname(gonullu.__file__))\")" 2> /dev/null)
SANDBOX_PACKAGES=$(cat $GONULLU_PATH/config/sandbox-requirement.yml | sed s/^[-\S]//)
KERNEL_REQUIREMENT_PACKAGES=$(cat $GONULLU_PATH/config/kernel-requirement.yml | sed s/^[-\S]//)
if [ $? -ne 0 ]; then
error_log "İlk olarak sisteme gonullu uygulamasını kurmanız gerekmekte."
go_exit
fi
GONULLU_VERSION=$(pip3 show gonullu | grep -i version | sed s/Version:[[:blank:]]// | tr -d .)
if [ ! $GONULLU_VERSION -ge $ACCEPTABLE_GONULLU_VERSION ]; then
error_log "İlk olarak gonullu uygulamasını güncelleyiniz."
go_exit
fi
info_log "PiBuild için dizin kontrolleri yapılıyor."
if [ ! -d "${PIBUILD_PATH}" ]; then
info_log "${PIBUILD_PATH} dizini oluşturuluyor."
mkdir -p $PIBUILD_PATH
fi
cp $PSPEC_FILE $PIBUILD_PATH/$PSPEC_FILE
cp $ACTIONS_FILE $PIBUILD_PATH/$ACTIONS_FILE
cp $TRANSLATIONS_FILE $PIBUILD_PATH/$TRANSLATIONS_FILE
PACKAGE_NAME=$(python3 -c "exec(\"import xml.etree.ElementTree as ET\\nxml=ET.parse('${PSPEC_FILE}')\\nroot = xml.getroot()\\npackage=root.find('Source/Name')\\nprint(package.text)\")")
if ! list_include_item "$SANDBOX_PACKAGES" "$PACKAGE_NAME"; then
IGNORE_SANDBOX=" "
fi
if list_include_item "$KERNEL_REQUIREMENT_PACKAGES" "$PACKAGE_NAME"; then
REQUIRE_KERNEL=" kernel "
fi
CONTAINER_NAME="pisi-${PACKAGE_NAME}-$(( ( RANDOM % 100000 ) + 1 ))"
CONTAINER_NAME=`echo $CONTAINER_NAME | grep -i "[a-z0-9_-]"`
info_log "Paket Adı: ${PACKAGE_NAME}"
info_log "Container Adı: ${CONTAINER_NAME}"
CONTAINER_BUILD_SCRIPT="${PIBUILD_PATH}/${CONTAINER_NAME}.sh"
info_log "Build scripti ${CONTAINER_BUILD_SCRIPT} dosyasına oluşturuluyor."
echo '#!/usr/bin/env bash' > $CONTAINER_BUILD_SCRIPT
echo "PSPEC_FILE=\"$PSPEC_FILE\"" >> $CONTAINER_BUILD_SCRIPT
echo "REQUIRE_KERNEL=\"${REQUIRE_KERNEL}\"" >> $CONTAINER_BUILD_SCRIPT
echo "PACKAGE_NAME=\"${PACKAGE_NAME}\"" >> $CONTAINER_BUILD_SCRIPT
echo "CONTAINER_NAME=\"${CONTAINER_NAME}\"" >> $CONTAINER_BUILD_SCRIPT
echo "IGNORE_SANDBOX=\"${IGNORE_SANDBOX}\"" >> $CONTAINER_BUILD_SCRIPT
echo 'service dbus start && pisi cp && pisi ar pisiBeta --ignore-check http://ciftlik.pisilinux.org/2.0-Beta.1/pisi-index.xml.xz && pisi it --ignore-safety --ignore-dependency autoconf autogen automake binutils bison flex gawk gc gcc gnuconfig guile libmpc libtool-ltdl libtool lzo m4 make mpfr pkgconfig yacc glibc-devel isl$REQUIRE_KERNEL' >> $CONTAINER_BUILD_SCRIPT
echo 'pisi ar core --ignore-check https://github.com/pisilinux/core/raw/master/pisi-index.xml.xz && pisi ar main --ignore-check https://github.com/pisilinux/main/raw/master/pisi-index.xml.xz --at 2' >> $CONTAINER_BUILD_SCRIPT
echo 'pisi ur' >> $CONTAINER_BUILD_SCRIPT
echo 'cd /root' >> $CONTAINER_BUILD_SCRIPT
echo 'pisi bi -y $PACKAGE_NAME/$PSPEC_FILE --ignore-safety$IGNORE_SANDBOX 1>/root/$PACKAGE_NAME/$CONTAINER_NAME.log 2>/root/$PACKAGE_NAME/$CONTAINER_NAME.err' >> $CONTAINER_BUILD_SCRIPT
echo 'STAT=$?' >> $CONTAINER_BUILD_SCRIPT
echo 'for s in `ls *.pisi`' >> $CONTAINER_BUILD_SCRIPT
echo 'do' >> $CONTAINER_BUILD_SCRIPT
echo ' mv $s /root/$PACKAGE_NAME/$CONTAINER_NAME-$s' >> $CONTAINER_BUILD_SCRIPT
echo 'done' >> $CONTAINER_BUILD_SCRIPT
echo 'echo $STAT > /root/$PACKAGE_NAME/$PACKAGE_NAME.bitti' >> $CONTAINER_BUILD_SCRIPT
chmod +x $CONTAINER_BUILD_SCRIPT
info_log "${CONTAINER_IMAGE} imajının güncelliği kontrol ediliyor."
docker pull $CONTAINER_IMAGE &> /dev/null
DOCKER_START_TIME=$(date +%s)
docker run -v /var/cache/pisi/packages:/var/cache/pisi/packages \
-v /var/cache/pisi/archives:/var/cache/pisi/archives \
-v /tmp/varpisi/$PACKAGE_NAME:/var/pisi \
-v $PIBUILD_PATH:/root/$PACKAGE_NAME \
-itd --security-opt=seccomp:unconfined --name "${CONTAINER_NAME}" \
$CONTAINER_IMAGE /root/$PACKAGE_NAME/$CONTAINER_NAME.sh &> /dev/null
info_log "Derleme işlemi başlatıldı."
while true; do
DOCKER_STATUS=$(docker inspect $CONTAINER_NAME | grep -i status | sed -e 's/\s\+\"Status\":\s"//g' | tr -d \",)
if [ "${DOCKER_STATUS}" == "exited" ]; then
success_log "${CONTAINER_NAME} containerında ${PACKAGE_NAME} paketi için süren derleme işlemi bitti."
success_log "Derleme sonucu oluşan çıktı dosyalarına ${PIBUILD_PATH} dizininden erişebilirsiniz."
success_log "${CONTAINER_NAME} container'ı temizleniyor."
docker rm $CONTAINER_NAME &> /dev/null
break
else
CURRENT_TIME=$(date +%s)
ELAPSED_TIME=$(( ($CURRENT_TIME - $DOCKER_START_TIME) ))
info_log "Derleme işlemi ${ELAPSED_TIME}sndir devam ediyor."
fi
sleep 10
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment