Olá! Você já pensou como seria poder gerar um README dinamicamente para aquele seu projeto do GitHub?
Eu já, mas nunca pensei em como funcionaria... até eu pesquisar se era possível e acabar me surpreendendo.
Depois de algumas pesquisas descobri uma feature do GitHub chamada "GitHub Actions", e ela consegue executar um código que você especificar, em diversas situações como: após um push, pull-request, e até mesmo em um intervalo especificado. Isso era justamente o que eu precisava, e com essa feature em mãos comecei a escrever meu Javascri- calma...
...Como isso é um guia, melhor eu documentar como fiz e como você também pode fazer e utilizar de diversas maneiras como quiser. Então vamos começar pelo começo:
1. Criando uma base
Gerar um markdown direto do Javascript não é tão prático assim, pois para visualizar você precisaria executar o Javascript, e repetir isso para cada mudança definitivamente não é viável a longo prazo (vamos ignorar o nodemon). Por isso eu recomendo criar um arquivo base em markdown, e modificá-lo usando Javascript, ao invés de gerá-lo por completo.
Como exemplo, vou criar um novo repositório no GitHub e disponibilizarei ao final do blog. Então vamos começar por essa base em markdown (que nomeei como "readme_base"), definindo nela as informações que serão fixas, e quais serão geradas:
# %{titulo}
Eu coloquei o titulo dentro de `%{}` apenas para evitar que
haja alguma ambiguidade com textos comuns.
Todas as partes desta base podem ser manipuladas e modificadas,
por exemplo aqui eu irei inserir uma lista de nomes:
%{listaDeNomes}}
2. Modificando a base
Para testamos se está tudo funcionando, vamos criar um arquivo em Javascript, no qual nomearei como "index.js", para modificar a base:
/* o fs é quem irá ler o arquivo e gerar um novo,
ele vem por padrão no node, então não se preocupe */
const fs = require('fs')
// esta parte lê o arquivo "README_BASE"
fs.readFile('README_BASE.md', 'utf-8', (err, data) => {
if (err) {
throw err;
}
/* aqui é onde acontecem as substituições, por exemplo
substituindo %{titulo} por "Dynamic Readme" */
const substituicoes = {
titulo: 'Dynamic Readme',
listaDeNomes: `- Carlos\n- Ana\n- Sérgio`
}
/* aqui é o que verifica e executa as substituições, um
regex bem simples com object literals, não precisa mexer aqui */
const modificado = data
.replace(
/%{.*}/gm,
e => substituicoes?.[e.slice(2, -1)] || e
)
/* após ter feito as mudanças ele cria um arquivo
chamado "README.md" com a nova versão */
fs.writeFile('README.md', modificado, 'utf-8', (err) => {
if (err) {
throw err;
}
console.log('✔ Processo finalizado!');
});
});
Este código será executado via node, então sinta-se livre para adicionar o que quiser, sejam pacotes, requisições em apis, gerar imagens, está em suas mãos.
3. Automatizando o processo
"Mas isso apenas gerou o arquivo pois fui eu quem iniciou o javascript, então para executar esse processo automaticamente eu precisaria de um host?"
Felizmente não, pois no caso do GitHub ele disponibiliza o github actions no qual eu havia falado. Ela permite que o processo rode em diversas circunstâncias, e no caso deste exemplo usarei o schedule
que permite que o código seja executado a cada intervalo especificado.
Para isso iremos criar uma pasta chamada .github
, e dentro dela uma outra chamada workflows
, com um arquivo main.yaml
.
Resumindo: .github/workflows/main.yaml
.
No arquivo main.yaml é onde diremos ao github quando, como e o quê rodar.
# Nome do processo
name: Update automático
on:
schedule:
# cron é o "intervalo" de execução, recomendo usar
# o site crontab.guru para lhe ajudar a definir.
# nesse caso aqui, ele irá rodar a cada 10 minutos.
- cron: '*/10 * * * *'
# Aqui vem os passos que a ação segue
jobs:
build:
# Inicia uma máquina virtual ubuntu
runs-on: ubuntu-latest
# Checa o código atual do repositório
steps:
- name: Checkout repo
uses: actions/checkout@v2
# Instala o node na versão 16.10
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: 16.10
- run: npm install
- run: npm run build --if-present
env:
CI: true
# Aqui em index.js você insere
# o nome do seu arquivo javascript
- name: Roda o arquivo
run: |-
node index.js
cat README.md
# E no final commita e faz um push caso haja alguma diferença
# comparada ao código atual do repositório
- name: Commit e push
run: |-
git diff
git config --global user.email "bot-readme@example.com"
git config --global user.name "bot automático"
git add -A
git commit -m "Arquivo atualizado!" || exit 0
git push
Com isso feito, sua pasta/repositório deve estar mais ou menos assim:
> .github
> workflows
> main.yaml
> index.js
> readme_base.md
> README.md (gerado)
Se estiver assim, perfeito, tá tudo certo. Casos os nomes estejam diferentes ou não tenha gerado o README ainda, tá tudo bem também.
Mas só avisando que caso você mande tudo pro GitHub, e em 10 minutos seu repositório não atualize, calma. O GitHub Actions nem sempre é imediato, algumas vezes leva mais tempo do que o especificado. Por exemplo no meu teste desse repositório, apesar de eu especificar 10 minutos levou 25 😅.
Você pode acompanhar as actions por aqui, sempre que uma for executada ela irá aparecer:
E falando no repositório, aqui está o link pra ele: Dynamic Readme. Se quiser pode fazer um fork e modificar ou seguir este tutorial, como preferir.
4. O final
Opa! Gostou do blog? É o meu primeiro, mas tentei deixar ele completo e simples de se entender, espero ter conseguido ^^.
E não pensa que dá pra fazer só essas coisinhas de trocar texto por texto não! No meu readme eu fiz uma seção que atualiza mostrando minhas atividades mais recentes, e até gera uma imagem utilizando a api do github para pegar um seguidor aleatório meu!
Tô ansioso pra ver o que vocês também conseguem criar.
Me marca no Twitter caso faça algo bacana com isso. 'Inté!
Top comments (0)