Сборка плагинов и тем Wordpress в deb-пакеты

Как я уже говорил, я предпочитаю устанавливать программное обеспечение в систему с использованием системного пакетного менеджера. В простейших случаях пакеты можно собирать, формируя файлы и каталоги, образующие структуру, которую понимает команда dpkg-deb, формирующая двоичные пакеты. Команды, формирующие необходимую структуру каталогов и вызывающие dpkg-deb, можно оформить в виде скрипта. В некоторых случаях такой скрипт удаётся обобщить для сборки ряда однотипных приложений.

Например, плагины и темы на официальном сайте wordpress располагаются по ссылкам вполне предсказуемого формата. Благодаря этому, возможно обобщить скрипт сборки deb-пакетов с плагинами и темами для Wordpress. Получившийся скрипт оказывается способен собирать deb-пакеты с любыми плагинами и темами, имеющимися на официальном сайте:

#!/bin/sh

build()
{
TYPE="$1"
NAME="$2"
VERSION="$3"
DEPENDS="$4" || ""

if [ -n "$DEPENDS" ]
then
  DEPENDS=", $DEPENDS"
fi

case "$TYPE" in
  plugin)
    PACKAGE="wordpress-$NAME"
    ;;

  theme)
    PACKAGE="wordpress-theme-$NAME"
    ;;

  *)
    echo "$TYPE $NAME $VERSION: Unknown type"
    return 2
    ;;
esac

DIR="${PACKAGE}_${VERSION}"

wget --quiet https://downloads.wordpress.org/$TYPE/$NAME.$VERSION.zip 2>/dev/null \
  || wget --quiet https://downloads.wordpress.org/$TYPE/$NAME.zip 2>/dev/null \
  || (echo "$TYPE $NAME $VERSION: Failed to download ZIP-file" >/dev/stderr && return 1)

unzip -q $NAME.$VERSION.zip 2>/dev/null \
  || unzip -q $NAME.zip 2>/dev/null \
  || (echo "$TYPE $NAME $VERSION: Failed to unpack ZIP-file" > /dev/stderr && return 1)

rm $NAME.$VERSION.zip 2>/dev/null || rm $NAME.zip

mkdir -p $DIR/DEBIAN

# Формируем описание пакета
cat - > $DIR/DEBIAN/control <<END
Package: $PACKAGE
Version: $VERSION
Architecture: all
Depends: wordpress$DEPENDS
Maintainer: Vladimir Stupin <vladimir@stupin.su>
Description: $NAME $TYPE for Wordpress
 $NAME $TYPE for Wordpress
 Homepage: https://wordpress.org/${TYPE}s/$NAME/
END

chmod 755 $DIR/DEBIAN/control

cat - > $DIR/DEBIAN/postinst <<END
#!/bin/sh
# postinst script for Wordpress $TYPE $NAME

set -e

# summary of how this script can be called:
#        * <postinst> \`configure' <most-recently-configured-version>
#        * <old-postinst> \`abort-upgrade' <new version>
#        * <conflictor's-postinst> \`abort-remove' \`in-favour' <package>
#          <new-version>
#        * <deconfigured's-postinst> \`abort-deconfigure' \`in-favour'
#          <failed-install-package> <version> \`removing'
#          <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "\$1" in
  configure)
        # Change permissions to application files
        if ! dpkg-statoverride --list /usr/share/wordpress/wp-content/${TYPE}s/$NAME >/dev/null; then
                chown -R root:root /usr/share/wordpress/wp-content/${TYPE}s/$NAME
                chmod 755 /usr/share/wordpress/wp-content/${TYPE}s/$NAME
                find /usr/share/wordpress/wp-content/${TYPE}s/$NAME -type d | xargs chmod 755
                find /usr/share/wordpress/wp-content/${TYPE}s/$NAME -type f | xargs chmod 644
        fi
  ;;
  abort-upgrade|abort-remove|abort-deconfigure)
  ;;
  *)
    echo "postinst called with unknown argument \\\`\$1'" >&2
    exit 1
  ;;
esac
END

chmod 0755 $DIR/DEBIAN/postinst

# Формируем содержимое пакета
mkdir -p $DIR/usr/share/wordpress/wp-content/${TYPE}s/
cp -R $NAME $DIR/usr/share/wordpress/wp-content/${TYPE}s/
rm -R $NAME

FILE=${PACKAGE}_${VERSION}_all.deb

# Формируем пакет
dpkg-deb -b $DIR $FILE >/dev/null 2>&1
rm -R $DIR

echo "$TYPE $NAME $VERSION: OK"
return 0
}

build plugin simple-ldap-login 1.6.0 php-ldap
build theme period 1.270
build plugin the-events-calendar 4.2.7
build plugin wise-chat 2.7
build plugin site-sticky-notes 1.1.0
build plugin so-widgets-bundle 1.9.10

Скрипт состоит из одной функции, которая собственно и занимается сборкой пакета, и вызовов этой функции для сборки нескольких плагинов и тем. Скрипт использует для работы утилиты wget, unzip и dpkg-deb. При отсутствии в системе wget или unzip, их можно установить из одноимённых пакетов.

В скрипте выше указаны версии плагинов, работающие с Wordpress версии 3.6. У плагина simple-ldap-login указана также дополнительная зависимость - пакет php-ldap. Вы можете указать в скрипте свой список плагинов и тем, указав их версии и дополнительные зависимости. При необходимости указать несколько зависимостей, нужно перечислить их через запятую и заключить в кавычки.

Написать автору