Skip to content

Commit

Permalink
Merge pull request #450 from pyladies-brazil/post-mortem
Browse files Browse the repository at this point in the history
adiciona post-mortem sobre a quebra de build
  • Loading branch information
giovana-morais authored Oct 19, 2023
2 parents dcf2766 + 690063f commit 2c1a90b
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 7 deletions.
7 changes: 0 additions & 7 deletions content/2023-10-16-testando-o-build-do-heroku.md

This file was deleted.

135 changes: 135 additions & 0 deletions content/2023-10-17-pyladies-post-mortem.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
---
title: "post-mortem: quebra de build no site da pyladies"
layout: post
date: 2023-10-17
headerImage: false
author: Giovana Morais
category: blog
---

absolutamente tudo quebrou. codeship se tornou pago e o buildpack do heroku estava
desatualizado.
[nenhum build funcionava.](https://github.com/pyladies-brazil/br-pyladies-pelican/issues/441)

respiramos fundo, arregaçamos as mangas e fomos descobrir o que estava
acontecendo. essa postagem é a descrição de todo o processo pra tentar resolver
o bug dos builds. spoiler: o problema foi resolvido!

# investigação
o meu primeiro passo foi entender como era o fluxo inteiro de deploy do site. o
que eu descobri é que era bem simples: quando um PR do repositório era mergeado,
o Codeship iniciava uma tarefa de enviar as atualizações pro Heroku e o Heroku
fazia o deploy do site.

quando o Codeship se tornou uma ferramenta paga, deletou todas as contas
gratuitas. a partir disso tentei fazer o deploy direto pelo Heroku de uma forma
manual, a fim de validar o que estava dando errado e por que estava dando
errado. logo no primeiro deploy que tentei fazer, encontrei um erro: o Python
não estava sendo instalado corretamente.

## heroku e o buildpack
o Heroku usa _buildpacks_ pra instalar bibliotecas, linguagens, ferramentas e
qualquer coisa que você precise pro seu projeto. existem buildpacks
[oficialmente suportados pelo
Heroku](https://devcenter.heroku.com/articles/buildpacks#officially-supported-buildpacks),
como o buildpack para Python, e os buildpacks que são feitos por terceiros e
pela comunidade, como o [builpack para o
Pelican](https://github.com/getpelican/heroku-buildpack-pelican) e o
[buildpack para o
nginx](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-nginx).

o site da PyLadies usava um buildpack que foi
[criado a partir do buildpack do Pelican](https://github.com/pyladies-brazil/heroku-buildpack-pelican),
mas customizado para o nosso site.

### tentativa 1: atualizar o buildpack da PyLadies
ao analisar o buildpack da PyLadies, notei que os passos eram bem simples. ele
instalava o Python em uma versão fornecida, rodava o Pelican para gerar o
conteúdo do blog e então instalava o nginx e dava acesso à pasta com os arquivos
.html gerados no passo anterior.

tentar atualizar as versões necessárias no buildpack não funcionou. o maior
motivo era porque o método de instalação do Python estava defasado.

conferi no buildpack oficial do Python como era feita essa instalação e até
pensei em ajustar o nosso buildpack, mas aí me veio a pergunta: "será que vale a
pena?"

e essa pergunta foi muito importante. se um dia mudassem o endereço que eu
deveria usar para fazer o download do Python *de novo*, eu teria que arrumar *de
novo* esse buildpack. isso é um retrabalho, já que as pessoas que mantêm o
buildpack oficial do Python vão fazer isso por nós. dessa forma, decidi partir
pra minha segunda abordagem.

### tentativa 2: combinar o buildpack da PyLadies com buildpacks oficiais
a ideia aqui era simples: em vez de instalar o python dentro do nosso buildpack,
eu ia usar o buildpack oficial do python + o nosso buildpack. dessa forma,
teríamos sempre a instalação mais atual do Python e manteríamos no nosso
buildpack apenas o que era essencial.

o problema dessa abordagem é que eu notei que não tinha nada demais acontecendo
no nosso buildpack, então mais uma vez era retrabalho. precisaríamos sempre
atualizar os métodos de instalação do nginx e não valia a pena ficar fazendo
algo que já está sendo feito porquem mantém o buildpack do nginx.

rapidamente fui para minha terceira tentativa.

### tentativa 3: trocar tudo por buildpacks oficiais
aqui, troquei o nosso buildpack velho e capenga por dois buildpacks: um
buildpack de Python, que instala o Python e todas as bibliotecas que a gente
precisa, e um buildpack do nginx, que vai ser responsável por fazer nosso site
aparecer.

criei um arquivo Procfile, que é um indicativo pro Heroku do que ele precisa
rodar enquanto faz o deploy. o nosso Procfile é bem simples, ele gera as oáginas
do Pelican e então roda o nginx.

testei tudo e os builds estavam 100%. ótimo!

fui para o meu próximo passo: github actions.

## github actions
tudo que eu estava fazendo até agora era manualmente. eu gerava as mudanças na
minha máquina e fazia o deploy direto no Heroku. isso não é bem o que a gente
quer. a gente quer que, toda vez que um Pull Request seja mergeado, uma
mágica aconteça e essa mudança também seja refletida no site. dei uma fuçada na
documentação do github actions e encontrei uma que servia para fazer o deploy no
Heroku. fiz o que precisava ser feito e criei um PR teste. o build rodou
perfeitamente! as coisas estavam dando certo! até que fui entrar no site
pra conferir e...

![img](/images/404_not_found.png)

## giovana vs pelican
o nginx não estava achando a pasta com o
conteúdo do site e eu passei muito tempo tentando entender o porquê.

o github actions estava ok, os builds do heroku estavam ok também, mas **algo**
estava acontecendo porque o nginx não estava conseguindo achar a pasta com o
conteúdo. depois de fuçar muito dentro dos logs dos builds finalmente achei uma
explicação:

```shell
CRITICAL UndefinedError: 'pelican.contents.Article object' has no attribute 'tags'
```

e aí eu percebi que o problema não estava no nginx que eu tinha passado os
últimos dois dias investigando. o problema tava no *safado* do pelican e no
template.

fiz o que todo hacker faz e joguei o erro no google. não surpreendentemente,
achei uma pessoa com exatamente
[o mesmo problema que o meu](https://github.com/getpelican/pelican/issues/2910)
e descaradamente roubei a ideia de só colocar uma validação a respeito do
atributo de "tags". não é uma solução de fato, mas o objetivo de todo o trabalho
era consertar o build. a atualização do template fica pra depois.

uma vez que o template foi consertado e o merge feito, o github action fez o
trabalho dele e o deploy aconteceu. mais do que isso: o deploy funcionou!


## agradecimentos
tudo isso aconteceu ao som desse
[vídeo de 3 horas com vários álbuns de drum & bass](https://www.youtube.com/watch?v=1zGaTE2AmsU),
que é a minha obsessão atual pra estudar porque me sinto em um videogame. então
o meu agradecimento pricipal vai pro canal do Youtube `Mr Fredericks.`. obrigada!
Binary file added content/images/404_not_found.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 2c1a90b

Please sign in to comment.