diff --git a/_posts/2014-03-23-creating-custom-repo.html b/_posts/2014-03-23-creating-custom-repo.html index 1532087..e4def1d 100644 --- a/_posts/2014-03-23-creating-custom-repo.html +++ b/_posts/2014-03-23-creating-custom-repo.html @@ -13,12 +13,57 @@ description: It is a short paper devoted to creation own ArchLinux repository. pacman -Sy devtools {% endhighlight %}

devtools is script set for building automation in the clean chroot. I think most of Arch maintainers use it.

-

Let's create working directories:

+

Let's create working directories and set colors:

{% highlight bash %} -mkdir -p ~/arch/repo/{i686,x86_64} -mkdir -p ~/arch/{prepare,root,staging} +# colors +if [ ${USECOLOR} == "yes" ]; then + black='\e[0;30m' + bblack='\e[1;30m' + red='\e[0;31m' + bred='\e[1;31m' + green='\e[0;32m' + bgreen='\e[1;32m' + yellow='\e[0;33m' + byellow='\e[1;33m' + blue='\e[0;34m' + bblue='\e[1;34m' + purple='\e[0;35m' + bpurple='\e[1;35m' + cyan='\e[0;36m' + bcyan='\e[1;36m' + white='\e[0;37m' + bwhite='\e[1;37m' + cclose='\e[0m' +fi +export USECOLOR +# directories +if [ ! -d "${PREPAREDIR}" ]; then + [ -e "${PREPAREDIR}" ] && error_mes "file" "${PREPAREDIR}" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${PREPAREDIR}'${cclose}" + mkdir -p "${PREPAREDIR}" || error_mes "unknown" +fi +if [ ! -d "${REPODIR}" ]; then + [ -e "${REPODIR}" ] && error_mes "file" "${REPODIR}" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}'${cclose}" + mkdir -p "${REPODIR}/"{i686,x86_64} || error_mes "unknown" +fi +if [ ! -d "${REPODIR}/i686" ]; then + [ -e "${REPODIR}/i686" ] && error_mes "file" "${REPODIR}/i686" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}/i686'${cclose}" + mkdir -p "${REPODIR}/i686" || error_mes "unknown" +fi +if [ ! -d "${REPODIR}/x86_64" ]; then + [ -e "${REPODIR}/x86_64" ] && error_mes "file" "${REPODIR}/x86_64" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}/x86_64'${cclose}" + mkdir -p "${REPODIR}/x86_64" || error_mes "unknown" +fi +if [ ! -d "${STAGINGDIR}" ]; then + [ -e "${STAGINGDIR}" ] && error_mes "file" "${STAGINGDIR}" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${STAGINGDIR}'${cclose}" + mkdir -p "${STAGINGDIR}" || error_mes "unknown" +fi {% endhighlight %} -

~/arch/repo/{i686,x86_64} are directories for repository, ~/arch/prepare is directory where compiled packages will be stored, ~/arch/root is one where clean chroot will be created, ~/arch/staging is one where packages will be built.

+

${REPODIR}/{i686,x86_64} are directories for repository, ${PREPAREDIR} is directory where compiled packages will be stored, ${STAGINGDIR} is one where packages will be built.

A bit of theory

Create directory, share it (using ftp, for example). It has two subdirectories - i686 and x86_64 - for each architecture respectively. And fill them with a set of packages.

@@ -39,7 +84,7 @@ mkdir -p ~/arch/{prepare,root,staging}

Creating PKGBUILDs

Download source tarballs from AUR:

{% highlight bash %} -cd ~/arch/staging +cd "${STAGINGDIR}" yaourt -G package-name {% endhighlight %} @@ -47,22 +92,29 @@ yaourt -G package-name

Build each package automatically:

