· Serhii Siryk · Backend Development  · 7 min de leitura

Desenvolvimento de Software em Infraestrutura Económica



Desenvolvimento de Software em Infraestrutura Económica

Introdução

No desenvolvimento de software de projetos grandes e pequenos na Scalified, é frequente encontrarmos situações em que o ambiente de desenvolvimento inclui vários nós. Desde a Integração Contínua (CI), crucial para uma equipa de desenvolvimento eficaz, até aos ambientes de dev/test/stage, cada um destes nós consome alguns recursos e, por isso, custa dinheiro.

O mais triste é que não é possível desenvolver software de qualidade de forma eficaz em equipa sem usar CI, implantações automáticas, ferramentas de análise estática de código, etc. Mas será que usamos realmente todos os sistemas mencionados 24/7? Provavelmente não — a menos que a equipa de desenvolvimento seja internacional, o que é um caso relativamente raro no outsourcing de desenvolvimento de software — e pode tirar partido do facto de as pessoas normalmente dormirem à noite e desligar completamente os ambientes de desenvolvimento 😉

Isto faz todo o sentido quando se usam fornecedores de cloud como Amazon/Azure/Jelastic, em que pode usufruir de planos de preços flexíveis e pagar apenas pelos recursos consumidos. Assim, neste artigo vamos mostrar como podemos automatizar os nossos ambientes para serem ligados/desligados de acordo com um horário e quanto dinheiro isso pode poupar.

Pré-condições

Comecemos por definir as pré-condições. Vamos usar o alojamento em cloud Jelastic, que suporta a publicação de contentores Docker na cloud. Cada contentor Docker pode ser usado como um nó separado na cloud, pelo que podemos gerir cada um deles individualmente com facilidade. Eis a configuração real de ambiente que usamos para um dos nossos projetos:

Nome do NóCloudletsMemória (até)CPU (até)Preço Mensal (máx., €)
Servidor CI Teamcity6-81 GiB3.2 GHz10.5
Base de dados CI Postgres7896 MiB2.8 GHz9.2
Agente CI Teamcity Agent *31-172.12 GiB6.8 GHz21 (* 3)
Base de Dados de Desenvolvimento Docker Oracle10-303.75 GiB12 GHz34.3
Ferramenta de gestão de Casos de Teste & Requisitos SquashTM7-91.12 GiB3.6 GHz7.7
Servidor de aplicações – DEV Jboss11-151.87 GiB6 GHz14.8
Servidor de aplicações – TEST Jboss11-151.87 GiB6 GHz14.8
Selenium para testes e2e Standalone Chrome2-91.25 GiB4 GHz12.7

Como pode ver, o custo mensal máximo desta configuração poderá ser 167€, assumindo que todos os nós consomem os recursos máximos disponíveis 24/7, ou seja, memória e CPU. Naturalmente, no mundo real não acontecerá que a memória e a CPU sejam tão intensamente utilizadas; no entanto, podemos usar este valor apenas para calcular quanto podemos poupar executando os servidores apenas 10h por dia.

Digamos que um mês médio tem 30 dias e 24 horas por dia, ou seja, 30 * 24 = 720 horas num mês médio. Logo, a nossa configuração custa-nos 167 / 720 = 0.2319 por hora. Assumindo que precisamos que os servidores estejam em funcionamento 10 horas por dia, excluindo os fins de semana precisaríamos deles: 5 dias úteis numa semana * 4 semanas num mês * 10 horas por dia = 200 horas no total. É uma ótima otimização, pois agora podemos pagar no máximo 200 * 0.2319 = 46.38€, o que é 3,6 vezes menos do que o preço original. Supondo que a CPU e a memória são utilizadas em média ~70-80%, o preço será ainda mais baixo. Ótimo, então vamos ver como podemos fazer isso.

O Scheduler está a vigiá-lo

Para fazer o trabalho principal precisaremos de um ambiente extremamente leve, que esteja sempre em execução e não consuma muito. Será responsável por iniciar/parar os nós de acordo com um horário configurado. Recomendamos a utilização de uma imagem Docker Alpine com o Cron pré-instalado. Alpine é uma distribuição Linux rápida e eficiente, e Cron é um conhecido agendador de tarefas baseado em tempo em sistemas Unix-like. A nossa instância real do scheduler no Jelastic tem até 256MiB de memória, 800 MHz de CPU e custa-nos menos de 1,1€ mensais no máximo.

Assim, agora que temos o scheduler em execução e sabemos que o Cron pode executar qualquer comando atempadamente, podemos envolver os comandos que precisamos de executar num único script shell. O script será apenas responsável por ligar/desligar os nós, mas, com certeza, não queremos reinventar a roda. É por isso que vamos usar a ferramenta de linha de comandos do Jelastic (Jelastic CLI) para fazer o trabalho por nós.

Use a CLI

A Jelastic CLI é uma ferramenta concebida para simplificar a interação com a sua conta da Plataforma Cloud através da execução dos comandos adequados diretamente a partir de qualquer máquina. Permite gerir a grande maioria das operações disponíveis remotamente, complementando o vasto conjunto de capacidades disponibilizado através do painel e da API Jelastic.

Pode encontrar mais detalhes sobre a Jelastic CLI aqui:

https://docs.jelastic.com/cli

