DevOps/Basico

De TheNets Wiki
Ir para: navegação, pesquisa

Começaremos a jornada para termos um projeto com a cultura DevOps implantada já na prática.

Imagine um projeto web, um "Hello World" do mais simples, apenas um servidor que sobre, fica exposto numa porta qualquer, não possui SSL. Começaremos criando o código para este projeto e no final faremos o deploy deste projeto para um servidor.

Versionamento de código

Qualquer projeto de desenvolvimento deve possuir o histórico de modificações para manter todo o código e ser a fonte para os futuros processos de CI (Continuous Integration). O Git é sem dúvida o líder no mercado hoje em dia e a melhor ferramenta para versionamento para códigos.

Neste nosso projeto, crie um repositório Git em algum serviço como o GitHub, GitLab ou BitBucket e em seguida clone este repositório para sua máquina.

A partir deste ponto, tudo está preparado para começarmos a escrever o projeto e termos o histórico de tudo que foi feito.

Olá mundo

Agora criaremos nosso primeiro código de "Hello World". A linguagem que escolhida será Python por uma questão didática. A maneira que o sistema de isolamento de módulos e instalação destes ilustra bem cenários que se adaptam para muitos muitas outras linguagens.

Comece criando um arquivo chamado src/main.py ou seja, ele deve estar dentro de um diretório chamado src/. Por mais que pareça algo simples, organização dos arquivos do código-fonte é muito importante para eliminar a quantidade de documentação (aquelas que ninguém lê) e tornar todo o processo mais intuitivo e menos sujeito a falhas humanas. Veremos mais para frente mais detalhes a respeito disso.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

Este projeto possui uma dependência que é o flask. Para aplicações Python, se você tiver o pip instalado, basta executar o comando pip install flask e então executar o código acima. Então tudo funcionará. Porém existem problemas em se fazer isso e veremos o motivo na próxima sessão, de qualquer modo, vamos fazer primeiro nesse modo "old school". Com o código-fonte da aplicação main.py criado, vamos instalar o que é necessário para colocar este projeto para funcionar. Vá ao terminal e execute:

# Instale o virtualenv
#   considerando que está utilizando uma distro Debian/Ubuntu ou derivada.
sudo apt-get install -y virtualenv

# Cria o virtualenv que utilize o python3
virtualenv venv -p python3

# Ative o virtualenv
source venv/bin/active

# Instale a bliblioteca flask
pip install flask

Com o ambiente preparado, agora é hora de executar o código e ver se tudo deu certo e nosso servidor web está funcionando:

# Cria a variável de ambeinte com
# o nome do arquivo do servidor flask
export FLASK_APP=src/main.py

# Ative o virtualenv (se ainda não estiver ativo)
source venv/bin/activate

# Execute o servidor flask
flask run

Reproduzindo ambiente de desenvolvimento

Criar artefatos de configuração.

- Makefile com o 'prepare'

- Libs no 'requirements.txt'

- Configuração do servidor com 'Dockerfile', 'Ansible' e/ou 'Terraform'

Organização do código

Não existe regra de como se fazer esse tipo de coisa e nem deve existir. Os times devem escolher a maneira que eles trabalharão e, desde que todos nesse time se entendam e falem a mesma língua, então está tudo certo.Ainda assim, existem alguns nomes comuns que podem servir de guia para novos projetos. Use essa estrutura como um "guia". É importante aprender alguns desses nomes não apenas para utilizar em projetos privados, mas também para conseguir conversar com o resto da internet, pois a maioria dos grandes projetos OpenSource seguem estes nomes para organização de suas bases de código.

Apps desktop / Apps Mobile / CLI / ...
d ./
f ./Makefile Arquivos de configuração do make que permite criar diversas automações simples de executar para o projeto.
d ./src/ Código-fonte
d ./src/lib/ Bibliotecas desenvolvidas para a própria aplicação (não inclui bibliotecas de terceiros)
d ./src/helpers/ Qualquer tipo de código comuns para auxiliar no desenvolvimento, como uma função para limpar um determinado caractere de uma string.
d ./build/ Contém o(s) último(s) build(s) do projeto. Este diretório é sempre excluído do versionamento. Caso alguém precise de um build antigo, basta baixar o código antigo, preparar o ambiente e então

Organizando o repositório

- Padrões de nomes para branchs

- Uso de tags

Ambientes da aplicação

- Development

- Stage

- Production

Próximos

Intermediário: [Git] Como fazer um merge request?

Intermediário: [Git] Como criar um tag e fazer deploy para produção?

Intermediário: [Ansible] Como fazer deploy de aplicação com o Ansible?

Avançado: [Docker] Como criar ambiente de desenvolvimento baseado em container?

Avançado: [Docker] Como criar Dockerfile com multistage build?