Dark mode
Light mode
06 Mar 19
5 min

Como agendar posts no Jekyll usando a AWS

Se você sentiu falta da funcionalidade de agendar postagens em sites estáticos, esse artigo resolve o seu problema.

Quando resolvi passar meu blog do Wordpress para o Jekyll encontrei vantagens que só quem usa um gerador de website estático poderia entender.

De repente tudo ficou mais fácil e divertido de fazer, escrevia artigos com markdown, editava o tema do jeito que eu queria sem sofrimento, tinha uma página com um carregamento super rápido e por aí vai.

Foram dias felizes... até eu querer agendar uma postagem.

Raivoso
Por que diabos é tão difícil?

Com uma pesquisa rápida é possível encontrar algumas soluções, e a que vamos tratar aqui é o Post Scheduler.

É um tanto chato configurar tudo o que ele fala pra configurar nesse artigo, mas eis aqui a boa notícia, funciona.

Então, se é isso mesmo que você quer, dá uma aquecida nessa cadeira e vamos pra luta!

Se aquecendo
Nota
No momento em que escrevo isso, acabo de descobrir que existe uma outra maneira usando o Travis CI, mas esse vai ficar pra um próximo artigo.

Antes de começarmos

O que nós vamos fazer aqui é seguir a documentação do Post Scheduler passo a passo.

Ele funciona da seguinte maneira:

  1. Um webhook do GitHub é disparado quando um pull request (contendo o commit com o novo post) é atualizado.

  2. Se o comentário do pull request contém uma string com o formato schedule(MM/DD/YYYY H:MM pm) e a pessoa que comentou é um colaborador do projeto, o post é agendado.

  3. Um cron job serverless roda de hora em hora na AWS para verificar se algum post está pronto para ser publicado.

  4. Quando o post está pronto para ser publicado, a função automaticamente faz o merge do pull request na master, fazendo o deploy do site.

  5. A branch do post agendado é automaticamente deletada.

Um pouco complexo, mas vale a pena. Prontos?

Partiu!

1. Configure o Serverless + AWS

Para seguirmos, a primeira coisa que você deve fazer, caso não tenha esses caras configurados, é seguir esse tutorial aqui.

2. Instale o Serverless localmente

1$ npm install serverless -g

3. Clone o repositório do projeto

1$ git clone https://github.com/serverless/post-scheduler.git

4. Crie um token de acesso pessoal no GitHub

4.1. Acesse as configurações no seu perfil do GitHub.

Settings

4.2. Vá em Developer Settings

Developer settings

4.3. No menu a esquerda vá em Personal access tokens

Personal access tokens

4.4. Clique em Generate new token

Generate new token

4.5. Digite uma descrição qualquer para o token e selecione o escopo repo

Preencher as informações

4.6. Copie o token gerado para utilizarmos na configuração em seguir.

Copiar o token gerado

5. Altere as configurações

De volta ao projeto clonado, renomeie o arquivo config.prod.example.json para config.prod.json e altere os dados:

1// config.prod.json 2{ 3 "serviceName": "blog-scheduler", 4 "region": "sa-east-1", 5 "TIMEZONE": "America/Sao_Paulo", 6 "CRON": "cron(0 * * * ? *)", 7 "GITHUB_REPO": "serverless/blog", 8 "GITHUB_WEBHOOK_SECRET": "YOUR_GITHUB_WEBHOOK_SECRET_HERE", 9 "GITHUB_API_TOKEN": "YOUR_GITHUB_API_TOKEN_HERE", 10 "GITHUB_USERNAME": "YOUR_GITHUB_USERNAME_HERE" 11}
  • serviceName: nome do serviço que vai aparecer na sua conta AWS
  • region: região da AWS para fazer deploy das funções e do banco de dados. Note que eu alterei para sa-east-1 (que é no Brasil)
  • TIMEZONE: A timezone em que o cron irá rodar. Veja no arquivo timezones.json as timezones que estão disponíveis (no meu caso alterei para America/Sao_Paulo).
  • CRON: Com que frequência você quer que ele verifique se há posts agendados? Por padrão, ele roda de hora em hora.
  • GITHUB_REPO: O proprietario-do-repositório/nome-do-repositório do seu projeto.
  • GITHUB_WEBHOOK_SECRET: Qualquer string que você quiser. Isso será usado nas suas configurações do webhook. Para gerar uma string aleatória você pode acessar este site.
  • GITHUB_API_TOKEN: Token de acesso pessoal criado no passo anterior.
  • GITHUB_USERNAME: Seu nome de usuário do GitHub.

6. Faça o deploy e copie a url de retorno

1$ serverless deploy

Copie a url retornada em POST para configurarmos o webhook:

Webhook URL

7. Configure o webhook

7.1. No seu repositório, vá em Settings

Repo Settings

7.2. No menu a esquerda, clique em Webhooks

Webhooks

7.3. Na tela seguinte, clique em Add webhook

Add webhook

7.4. Crie o webhook

  • Em Payload URL cole a url retornada no POST do passo anterior.
  • Em Content type altere para application/json
  • Em Secret coloque a string que você adicionou em GITHUB_WEBHOOK_SECRET no arquivo config.prod.json
  • Nos eventos que irão disparar o webhook, selecione Let me select individual elements e depois selecione somente Issue comments

Por fim, clique em Add webhook

Criar o webhook

8. Testando se funciona

8.1. No terminal do seu projeto com o Jekyll, crie uma nova branch com qualquer nome, eu chamei a minha de readme.

1$ git checkout -b readme

8.2. Faça alguma modificação no projeto e envie o commit. No meu caso, criei um arquivo README.md

1$ git add . 2$ git commit -m "Added README file" 3$ git push -u origin readme

8.3. No seu repositório, clique em Pull requests

Pull requests

8.4. Na tela seguinte, clique em New pull request

New pull request

8.5. Selecione a branch que você criou e clique em Create pull request

Create pull request

8.6. Agora é o momento decisivo, insira um comentário com a data e hora que você gostaria de agendar o post, usando o formato schedule(MM/DD/YYYY H:MM pm)

Comment

8.7. Após alguns segundos, se um novo comentário como esse aparecer, você conseguiu! Parabéns, agora você pode agendar postagens com o Jekyll 👏🎉

Sucesso

Nota 1
Se nada acontecer, pode ser que o webhook não tenha sido disparado (já aconteceu comigo). Tente inserir um novo comentário com uma data novamente e ele deve agendar.
Nota 2
Para cancelar o agendamento de um post basta deletar o comentário retornado pelo serviço com os dados do agendamento.

Finalmente, depois dessa saga, você consegue fazer agendamentos, é só seguir o passo #8 sempre que desejar.

Espero que tenha gostado e tenha conseguido atingir o seu objetivo. Até mais!

A melhor maneira de ser feliz é contribuir para a felicidade dos outros.Confúcio

Compartilhe

Foto de Thiago sorrindo

Autor

Thiago Rossener

Desenvolvedor front-end, filósofo e espiritualista

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

Newsletter

Assinando minha newsletter você fica sabendo sempre que eu publicar algo novo, prometo que vai ser só isso.