{% highlight bash %} func_build() { + if [ ${USECOLOR} == "yes" ]; then + bblue='\e[1;34m' + bwhite='\e[1;37m' + cclose='\e[0m' + fi PREPARE="$1" ROOT="$2" eval $(/usr/bin/grep 'arch=' PKGBUILD) - if echo ${arch} | /usr/bin/grep any -q; then - /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c + eval $(/usr/bin/grep 'pkgname=' PKGBUILD) + echo -e "${bwhite}[II] ${bblue}=>${cclose} Building ${bwhite}${pkgname}${cclose}" + if echo ${arch} | /usr/bin/grep 'any' -q; then + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c else eval $(/usr/bin/grep 'pkgname=' PKGBUILD) if echo ${pkgname} | /usr/bin/grep lib32 -q; then - /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c else - if /usr/bin/grep "lib32" PKGBUILD -q; then - /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c - /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c + if /usr/bin/grep 'lib32' PKGBUILD -q; then + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c else - /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c - /usr/bin/sudo /usr/bin/staging-x86_64-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-x86_64-build -r "${ROOT}" -c fi fi fi @@ -71,6 +123,7 @@ func_build() { export -f func_build # building +echo -e "${bwhite}[II]${cclose} Building packages" cd "${STAGINGDIR}" /usr/bin/find -name 'PKGBUILD' -type f -execdir /usr/bin/bash -c "func_build "${PREPAREDIR}" "${ROOTDIR}"" \; {% endhighlight %} @@ -85,7 +138,7 @@ username ALL=NOPASSWD: /usr/bin/multilib-staging-build {% highlight bash %} # signing if [ ${USEGPG} == "yes" ]; then - echo "[II] Signing" + echo -e "${bwhite}[II]${cclose} Signing" cd "${PREPAREDIR}" for PACKAGE in $(/usr/bin/find . -name '*.pkg.tar.xz'); do /usr/bin/gpg -b ${PACKAGE} @@ -100,45 +153,45 @@ fi cd "${PREPAREDIR}" i686_PACKAGES=$(/usr/bin/find * -name '*-i686.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') x86_64_PACKAGES=$(/usr/bin/find * -name '*-x86_64.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') -echo -e "[II] => i686 packages: \n${i686_PACKAGES}" -echo -e "[II] => x86_64 packages: \n${x86_64_PACKAGES}" +echo -e "${bwhite}[II] ${bblue}=>${cclose} i686 packages: \n${bwhite}${i686_PACKAGES}${cclose}" +echo -e "${bwhite}[II] ${bblue}=>${cclose} x86_64 packages: \n${bwhite}${x86_64_PACKAGES}${cclose}" {% endhighlight %}

Repository update

Here is a function for removal packages from database and repository:

{% highlight bash %} func_remove() { - PKGNAME="$1" - /usr/bin/rm -f ${PKGNAME}-[0-9]* + PACKAGE="$1" + REPODIR="$2" + /usr/bin/rm -f "${REPODIR}/${PACKAGE}"{,.sig} } -export -f func_remove {% endhighlight %}

i686 repository update:

{% highlight bash %} # updating i686 repo -echo "[II] Updating i686 repo" +echo -e "${bwhite}[II]${cclose} Updating ${bwhite}i686${cclose} repo" cd "${REPODIR}/i686" for PACKAGE in ${i686_PACKAGES}; do - PKGNAME=$(echo ${PACKAGE} | /usr/bin/awk -F '-' '{for(i=1; i<=NF-3;i++) {printf("%s-", $i);}}' | /usr/bin/sed 's/.$//') - /usr/bin/find -name "${PKGNAME}*.pkg.tar.xz" -type f -exec /usr/bin/bash -c "func_remove "${PKGNAME}"" \; + PKGNAME=$(/usr/bin/package-query -p -f %n "${REPODIR}/i686/${PACKAGE}") + func_remove "${PACKAGE}" "${REPODIR}/i686" /usr/bin/cp "${PREPAREDIR}/${PACKAGE}" . [ ${USEGPG} == "yes" ] && /usr/bin/cp "${PREPAREDIR}/${PACKAGE}.sig" . - /usr/bin/repo-add --new ${DBNAME}.db.tar.gz "${PACKAGE}" - /usr/bin/repo-add --new --files ${DBNAME}.files.tar.gz "${PACKAGE}" + /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" + /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done {% endhighlight %}

x86_64 repository update:

{% highlight bash %} # updating x86_64 repo -echo "[II] Updating x86_64 repo" +echo -e "${bwhite}[II]${cclose} Updating ${bwhite}x86_64${cclose} repo" cd "${REPODIR}/x86_64" for PACKAGE in ${x86_64_PACKAGES}; do - PKGNAME=$(echo ${PACKAGE} | /usr/bin/awk -F '-' '{for(i=1; i<=NF-3;i++) {printf("%s-", $i);}}' | /usr/bin/sed 's/.$//') - /usr/bin/find -name "${PKGNAME}"'*.pkg.tar.xz' -type f -exec /usr/bin/bash -c "func_remove "${PKGNAME}"" \; + PKGNAME=$(/usr/bin/package-query -p -f %n "${REPODIR}/x86_64/${PACKAGE}") + func_remove "${PACKAGE}" "${REPODIR}/x86_64" /usr/bin/cp "${PREPAREDIR}/${PACKAGE}" . [ ${USEGPG} == "yes" ] && /usr/bin/cp "${PREPAREDIR}/${PACKAGE}.sig" . - /usr/bin/repo-add --new ${DBNAME}.db.tar.gz "${PACKAGE}" - /usr/bin/repo-add --new --files ${DBNAME}.files.tar.gz "${PACKAGE}" + /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" + /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done {% endhighlight %} diff --git a/ru/_posts/2014-03-23-creating-custom-repo.html b/ru/_posts/2014-03-23-creating-custom-repo.html index 4f6b3ec..7b10f2c 100644 --- a/ru/_posts/2014-03-23-creating-custom-repo.html +++ b/ru/_posts/2014-03-23-creating-custom-repo.html @@ -13,12 +13,57 @@ description: Небольшая статья, посвященная созда pacman -Sy devtools {% endhighlight %}

devtools - набор скриптов, предназначенный для автоматизации сборки пакетов в чистом чруте. Думаю, большинство мейнтейнеров Arch'а пользуются им.

-

Создадим рабочие директории:

+

Создадим рабочие директории и установим цвета:

{% highlight bash %} -mkdir -p ~/arch/repo/{i686,x86_64} -mkdir -p ~/arch/{prepare,root,staging} +# цвета +if [ ${USECOLOR} == "yes" ]; then + black='\e[0;30m' + bblack='\e[1;30m' + red='\e[0;31m' + bred='\e[1;31m' + green='\e[0;32m' + bgreen='\e[1;32m' + yellow='\e[0;33m' + byellow='\e[1;33m' + blue='\e[0;34m' + bblue='\e[1;34m' + purple='\e[0;35m' + bpurple='\e[1;35m' + cyan='\e[0;36m' + bcyan='\e[1;36m' + white='\e[0;37m' + bwhite='\e[1;37m' + cclose='\e[0m' +fi +export USECOLOR +# директории +if [ ! -d "${PREPAREDIR}" ]; then + [ -e "${PREPAREDIR}" ] && error_mes "file" "${PREPAREDIR}" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${PREPAREDIR}'${cclose}" + mkdir -p "${PREPAREDIR}" || error_mes "unknown" +fi +if [ ! -d "${REPODIR}" ]; then + [ -e "${REPODIR}" ] && error_mes "file" "${REPODIR}" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}'${cclose}" + mkdir -p "${REPODIR}/"{i686,x86_64} || error_mes "unknown" +fi +if [ ! -d "${REPODIR}/i686" ]; then + [ -e "${REPODIR}/i686" ] && error_mes "file" "${REPODIR}/i686" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}/i686'${cclose}" + mkdir -p "${REPODIR}/i686" || error_mes "unknown" +fi +if [ ! -d "${REPODIR}/x86_64" ]; then + [ -e "${REPODIR}/x86_64" ] && error_mes "file" "${REPODIR}/x86_64" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}/x86_64'${cclose}" + mkdir -p "${REPODIR}/x86_64" || error_mes "unknown" +fi +if [ ! -d "${STAGINGDIR}" ]; then + [ -e "${STAGINGDIR}" ] && error_mes "file" "${STAGINGDIR}" + echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${STAGINGDIR}'${cclose}" + mkdir -p "${STAGINGDIR}" || error_mes "unknown" +fi {% endhighlight %} -

Директории ~/arch/repo/{i686,x86_64} для самого репозитория, ~/arch/prepare - директория, где будут лежать собранные пакеты, ~/arch/root - директория, где будет создан чистый чрут для сборки, ~/arch/staging - директория, откуда будут собираться пакеты.

+

Директории ${REPODIR}/{i686,x86_64} для самого репозитория, ${PREPAREDIR} - директория, где будут лежать собранные пакеты, ${STAGINGDIR} - директория, откуда будут собираться пакеты.

Немного теории

Создаем директорию, расшариваем ее (например, по ftp). В ней две субдиректории - i686 и x86_64, для каждого типа архитектур соответственно. И наполняем их набором пакетов по Вашему усмотрению.

@@ -40,7 +85,7 @@ mkdir -p ~/arch/{prepare,root,staging}

Создание PKGBUILD'ов

Скачаем исходники для всех нужных пакетов из AUR'а:

{% highlight bash %} -cd ~/arch/staging +cd "${STAGINGDIR}" yaourt -G package-name {% endhighlight %} @@ -48,22 +93,29 @@ yaourt -G package-name

Автоматически соберем каждый пакет:

{% highlight bash %} func_build() { + if [ ${USECOLOR} == "yes" ]; then + bblue='\e[1;34m' + bwhite='\e[1;37m' + cclose='\e[0m' + fi PREPARE="$1" ROOT="$2" eval $(/usr/bin/grep 'arch=' PKGBUILD) - if echo ${arch} | /usr/bin/grep any -q; then - /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c + eval $(/usr/bin/grep 'pkgname=' PKGBUILD) + echo -e "${bwhite}[II] ${bblue}=>${cclose} Building ${bwhite}${pkgname}${cclose}" + if echo ${arch} | /usr/bin/grep 'any' -q; then + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c else eval $(/usr/bin/grep 'pkgname=' PKGBUILD) if echo ${pkgname} | /usr/bin/grep lib32 -q; then - /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c else - if /usr/bin/grep "lib32" PKGBUILD -q; then - /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c - /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c + if /usr/bin/grep 'lib32' PKGBUILD -q; then + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/multilib-staging-build -r "${ROOT}" -c else - /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c - /usr/bin/sudo /usr/bin/staging-x86_64-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${ROOT}" -c + LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-x86_64-build -r "${ROOT}" -c fi fi fi @@ -72,6 +124,7 @@ func_build() { export -f func_build # building +echo -e "${bwhite}[II]${cclose} Building packages" cd "${STAGINGDIR}" /usr/bin/find -name 'PKGBUILD' -type f -execdir /usr/bin/bash -c "func_build "${PREPAREDIR}" "${ROOTDIR}"" \; {% endhighlight %} @@ -86,7 +139,7 @@ username ALL=NOPASSWD: /usr/bin/multilib-staging-build {% highlight bash %} # signing if [ ${USEGPG} == "yes" ]; then - echo "[II] Signing" + echo -e "${bwhite}[II]${cclose} Signing" cd "${PREPAREDIR}" for PACKAGE in $(/usr/bin/find . -name '*.pkg.tar.xz'); do /usr/bin/gpg -b ${PACKAGE} @@ -101,45 +154,45 @@ fi cd "${PREPAREDIR}" i686_PACKAGES=$(/usr/bin/find * -name '*-i686.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') x86_64_PACKAGES=$(/usr/bin/find * -name '*-x86_64.pkg.tar.xz' -o -name '*-any.pkg.tar.xz') -echo -e "[II] => i686 packages: \n${i686_PACKAGES}" -echo -e "[II] => x86_64 packages: \n${x86_64_PACKAGES}" +echo -e "${bwhite}[II] ${bblue}=>${cclose} i686 packages: \n${bwhite}${i686_PACKAGES}${cclose}" +echo -e "${bwhite}[II] ${bblue}=>${cclose} x86_64 packages: \n${bwhite}${x86_64_PACKAGES}${cclose}" {% endhighlight %}

Обновление репозиториев

Функция для удаления пакетов из базы данных и из репозитория:

{% highlight bash %} func_remove() { - PKGNAME="$1" - /usr/bin/rm -f ${PKGNAME}* + PACKAGE="$1" + REPODIR="$2" + /usr/bin/rm -f "${REPODIR}/${PACKAGE}"{,.sig} } -export -f func_remove {% endhighlight %}

Обновление репозитория i686:

{% highlight bash %} # updating i686 repo -echo "[II] Updating i686 repo" +echo -e "${bwhite}[II]${cclose} Updating ${bwhite}i686${cclose} repo" cd "${REPODIR}/i686" for PACKAGE in ${i686_PACKAGES}; do - PKGNAME=$(echo ${PACKAGE} | /usr/bin/awk -F '-' '{for(i=1; i<=NF-3;i++) {printf("%s-", $i);}}' | /usr/bin/sed 's/.$//') - /usr/bin/find -name "${PKGNAME}*.pkg.tar.xz" -type f -exec /usr/bin/bash -c "func_remove "${PKGNAME}"" \; + PKGNAME=$(/usr/bin/package-query -p -f %n "${REPODIR}/i686/${PACKAGE}") + func_remove "${PACKAGE}" "${REPODIR}/i686" /usr/bin/cp "${PREPAREDIR}/${PACKAGE}" . [ ${USEGPG} == "yes" ] && /usr/bin/cp "${PREPAREDIR}/${PACKAGE}.sig" . - /usr/bin/repo-add --new ${DBNAME}.db.tar.gz "${PACKAGE}" - /usr/bin/repo-add --new --files ${DBNAME}.files.tar.gz "${PACKAGE}" + /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" + /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done {% endhighlight %}

Обновление репозитория x86_64:

{% highlight bash %} # updating x86_64 repo -echo "[II] Updating x86_64 repo" +echo -e "${bwhite}[II]${cclose} Updating ${bwhite}x86_64${cclose} repo" cd "${REPODIR}/x86_64" for PACKAGE in ${x86_64_PACKAGES}; do - PKGNAME=$(echo ${PACKAGE} | /usr/bin/awk -F '-' '{for(i=1; i<=NF-3;i++) {printf("%s-", $i);}}' | /usr/bin/sed 's/.$//') - /usr/bin/find -name "${PKGNAME}"'*.pkg.tar.xz' -type f -exec /usr/bin/bash -c "func_remove "${PKGNAME}"" \; + PKGNAME=$(/usr/bin/package-query -p -f %n "${REPODIR}/x86_64/${PACKAGE}") + func_remove "${PACKAGE}" "${REPODIR}/x86_64" /usr/bin/cp "${PREPAREDIR}/${PACKAGE}" . [ ${USEGPG} == "yes" ] && /usr/bin/cp "${PREPAREDIR}/${PACKAGE}.sig" . - /usr/bin/repo-add --new ${DBNAME}.db.tar.gz "${PACKAGE}" - /usr/bin/repo-add --new --files ${DBNAME}.files.tar.gz "${PACKAGE}" + /usr/bin/repo-add ${DBNAME}.db.tar.gz "${PACKAGE}" + /usr/bin/repo-add --files ${DBNAME}.files.tar.gz "${PACKAGE}" done {% endhighlight %}