5.5. Пример: создание пакета Интерпретатора

5.5.1. Подготовка метафайлов

Для того, чтобы не создавать с нуля весь набор метафайлов пакета, воспользуемся для этого утилитой dh_make:

$ mkdir arta-synergy-interpreter-1.1.0
$ cd arta-synergy-interpreter-1.1.0
$ dh_make --native --indep --copyright blank
Maintainer name  : Sergey Korobitsin
Email-Address    : undertaker@arta.kz 
Date             : Wed, 25 Feb 2015 16:38:29 +0600
Package Name     : arta-synergy-interpreter
Version          : 1.0
License          : blank
Type of Package  : Independent
Hit <enter> to confirm: 
Currently there is no top level Makefile. This may require additional tuning.
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the arta-synergy-interpreter Makefiles install into $DESTDIR and not in / .

Теперь посмотрим, что получилось в каталоге debian/:

$ ls debian
arta-synergy-interpreter.cron.d.ex
arta-synergy-interpreter.default.ex
arta-synergy-interpreter.doc-base.EX
changelog
compat
control
copyright
docs
emacsen-install.ex
emacsen-remove.ex
emacsen-startup.ex
init.d.ex
manpage.1.ex
manpage.sgml.ex
manpage.xml.ex
menu.ex
postinst.ex
postrm.ex
preinst.ex
prerm.ex
README
README.Debian
README.source
rules
source
watch.ex

С назначением каждого из этих файлов (*.ex - это файлы-примеры и не будут обработаны при сборке пакета) можно ознакомиться по вышеприведённым ссылкам. Нам же для сборки достаточно следующего набора:

$ ls debian/ 
changelog
compat
control
copyright
docs
postinst
preinst
README
README.Debian
README.source
rules
source
templates

Для начала исправляем сгенерированный файл control и приводим его содержимое к следующему виду:

Source: arta-synergy-interpreter
Section: non-free
Priority: extra
Maintainer: Sergey Korobitsin <undertaker@arta.kz>
Build-Depends: debhelper (>= 8.0.0)
Standards-Version: 3.9.2
Homepage: http://arta.kz/

Package: arta-synergy-interpreter
Architecture: all
Depends: arta-synergy-jboss, mysql-server (>= 5.5), libxml-xpath-perl, ${misc:Depends}
Description: ARTA Synergy additional Interpreter module
 ARTA Synergy additional Interpreter module

Нам также нужно произвести некоторые действия перед - preinst и после - postinst, поэтому исправляем также эти файлы. Например, файл postinst для Интерпретатора получился таким:

#!/bin/sh
# postinst script for arta-synergy-interpreter
#
# see: dh_installdeb(1)

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>
#        * <postinst> `abort-remove'
#        * <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)
    chown -R jboss:synergy /opt/synergy/jboss/standalone/deployments
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)
    ;;

    *)
        echo "postinst called with unknown argument `$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

5.5.2. Внесение изменений в дерево исходников

Перейдём в дерево исходных кодов интерпретатора и создадим необходимые подкаталоги:

$ cd interpreter
$ mkdir dpkg
$ cp -av /tmp/arta-synergy-interpreter-1.1.0/debian dpkg/

Также создадим в каталоге dpkg наш стандартный Makefile (см. выше).

Далее создадим подготовительный сценарий prepare.sh. Он получился довольно простым:

#!/bin/bash

CP="cp -v"
GIT="git"
WGET="wget -q"
ARTIFACTORY_REPO="http://192.168.1.30:8081/artifactory"
PACKAGE_NAME="arta-synergy-interpreter"
DEFAULT_REPO="unstable"
DEFAULT_URGENCY="low"
AUTHOR="ARTA Synergy Development Team <ai-dev@arta.kz>"

SYNERGYPATH="opt/synergy"
JBOSSPATH="${SYNERGYPATH}/jboss/standalone"
JBOSSDEPLOY="${JBOSSPATH}/deployments"

UPSTREAM_VERSION=$(
    $WGET "${ARTIFACTORY_REPO}/synergy-libs/kz/arta/synergy-interpreter/maven-metadata.xml" 
        -O - | 
        xpath -q -e '/metadata/versioning/latest/text()'
)

# Определение номера билда
# Если мы на Jenkins, BUILD_NUMBER приходит в переменных окружения
if [ -z "$BUILD_NUMBER" ]; then
    BUILD_NUMBER="000"
fi

if [ -z "$WORKSPACE" ]; then
    WORKSPACE=".."
fi

# Каталог, в котором будет собран пакет
PKG_DIR="${WORKSPACE}/PACKAGE"
DSTDIR="${PKG_DIR}/${PACKAGE_NAME}-${UPSTREAM_VERSION}"

rm -rf "${PKG_DIR}"
mkdir -p "${DSTDIR}"
mkdir -p "${DSTDIR}/src/${JBOSSDEPLOY}"