Embora a Jelastic CLI nos permita fazer as coisas mais facilmente dentro da cloud, requer uma configuração e algumas preparações antes de poder ser usada.

  1. Em primeiro lugar, precisamos de instalar o Java 1.8:
sudo apk add --update --no-cache openjdk8
  1. Depois de ter o Java instalado, podemos instalar a própria Jelastic CLI:
$ sudo curl –s ftp://ftp.jelastic.com/pub/cli/jelastic-cli-installer.sh | bash
  1. O passo seguinte será autenticar-se na cloud Jelastic, o que é necessário para a CLI executar os seus comandos. Pode ser feito manualmente, executando simplesmente o seguinte comando:
~/jelastic/users/authentication/signin --login {email} --password {password} --platformUrl {platform_Url}

Após uma autenticação bem-sucedida, a CLI manterá o token de autenticação, pelo que não precisará de repetir este passo manual com frequência. No entanto, se não quiser fazê-lo manualmente, pode guardar o login e a palavra-passe, por exemplo, em variáveis de ambiente, e automatizar também este passo.

Eis um exemplo do script final que pode usar para iniciar/parar ambientes; também suporta autenticação automática em cada execução:

#!/bin/sh

JELASTIC_BIN=~/jelastic/environment/control
JELASTIC_AUTHENTICATION=~/jelastic/users/authentication
COMMAND_EXECUTION_TIMEOUT=45

login() {
  echo "[INFO][$(date -u)]: Starting Logging to the cloud ..."
  timeout ${COMMAND_EXECUTION_TIMEOUT} bash ${JELASTIC_AUTHENTICATION}/signin --login
  ${JELASTIC_LOGIN} --password ${JELASTIC_PASSWORD} --platformUrl app.mircloud.host --silent true

  if [ $? == 0 ]; then
     echo "[INFO][$(date -u)]: Successfully logged to the cloud"
    else
     echo "[INFO][$(date -u)]: Failed to log to the cloud"
    fi
}

start() {
  login

  for jelastic_environment in ${ENVIRONMENTS}
  do
    echo "[INFO][$(date -u)]: Starting ${jelastic_environment} environment"
    timeout ${COMMAND_EXECUTION_TIMEOUT} ${JELASTIC_BIN}/startenv --envName
    ${jelastic_environment} --silent true

    if [ $? == 0 ]; then
     echo "[INFO][$(date -u)]: Successfully started ${jelastic_environment}
      environment"
    else
     echo "[INFO][$(date -u)]: Failed to start ${jelastic_environment}
      environment in ${COMMAND_EXECUTION_TIMEOUT} seconds"
    fi

  done

}

stop() {
  login

  for jelastic_environment in ${ENVIRONMENTS}
  do
    echo "[INFO][$(date -u)]: Stopping ${jelastic_environment} environment"
    timeout ${COMMAND_EXECUTION_TIMEOUT} ${JELASTIC_BIN}/stopenv --envName
    ${jelastic_environment} --silent true

    if [ $? == 0 ]; then
     echo "[INFO][$(date -u)]: Successfully stopped ${jelastic_environment}
      environment"
    else
     echo "[INFO][$(date -u)]: Failed to stop ${jelastic_environment}
     environment in ${COMMAND_EXECUTION_TIMEOUT} seconds"
    fi
  done
}

$@

Note que este script requer que algumas variáveis de sistema, como ${ENVIRONMENTS}, ${JELASTIC_LOGIN} e ${JELASTIC_PASSWORD}, estejam pré-configuradas antes da execução. Por exemplo, a primeira é apenas uma lista de ambientes Jelastic separados por espaços que precisam de ser processados pelo comando start/stop, por exemplo app-dev squash-tm app-test oracle-database selenium-chrome teamcity. Pode ser feito facilmente através da interface web do Jelastic, como aqui:

Desenvolvimento de software - Configurar variáveis de ambiente no Jelastic

O último passo para o fazer funcionar é dar permissão para executar o script:

$ chmod u+x script

Ótimo, agora podemos usar o script para iniciar/parar os ambientes especificados na variável ${ENVIRONMENTS}. Basta executar o script fornecendo o parâmetro correspondente para o experimentar:

$ ./script start
$ ./script stop

Configurar o Horário

O passo final que falta é configurar o Cron. Para isso, precisamos de criar um ficheiro crontab para agendar a execução automática no momento pretendido.

O ficheiro crontab principal do root está localizado por predefinição no diretório /var/spool/cron/crontabs. Para o visualizar e editar, execute o seguinte comando:

$ crontab –e

Agora precisamos de configurar quando executar o nosso script:

TZ=UTC
00 21 * * 1-5 /path/to/script stop
00 09 * * 1-5 /path/to/script start

Como pode ver nesta configuração de exemplo, o nosso script irá desligar automaticamente todos os servidores às 21h e ligá-los às 9h. Ao sábado e ao domingo, nenhum dos comandos será executado.

O Que Se Segue

Como pode ver, esta solução simples e eficaz ajuda a reduzir as despesas com a infraestrutura de desenvolvimento e aumenta os ganhos da utilização de serviços de cloud modernos. Para a tornar ainda mais fácil de usar em projetos reais de desenvolvimento de software, a equipa Scalified criou uma imagem Docker pronta a usar. Se utiliza o Jelastic, pode obtê-la no Docker Store ou criar um fork para suportar o fornecedor de cloud que usa.

Back to Blog

Related Posts

View All Posts »