Construímos o arquivo rpm do aplicativo usando fpm. Lá definimos python3 como dependência, para que ele seja instalado automaticamente antes do rpm principal.
Mas está instalando 3.7. Para substituir pelo 3.8, precisamos verificar a versão do sistema operacional antes se é centos ou awslinux e com base nisso precisamos instalar rpm específico.
Então, mantive esses blocos condicionais no script preinst e passei para o parâmetro --before-install.
Mas ele está travando durante a instalação do rpm.
Então, quando verifico com o modo detalhado. Descobri que não está funcionando com preinst.
O motivo é que o ptyhon install não consegue aplicar o bloqueio e continuar a instalação, pois o projeto já adquiriu o bloqueio.
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
Qualquer sugestão que você possa fornecer
Para ser mais específico, encontre detalhes abaixo.
A ferramenta usada para criar rpm:pm Preciso instalar o python3.8 como dependência do rpm do aplicativo.
Se eu definir isso como dependência usando -d python3, ele estará instalando a versão 3.7 no amazon linux e 3.6 no centos 8. Para usar a versão 3.8, há algumas outras etapas a serem executadas antes de instalar o pacote.
Então, removi o python3 da seção de dependência e adicionei --before-install como script de shell.
Este é o script de shell que mantive lá.
#!/bin/bash
echo "Starting preinst"
echo "Checking OS Version"
DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"' | tr '[:upper:]' '[:lower:]')
if [[ "$DISTRO" =~ "centos linux" ]]; then
echo "centos is detected"
sudo yum install -yq python38
elif [[ "$DISTRO" =~ "amazon linux" ]]; then
echo "amazon linux detected"
sudo yum install -yq amazon-linux-extras
sudo amazon-linux-extras enable python3.8
sudo yum install -yq python3.8
elif [[ "$DISTRO" =~ "ubuntu" ]]; then
echo "ubuntu detected"
sudo apt install pyhton3 -yq
else
echo "Neither centos nor amazon linux 2"
fi
Ele está acionando o script, mas travando na instalação do python a partir do shell script.
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.
Alguma sugestão sobre como consertar isto?
Meu requisito é instalar o python3.8 como parte do rpm do nosso produto e também como uma dependência.
Responder1
Instalar rpms em scripts de outro rpm não funciona. Já em uma transação rpm. Além disso, as dependências não estão nos metadados do pacote e yum/dnf não pode resolvê-las. Qualquer um deles representa uma experiência ruim para o usuário.
Várias distros em uma especificação de rpm são possíveis com o uso criativo de condicionais. Digamos que você precise de pelo menos Python 3.8. Emprestando de vários pacotes rpmno CentOS e em outro lugar, o build dep pode ser parecido com:
%if 0%{?fedora} || 0%{?rhel} > 8
BuildRequires: python3-devel
%endif
%if 0%{?amzn} || 0%{?rhel} == 8 || 0%{?suse_version} > 1500
BuildRequires: python38-devel
%endif
Observe a estranha coisa do número prefixado zero. Isto permite o uso em expressões mesmo que a variável não esteja definida.
Continue comDiretrizes de empacotamento Python para Fedora(ou E.L.) para% instalar a coisa. Uma coisa complicada: para algumas dessas distros, Python é /usr/bin/python3, outras /usr/bin/python38. Pode desejar tornar isso uma variável.
O repositório extra da Amazon python3.8 não está habilitado por padrão. Habilite-o para a construção do pacote, por exemplo, nos repositórios da ferramenta simulada. Os usuários também precisarão habilitar o repositório para instalar esses pacotes.
As macros de empacotamento do Fedora geralmente geram dependências apropriadas para módulos python instalados em locais típicos como %{python3_sitelib} Não sei de imediato o que o amzn faz para isso, provavelmente o mesmo. Caso contrário, pode ser necessário adicionar dependências manuais, comoRequires: python(abi) = 3.8
Crie o arquivo de especificações resultante em cada distribuição exclusiva de interesse: Fedora, RHEL, Amazon Linux, CentOS Stream, SUSE. Embora um pacote ligeiramente diferente para cada um seja irritante, o resultado é uma experiência de instalação fácil para os usuários.
Os pacotes Debian são um exercício para o leitor.
Geradores automáticos de pacotes como fpm podem não produzir pacotes tão inteligentes. Troca clássica: gerador rápido para suportar múltiplas distros, versus um empacotador humano que pode fazer algo intencional com as peculiaridades das diversas distribuições.