Пример сборки RPM и Deb пакетов в Gradle

Обновлено и опубликовано Опубликовано:

Используемый термин: Gradle.

В нашем примере будет выполнена сборка пакетов RPM и Deb с помощью Gradle. Мы рассмотрим:

  • Установку Gradle на Ubuntu и Rocky Linux.
  • Служебные файлы для описания сборки.
  • Команды для выполнения сборки.
  • Тестовую установку пакета.

Данную инструкцию можно использовать для базового ознакомления с процессом сборки RPM и Deb при помощи Gradle. В ней рассмотрена примитивная сборка пакета, в который будет входить небольшой скрипт, написанный на bash.

Подготовка системы

Для установки 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).

И так, переходим на страницу загрузки и кликаем по ссылке для скачивания архива:

Переходим по ссылке для загрузки Gradle

Мы окажемся на другой странице, где браузер начнет загрузку. Нам это не нужно — прерываем скачивание архива и копируем ссылку для его загрузки:

Копируем ссылку на загрузку исходников Gradle

Переходим на 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

Наша сборка работает.

Читайте также

Обратите внимание на другие способы сборки пакетов:

1. Создание RPM-пакетов с нуля на примерах.

2. Описание процесса сборки пакета deb.

# DevOps # Linux
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет