Пример сборки RPM и Deb пакетов в Gradle
Используемый термин: Gradle.
В нашем примере будет выполнена сборка пакетов RPM и Deb с помощью Gradle. Мы рассмотрим:
- Установку Gradle на Ubuntu и Rocky Linux.
- Служебные файлы для описания сборки.
- Команды для выполнения сборки.
- Тестовую установку пакета.
Данную инструкцию можно использовать для базового ознакомления с процессом сборки RPM и Deb при помощи Gradle. В ней рассмотрена примитивная сборка пакета, в который будет входить небольшой скрипт, написанный на bash.
Предварительная подготовка
Установка Gradle и настройка среды
Выполнение сборки пакетов
Тестовая установка собранных пакетов
Другие материалы по теме сборки пакетов
Подготовка системы
Для установки Gradle в нашей системе должны быть установлены java и дополнительные пакеты. Рассмотрим эти процессы по отдельности.
1. Установка java
Gradle разработан на Java и для его работы нужно установить соответствующее программное обеспечение (open-java). В зависимости от системы, в которой мы будем работать действия немного отличаются.
а) Для Debian / Ubuntu:
apt update
apt install default-jdk
б) Для Rocky Linux / CentOS:
yum install java-11-openjdk-devel
Open-java установлен.
Для теста выполним команду:
java -version
Мы должны увидеть что-то на подобие:
openjdk version "11.0.15" 2022-04-19
...
2. Установка дополнительных пакетов
Для работы нам понадобятся пакеты:
- wget — для загрузки файлов.
- unzip — для распаковки zip-архивов.
- which (для RPM) — утилита для поиска исполняемых файлов в системе.
Для разных систем команды будут различаться.
а) В Debian / Ubuntu:
apt install wget unzip
б) В Rocky Linux / CentOS:
yum install wget unzip which
Мы готовы перейти к установке Gradle.
Установка Gradle
Для установки Gradle мы должны скачать архив со скомпилированными файлами и распаковать их в рабочий каталог (в нашем примере будет /opt).
И так, переходим на страницу загрузки и кликаем по ссылке для скачивания архива:
Мы окажемся на другой странице, где браузер начнет загрузку. Нам это не нужно — прерываем скачивание архива и копируем ссылку для его загрузки:
Переходим на Linux, где нужно установить gradle, и скачиваем архив с помощью скопированной ссылки:
wget https://services.gradle.org/distributions/gradle-7.4.2-all.zip
Распакуем архив:
unzip gradle-*.zip
Переместим его содержимое в каталог /opt:
mv gradle-*/ /opt/gradle
Открываем профиль пользователя, под которым мы будем заниматься сборкой пакетов:
vi ~/.profile
Добавим:
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac)))))
export PATH=$PATH:/opt/gradle/bin
* где:
- JAVA_HOME — каталог, где Java будет искать JDK.
- PATH — путь для поиска исполняемых файлов.
Применяем настройки, добавленные в файл профиля:
source ~/.profile
Пробуем запустить gradle:
gradle -v
Мы должны получить что-то на подобие:
Welcome to Gradle 7.4.2!
...
Gradle установлен.
Сборка
Создадим наше приложение. Это будет просто скрипт, выводящий на экран Hello, World.
Для начала создаем каталог, куда поместим данный скрипт, например:
mkdir -p /opt/mypkg/hello
Теперь создадим сам скрипт:
vi /opt/mypkg/hello/start.sh
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
echo "Hello, World"
В каталоге на уровень выше создаем файл build.gradle с описанием процесса сборки:
vi /opt/mypkg/build.gradle
plugins {
id "nebula.info" version "7.1.3"
id 'nebula.ospackage' version '8.5.6' apply false
}
apply plugin: 'nebula.ospackage'
ospackage {
packageName = 'hello'
version = '1.0.0'
release = '1'
arch = NOARCH
os = LINUX
requires('bash')
into '/opt/hello'
user 'root'
from('hello/start.sh') {
into '/opt/hello/bin'
fileMode = 0770
}
}
buildRpm {
link('/usr/local/bin/hello', '/opt/hello/bin/start.sh')
}
buildDeb {
link('/usr/local/bin/hello', '/opt/hello/bin/start.sh')
}
* где:
- plugins — список плагинов, которые мы будем использовать. В нашем примере для нас важен nebula.ospackage, который и позволяет собирать пакеты rmp и deb в gradle.
- ospackage — общее описание процесса сборки для пакетов rmp и deb.
- packageName — имя пакета, которое мы будем собирать.
- version — версия пакета.
- release — релиз.
- arch — архитектура. В нашем примере пакет не будет зависеть от нее.
- os — класс операционной системы.
- requires — от каких пакетов зависит наш пакет. Для соответствия пакетный менеджер попробует поставить недостающие пакеты.
- into — каталог расположения приложения.
- user — учетная запись пользователя, в качестве которой будет назначен владелец файлам установленного пакета.
- from — инструкция, какие файлы нужно взять для пакета и куда они должны устанавливаться при инсталляции на конечной системе. Данных инструкций может быть несколько.
- buildRpm — описание сборки пакета rmp.
- buildDeb — описание сборки пакета deb.
* обратите внимание, что в конкретном случае мы можем и не использовать buildRpm и buildDeb, а их содержимое вынести в ospackage. Важно понять, что в ospackage лучше вынести общие настройки, а в buildRpm и buildDeb только то, что характерно для rmp и deb соответственно.
Создадим файл с настройками сборки:
vi /opt/mypkg/settings.gradle
include ':hello'
rootProject.name = 'hello'
project(':hello').name = 'hello'
* мы задали 3 параметра:
- include — при сборке мы должны включить каталог hello. В нем и есть наше приложение. В более сложных сценариях сборки внутра данного каталога тоже может быть свой файл build.gradle.
- rootProject.name — имя корневого проекта.
- project(':hello').name — имя проекта, который находится в каталоге hello (наша программа).
Теперь перейдем в каталог, где у нас создан build.gradle:
cd /opt/mypkg
Сборку рекомендуется выполнять с помощью Gradle Wrapper (gradlew) — скрипта, который вызывает объявленную версию Gradle, загружая ее заранее, если это необходимо. Для формирования wrapper-скрипта выполним:
gradle wrapper --warning-mode all
Мы должны увидеть что-то на подобие:
BUILD SUCCESSFUL in 19s
1 actionable task: 1 executed
Начинаем сборку командой:
./gradlew buildRpm buildDeb
Мы должны увидеть:
...........10%...........20%...........30%...........40%...........50%...........60%...........70%...........80%...........90%...........100%
BUILD SUCCESSFUL in 13s
2 actionable tasks: 2 executed
Готово. Сформированные пакеты мы можем увидеть в каталоге build/distributions:
ls build/distributions/
В нашем примере мы увидим:
hello-1.0.0-1.noarch.rpm hello_1.0.0-1_noarch.changes hello_1.0.0-1_noarch.deb
Проверка
Для проверки нашего пакета, перенесем установочные файлы на конечные компьютеры.
Выполняем установку. Для каждого типа системы будет своя команда.
а) Для RPM-систем:
yum install /tmp/hello-1.0.0-1.noarch.rpm
б) Для Deb-систем:
apt install /tmp/hello_1.0.0-1_noarch.deb
* обратите внимание, в данном примере предполагается, что мы скопировали наши установочные файлы в каталог /tmp.
Установка нашего приложения не должны занять много времени.
После выполняем команду:
hello
В консоли мы должны увидеть:
Hello, World
Наша сборка работает.
Читайте также
Обратите внимание на другие способы сборки пакетов: