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.

Featured image

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

$ npm install serverless -g

3. Clone o repositório do projeto

$ 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:

// config.prod.json
{
  "serviceName": "blog-scheduler",
  "region": "sa-east-1",
  "TIMEZONE": "America/Sao_Paulo",
  "CRON": "cron(0 * * * ? *)",
  "GITHUB_REPO": "serverless/blog",
  "GITHUB_WEBHOOK_SECRET": "YOUR_GITHUB_WEBHOOK_SECRET_HERE",
  "GITHUB_API_TOKEN": "YOUR_GITHUB_API_TOKEN_HERE",
  "GITHUB_USERNAME": "YOUR_GITHUB_USERNAME_HERE"
}

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

$ 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

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.

$ 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

$ git add .
$ git commit -m "Added README file"
$ 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