$CP -a dpkg/debian dpkg/Makefile "$DSTDIR"

# Достаём артефакт
cd "${DSTDIR}/src/${JBOSSDEPLOY}"
$WGET "${ARTIFACTORY_REPO}/synergy-libs/kz/arta/synergy-interpreter/${UPSTREAM_VERSION}/synergy-interpreter-${UPSTREAM_VERSION}.ear"
cd - > /dev/null

# Генерируем запись changelog
rm -f "$DSTDIR/changelog.entry"
touch "$DSTDIR/changelog.entry"
echo "${PACKAGE_NAME} (${UPSTREAM_VERSION}) ${DEFAULT_REPO}; urgency=${DEFAULT_URGENCY}" >> "${DSTDIR}/changelog.entry"
echo "" >> "${DSTDIR}/changelog.entry" >> "${DSTDIR}/changelog.entry"
echo "  * Automatic build with number ${BUILD_NUMBER}" >> "${DSTDIR}/changelog.entry"
echo "" >> "${DSTDIR}/changelog.entry"
echo " -- ${AUTHOR}  $(date -R)" >> "${DSTDIR}/changelog.entry"
echo "" >> "${DSTDIR}/changelog.entry"

# Присоединяем её к старому changelog
cat "$DSTDIR/changelog.entry" dpkg/debian/changelog > "${DSTDIR}/debian/changelog"
rm "${DSTDIR}/changelog.entry"

Можно проверить сборку пакета, запустив prepare.sh из корневого каталога исходников:

$ dpkg/prepare.sh
$ ls ../PACKAGE/arta-synergy-interpreter-1.1.0/
debian  Makefile  src

И собрать его:

$ cd ../PACKAGE/arta-synergy-interpreter-1.1.0/
$ dpkg-buildpackage -rfakeroot
dpkg-buildpackage: экспорт CFLAGS из dpkg-buildflags (происхождение: vendor): -g -O2
dpkg-buildpackage: экспорт CPPFLAGS из dpkg-buildflags (происхождение: vendor): 
dpkg-buildpackage: экспорт CXXFLAGS из dpkg-buildflags (происхождение: vendor): -g -O2
dpkg-buildpackage: экспорт FFLAGS из dpkg-buildflags (происхождение: vendor): -g -O2
dpkg-buildpackage: экспорт LDFLAGS из dpkg-buildflags (происхождение: vendor): 
dpkg-buildpackage: пакет исходных текстов arta-synergy-interpreter
dpkg-buildpackage: версия исходных текстов 1.0-b000
dpkg-buildpackage: исходные тексты изменены ARTA Synergy Development Team <ai-dev@arta.kz>

[... пропущено ...]

dpkg-genchanges: в закачку включён весь исходный код
 dpkg-source --after-build arta-synergy-interpreter-1.1.0
dpkg-buildpackage: закачка всего; родной пакет Debian (включены все пакеты исходного кода)

Как мы видим, пакет успешно собрался и готов к загрузке:

$ ls ..
arta-synergy-interpreter-1.1.0
arta-synergy-interpreter_1.1.0-b000_all.deb
arta-synergy-interpreter_1.1.0-b000_amd64.changes
arta-synergy-interpreter_1.1.0-b000.dsc
arta-synergy-interpreter_1.1.0-b000.tar.gz

5.5.3. Сборка пакета на сервере CI

Теперь в сборочную задачу Интерпретатора на Jenkins нужно добавить ещё один сборочный шаг типа «Выполнить команду shell» со следующим содержимым:

dpkg/prepare.sh
cd PACKAGE/arta-synergy-interpreter-*
dpkg-buildpackage -rfakeroot

и запустить сборку задачи. Если пакет был собран правильно, то нужно сделать автоматический upload в репозиторий unstable.

Для этого нужно добавить послесборочную операцию «Publish artifacts to SCP Repository» на сайт repo.lan.arta.kz. Важно загружать на репозиторий файлы в таком порядке:

  • Вначале *.deb

  • Затем *.tar.gz

  • Затем *.dsc

  • И последним *.changes - именно он даёт сигнал демону репозитария на upload пакета

Рисунок 5.1. Настройка upload в репозиторий

Настройка upload в репозиторий

Основные таски собраны в http://192.168.1.30:8080/view/Debs/. Последним собирается arta-synergy-synergy. После его сборки выполняется еще один скрипт wait-package.sh. Он ждет появление пакета в репозиторий. Для этого потребуется несколько минут. Если так не ждат то в интеграционные тесты могут прогнаться в старом сборке.

Версия многих пакетов, как arta-synergy-esb, arta-synergy-indexator., зависит от номера билда в jenkins-е. Например, текущая версия пакета arta-synergy-esb: 3.4-b444. b444 и есть номер билда.