Como escritor, entendo a importância da consistência quando se trata de publicar novos conteúdos. No entanto, há momentos em que a vida atrapalha e pode ser um desafio lembrar de escrever uma nova postagem no blog. Para me ajudar a acompanhar minha agenda de compartilhamento, criei um lembrete simples usando o GitHub Actions. Neste post, vou compartilhar como fiz esse fluxo de trabalho.
O GitHub Actions é uma ferramenta poderosa que permite automatizar seus fluxos de trabalho. Você pode usá-lo para criar, testar e implantar seu código. Você também pode usá-lo para realizar uma ampla gama de outras tarefas, como enviar notificações ou agendar lembretes.
Para criar um lembrete para escrever uma postagem no blog, estou usando o repositório especial GitHub de README.md e adicionei um arquivo chamado .github/workflows/blog-posts.yml. Neste arquivo, defini o fluxo de trabalho que o GitHub Actions executaria. Aqui está o conteúdo inicial do arquivo:
name: Blog Posts on: schedule: - cron: '0 0 * * 0' # Run at 00:00 every Sunday workflow_dispatch: jobs: update-posts: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Update post list run: | sleep 1m curl -LO https://blog.imam.dev/feed.xml node src/list-posts.js rm feed.xml - name: Commit changes run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git add -A git diff-index --quiet HEAD || git commit -m "Update blog posts" - name: Pull changes run: git pull -r - name: Push changes uses: ad-m/github-push-action@0fafdd62b84042d49ec0cb92d9cac7f7ce4ec79e with: github_token: ${{ secrets.GITHUB_TOKEN }}
Este fluxo de trabalho é acionado todos os domingos às 00:00. Em seguida, ele executa um script que atualiza a lista de postagens do blog. O script é escrito em JavaScript e usa o pacote feed para analisar o feed RSS do meu blog. Em seguida, ele gera uma lista de postagens de blog e atualiza o arquivo README.md. Por fim, ele confirma as alterações e as envia para o GitHub. Estou usando o repositório de ouuan como referência para este fluxo de trabalho.
De onde veio o lembrete? Na verdade, está no arquivo list-posts.js. Adicionei um lembrete à lista de postagens do blog. Aqui está o conteúdo do arquivo:
const { readFileSync, writeFileSync } = require('fs') /** * Convert XML string to JSON * @param {string} xmlString * @returns {object} json */ const xmlToJson = (xmlString) => { const regex = /<(\w+)([^>]*)>([\s\S]*?)<\/\1>/gm const matches = xmlString.matchAll(regex) const json = {} for (const match of matches) { const [, key, attributes, value] = match const subMatches = value.matchAll(regex) const subJson = {} for (const subMatch of subMatches) { const [, subKey, subAttributes, subValue] = subMatch if (subValue.match(regex)) { if (Array.isArray(subJson[subKey])) { subJson[subKey].push( xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey] ) } else if (subJson[subKey]) { subJson[subKey] = [ subJson[subKey], xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey], ] } else { subJson[subKey] = xmlToJson(`<${subKey}${subAttributes}>${subValue}</${subKey}>`)[subKey] } } else if (Array.isArray(subJson[subKey])) { subJson[subKey].push(subValue) } else if (subJson[subKey]) { subJson[subKey] = [subJson[subKey], subValue] } else { subJson[subKey] = subValue } } if (json[key]) { if (Array.isArray(json[key])) { json[key].push(subJson) } else { json[key] = [json[key], subJson] } } else { json[key] = subJson } } return json } /** * Sort JSON by pubDate * @param {object} json * @returns {object} sortedJson */ const sortJson = (json) => { json.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate)) return json } // Read XML file and convert to JSON const xmlString = readFileSync('feed.xml', 'utf8') const feeds = sortJson(xmlToJson(xmlString).rss.channel.item) // Create Markdown list of posts const posts = feeds .slice(0, 5) .map( (item) => `- ${new Date(item.pubDate).toISOString().split('T')[0]} [${item.title}](${ item.link }?utm_source=GitHubProfile)` ) // Update README.md if posts have changed, // otherwise throw an error to remind me to write a blog post const readme = readFileSync('README.md', 'utf8') if (readme.includes(posts.join('\n'))) { throw new Error('No new blog posts') } else { const updatedReadme = readFileSync('README.md', 'utf8').replace( /(?<=<!--START_SECTION:blog-posts-->\n)[\s\S]*(?=\n<!--END_SECTION:blog-posts-->)/, posts.join('\n') ) writeFileSync('README.md', updatedReadme) console.log('Updated README.md') }
O script lê o feed RSS do meu blog e gera uma lista de posts do blog. Em seguida, ele atualiza o arquivo README.md com a lista de postagens do blog. Se não houver novas postagens no blog, será gerado um erro para me lembrar de escrever uma postagem no blog.
É apenas um erro que será lançado quando o script for executado enquanto as postagens ainda estiverem as mesmas e não é um lembrete que será enviado para meu e-mail ou algo que seja mais visível para mim. Portanto, decidi habilitar a notificação para qualquer execução de fluxo de trabalho com falha.
Veja como fazer:
Agora, receberei uma notificação quando o script for executado e não houver novas postagens no blog. Também posso ver a notificação no site do GitHub.
O fluxo de trabalho anterior que eu conto é uma versão modificada para que meu README.md esteja sempre atualizado. Também explorei outra maneira de criar um lembrete para escrever uma postagem no blog. Mas, é um lembrete puro sem qualquer mecanismo de atualização README.md, apenas um lembrete.
Para criar um lembrete para escrever uma postagem no blog, criei um novo repositório GitHub e adicionei um arquivo chamado .github/workflows/remind.yml
. Neste arquivo, defini o fluxo de trabalho que o GitHub Actions executaria. Aqui está o conteúdo do arquivo:
name: Reminder to write a blog post on: schedule: - cron: '0 10 * * 1-5' jobs: remind: runs-on: ubuntu-latest steps: - name: Send a reminder uses: dawidd6/[email protected] with: server_address: smtp.gmail.com server_port: 465 username: ${{ secrets.EMAIL_USERNAME }} password: ${{ secrets.EMAIL_PASSWORD }} subject: 'Reminder to write a new blog post' body: "Don't forget to write a new blog post today!" to: [email protected]
Esse fluxo de trabalho me envia um lembrete por e-mail todos os dias da semana às 10h, lembrando-me de escrever uma nova postagem no blog. Usei uma ação de terceiros, dawidd6/action-send-mail, para enviar o e-mail. Forneci minhas credenciais de e-mail como segredos do GitHub, para que não fiquem visíveis no arquivo de fluxo de trabalho.
Eu explorei duas maneiras de criar um lembrete para escrever uma postagem no blog. A primeira maneira é atualizar o arquivo README.md do meu perfil do GitHub. A segunda maneira é enviar um lembrete por e-mail. Atualmente estou usando a primeira forma porque é mais visível do que a segunda. Posso ver o lembrete sempre que visito meu perfil do GitHub.
Criar um lembrete para escrever uma postagem de blog usando o GitHub Actions é uma maneira simples e eficaz de manter o controle de sua agenda de blogs. Com esse fluxo de trabalho implementado, você nunca mais se esquecerá de escrever uma nova postagem. Se você estiver interessado em criar seu próprio fluxo de trabalho de lembrete, verifique a documentação do GitHub Actions para saber mais. Feliz blogging!