2 min read

Упаковка свежего Python в RPM-пакет

Упаковка  свежего Python в RPM-пакет

Иногда возникает необходимость запустить что-то на свежем питоне, но на довольно старых ОС, для которых давным-давно не делают соответствующих пакетов. Такое частенько случается в крупных инфраструктурах, существующих не один год.

  1. Создаём контейнер с CentOS:
docker run --name centos7 -it --rm centos7
  1. Скачиваем нужную нам версию Python:
cd /tmp/
curl -LO https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.xz
tar -xf Python-3.12.1.tar.xz
  1. Ставим зависимости:
yum -y install openssl-devel ncurses-devel libffi-devel xz-devel libuuid-devel tk-devel gdbm-devel sqlite-devel bzip2-devel readline-devel gcc make rpm-build
  1. Билдим Python:
cd Python-3.12.1
./configure --prefix=$HOME/python3.12 --enable-shared
make -j$(nproc)
make altinstall

Если необходимо, чтобы пакет заместил собой действующий Python - используй make install вместо make altinstall.

  1. Чистим мусор, исправляем пути интерпретатора и симлинки:
rm -rf /tmp/Python-*
cd ~/python3.12/bin
sed -i "s|$(pwd)|/usr/bin|" *
cd ~/python3.12/
mkdir lib64 && cd lib64
ln -s ../lib/libpython3.12.so .
ln -s ../lib/libpython3.12.so.1.0 .
ln -s ../lib/libpython3.so .
  1. Теперь нам нужен Ruby и FPM для сборки пакета:
yum -y install git
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"'>> ~/.bashrc
source ~/.bashrc
rbenv install 3.0.1
rbenv global 3.0.1
gem install fpm --no-document
  1. И вот мы готовы к сборке пакета:
cd /root/python3.12/
fpm --verbose -v 3.12.1 -n python3 -s dir -t rpm .=/usr/
  1. Попробуем поставить своё изделие:
rpm -ivh python3-3.12.1-1.x86_64.rpm
/bin/python3.12 -V
Python 3.12.1
/bin/python3.12 -m pip -V
pip 23.2.1 from /root/python3.12/lib/python3.12/site-packages/pip (python 3.12)
  1. Выгружаем куда-нибудь свой пакет для дальнейшего использования, например, через docker cp или какой-либо внешний сервис:
curl --upload-file ./python3-3.12.1-1.x86_64.rpm https://free.keep.sh
https://free.keep.sh/my-hash/python3-3.12.1-1.x86_64.rpm