Trabalhando com uma versão atualizada de Perl no OpenShift
Uma forma de trabalhar com uma instalação Perl atualizada rodando no OpenShift, válido também para a GetupCloud.
OpenShift
O OpenShift é o OpenStack funcionando em máquinas com RedHat na Amazon.
Ele tem sido uma ferramenta indispensável para meu trabalho. Geralmente ao iniciar um novo projeto, é com ele que começo.
Está tudo à mão. Repositório para o código, banco de dados, devops, backup,
logs. E toda a configuração, após ter uma conta criada lá, pode ser feita
pela linha de comando com o utilitário
rhc
.
A criação de conta é gratuita, o produto oferecido no menor pacote oferece uma configuração razoável, sem vencimento, e os limites são apenas de recursos. A assinatura não tem validação com cartão de crédito.
Trata-se de um ambiente perfeito para uma demonstração ou protótipo, em um ambiente que pode ser facilmente compartilhado (é possível formar uma equipe com privilégios diferenciados), com certificado SSL válido.
Sua aplicação funciona em um servidor Linux com acesso shell por ssh, e o melhor de tudo, um compilador gcc. Combine-se isso com o cartridge DIY (Do It Yourself), e podemos ter o que quisermos lá dentro.
Um servidor Apache se comunica através da porta 8080 com sua instância, não importa o que seja, desde que converse HTTP.
Linguagens e suas versões
Quando se configura um novo ambiente (aplicação), deve-se escolher o que ela vai rodar. Os cartridges WEB podem ser uma linguagem (Perl, Python, PHP, NodeJS), ou uma aplicação já instalada junto com a linguagem (como o WordPress com PHP, ou o Ghost com NodeJS) ou um banco de dados. Combinando-se vários cartridges, construimos a estrutura para nossa aplicação.
Há, atualmente, uma trinca de linguagens que se acha quase em qualquer máquina Unix: Perl, Python e Ruby. Mais recorrente é ter que instalar um compilador C do que uma dessas linguagens.
Então não há muito o que pensar nem justificar. Instalar pacotes, bibliotecas ou módulos é fácil em qualquer uma delas.
Você não encontrará, no OpenShift, as versões mais atualizadas do que gosta, mas encontrará estabilidade e usabilidade. Então, se quiser um servidor escrito em PyPy3, ou em Perl6, ou na versão dev de sua linguagem preferida, é só compilar e usar.
Existem alguns cartridges mantidos pela comunidade, mas apenas são um pouco menos atrasados que os oficiais. Quer controle, faça você mesmo!
Perl
O que fiz em Perl, pode ser feito com qualquer linguagem que compile num RedHat. Se pretende usar OpenShift e não quer ficar preso a versões não atualizadas de sua linguagem preferida, compile sua linguagem e inicie um servidor HTTP na porta indicada pela variável de ambiente $OPENSHIFT_DIY_PORT
, no endereço OPENSHIFT_DIY_ADDRESS
.
No momento em que esse texto está sendo escrito, o Perl no OpenShift é a versão 5.10, e a versão atual é 5.22, que contém inúmeras melhorias.
Mãos à obra
Nosso objetivo é ter o Perl mais recente, sem gambiarras (a não ser a de instalar um mais novo onde há um antigo).
Para executar esse trabalho, vamos usar ferramentas padrão do Perl. Há um excelente guia em inglês sobre como ter um Perl atualizado no OpenShift, mas fazendo algumas gambiarras, o que pretendo evitar. Mas foi a partir dessas instruções que aprendi o necessário.
Usaremos as seguintes ferramentas:
- PerlBrew para gerenciar e construir novas versões.
- CPAN Minus para gerenciar os módulos que precisarmos.
Vamos instalar o PerlBrew e compilar a mais recente versão disponível Perl (ele cuida de verificar isso), vamos configurar o ambiente para que quando nos loguemos via shell, facilmente iniciemos o ambiente com a nova versão (ou muito mais antiga, se precisar). E finalmente, vamos configurar nossos scripts de start e stop para trabalharem com o Perl novo.
Primeiro, entre no shell de sua aplicação com o seguinte comando rhc ssh NOME_APP
. Então verifique a versão do Perl padrão com o comando perl -V
:
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
Copyright 1987-2009, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
PerlBrew
É preciso alterar o local padrão da nova instalação:
$ echo 'export PERLBREW_ROOT=$OPENSHIFT_DATA_DIR/perlbrew' >> $OPENSHIFT_DATA_DIR/.bash_profile
$ echo 'export PERLBREW_HOME=$OPENSHIFT_DATA_DIR/.perlbrew' >> $OPENSHIFT_DATA_DIR/.bash_profile
$ echo 'alias perlbrew=$PERLBREW_ROOT/bin/perlbrew' >> $OPENSHIFT_DATA_DIR/.bash_profile
$ source $OPENSHIFT_DATA_DIR/.bash_profile
$ echo 'export PERL_CPANM_HOME=$OPENSHIFT_DATA_DIR/.cpanm' >> $OPENSHIFT_DATA_DIR/.bash_profile
O que fizemos até aqui foi dizer onde queremos que o PerlBrew seja instalado bem como seu local de trabalho, no diretório com permissão de escrita (e que mantém o conteúdo entre deploys): $OPENSHIFT_DATA_DIR
, já que o $HOME
do OpenShift é read-only).
Agora é baixar e instalar:
$ wget -O - http://install.perlbrew.pl | bash
Depois de instalado, pode-se verificar que versões de Perl estão disponíveis para compilação:
Perl
$ perlbrew available
perl-5.22.0
perl-5.20.2
perl-5.18.4
perl-5.16.3
perl-5.14.4
perl-5.12.5
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07
E finalmente, instalar o Perl mais atual (ou, simplesmente, o mais adequado):
$ perlbrew install --notest --noman perl-5.22.0
Fetching perl 5.22.0 as /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/dists/perl-5.22.0.tar.bz2
Download http://www.cpan.org/src/5.0/perl-5.22.0.tar.bz2 to /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/dists/perl-5.22.0.tar.bz2
Installing /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/build/perl-5.22.0 into /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/perls/perl-5.22.0
This could take a while. You can run the following command on another shell to track the status:
tail -f /var/lib/openshift/55e5156a7628e1d752000132/app-root/data//perlbrew/build.perl-5.22.0.log
Após compilar e instalar, pode-se verificar se está tudo certo:
$ perlbrew list
perl-5.22.0
Criar um apelido para essa versão:
$ perlbrew alias create perl-5.22.0 production
$ perlbrew list
perl-5.22.0
production (5.22.0)
Ativar a nova versão e verificar:
$ perlbrew switch production
A sub-shell is launched with production as the activated perl. Run 'exit' to finish it.
bash-4.1$ perl -v
This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2015, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
bash-4.1$
E finalmente temos nosso novo Perl!
Mas espere, é preciso mais... Precisamos instalar nossos módulos preferidos, com o CPAN. Prefiro o cpanm ao invés do gerenciador padrão.
CPANM
Basta estar no ambiente com a nova versão instalada, e usá-la para instalar o pacote:
bash-4.1$ curl -L https://git.io/cpanm | perl - App::cpanminus
PERL_CPANM_HOME=/var/lib/openshift/55e5156a7628e1d752000132/app-root/data//.cpanm
bash-4.1$ curl -L https://git.io/cpanm | perl - App::cpanminus
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 296k 100 296k 0 0 1162k 0 --:--:-- --:--:-- --:--:-- 5205k
--> Working on App::cpanminus
Fetching http://www.cpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7039.tar.gz ... OK
Configuring App-cpanminus-1.7039 ... OK
Building and testing App-cpanminus-1.7039 ... OK
Successfully installed App-cpanminus-1.7039
1 distribution installed
Agora é possível atualizar os pacotes necessários. Para nossa aplicação exemplo, vou usar o Web::Simple
:
bash-4.1$ cpanm --notest Web::Simple Starman
Depois de algumas (muitas) dependências instaladas, o trabalho no servidor acabou, agora já é possível trabalhar apenas localmente, usando o git.
Duas tarefas ainda restam:
- Escrever uma pequena aplicação em Perl para verificar se tudo está OK.
- Alterar os scripts que controlam a inicialização e finalização do serviço.
A Aplicação
Esta é uma livre adaptação do exemplo na página do módulo Web::Simple
(uma boa explicação sobre esse módulo está nesse artigo do Renato Cron):
#!/usr/bin/env perl
package Server;
use Web::Simple;
sub dispatch_request {
GET => sub {
[ 200, [ 'Content-type', 'text/plain' ], [ 'This is the article: http://www.sysincloud.it/trabalhando-com-perl-no-openshift/' ] ]
},
'' => sub {
[ 405, [ 'Content-type', 'text/plain' ], [ 'Method not allowed' ] ]
}
}
Server->run_if_script;
Salvei como Server.pm
na raiz de meu diretório com o clone do projeto (Trabalhando com git no OpenShift).
No diretório .openshift/action_hooks
, dentro do clone do projeto, existem os arquivos start
e stop
.
O start
deve ficar assim:
#!/bin/bash
source $OPENSHIFT_DATA_DIR/.bash_profile
source ${PERLBREW_ROOT}/etc/bashrc
perlbrew switch production
cd $OPENSHIFT_REPO_DIR/
nohup starman -l $OPENSHIFT_DIY_IP:$OPENSHIFT_DIY_PORT --workers 5 --pid $OPENSHIFT_DATA_DIR/server.pid Server|& /usr/bin/logshifter -tag diy &
E o stop
assim:
#!/bin/bash
source $OPENSHIFT_CARTRIDGE_SDK_BASH
PID=$OPENSHIFT_DATA_DIR/server.pid
if [ ! -f $PID ]
then
client_result "Application is already stopped"
else
kill `cat $PID`
fi
Comita, dá push e acessa:
http://diy-sysincloudit.rhcloud.com