Como escritor, entiendo la importancia de la consistencia cuando se trata de publicar contenido nuevo. Sin embargo, hay momentos en que la vida se interpone en el camino y puede ser un desafío recordar escribir una nueva publicación de blog. Para ayudarme a mantenerme al día con mi cronograma de uso compartido, creé un recordatorio simple usando GitHub Actions. En esta publicación, compartiré cómo hice este flujo de trabajo.
GitHub Actions es una poderosa herramienta que te permite automatizar tus flujos de trabajo. Puede usarlo para compilar, probar e implementar su código. También puede usarlo para realizar una amplia gama de otras tareas, como enviar notificaciones o programar recordatorios.
Para crear un recordatorio para escribir una publicación de blog, estoy usando el repositorio especial de GitHub de README.md y agregué un archivo llamado .github/workflows/blog-posts.yml. En este archivo, definí el flujo de trabajo que ejecutarían GitHub Actions. Aquí está el contenido inicial del archivo:
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 flujo de trabajo se activa todos los domingos a las 00:00. Luego ejecuta un script que actualiza la lista de publicaciones del blog. El script está escrito en JavaScript y utiliza el paquete de fuentes para analizar la fuente RSS de mi blog. Luego genera una lista de publicaciones de blog y actualiza el archivo README.md. Finalmente, confirma los cambios y los envía a GitHub. Estoy usando el repositorio de ouuan como referencia para este flujo de trabajo.
¿De dónde viene el recordatorio? En realidad, está en el archivo list-posts.js. Agregué un recordatorio a la lista de publicaciones del blog. Este es el contenido del archivo:
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') }
El script lee la fuente RSS de mi blog y genera una lista de publicaciones de blog. Luego actualiza el archivo README.md con la lista de publicaciones del blog. Si no hay nuevas publicaciones en el blog, arroja un error para recordarme que escriba una publicación en el blog.
Es solo un error que se lanzará cuando se ejecute el script mientras las publicaciones siguen siendo las mismas y no es un recordatorio que se enviará a mi correo electrónico o algo que sea más visible para mí. Entonces, decidí habilitar la notificación para cualquier ejecución de flujo de trabajo fallida.
Aquí está cómo hacerlo:
Ahora, recibiré una notificación cuando se ejecute el script y no haya nuevas publicaciones en el blog. También puedo ver la notificación en el sitio web de GitHub.
El flujo de trabajo anterior que les cuento es una versión modificada por lo que mi README.md siempre está actualizado. También exploré otra forma de crear un recordatorio para escribir una publicación de blog. Pero, es un recordatorio puro sin ningún mecanismo de actualización README.md, solo un recordatorio.
Para crear un recordatorio para escribir una publicación de blog, creé un nuevo repositorio de GitHub y agregué un archivo llamado .github/workflows/remind.yml
. En este archivo, definí el flujo de trabajo que ejecutarían GitHub Actions. Este es el contenido del archivo:
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]
Este flujo de trabajo me envía un recordatorio por correo electrónico todos los días de la semana a las 10:00 am, recordándome que escriba una nueva publicación de blog. Usé una acción de terceros, dawidd6/action-send-mail, para enviar el correo electrónico. Proporcioné mis credenciales de correo electrónico como secretos de GitHub, por lo que no están visibles en el archivo de flujo de trabajo.
He explorado dos formas de crear un recordatorio para escribir una publicación de blog. La primera forma es actualizar el archivo README.md de mi perfil de GitHub. La segunda forma es enviar un recordatorio por correo electrónico. Actualmente estoy usando la primera forma porque es más visible que la segunda forma. Puedo ver el recordatorio cada vez que visito mi perfil de GitHub.
Crear un recordatorio para escribir una publicación de blog usando GitHub Actions es una manera simple y efectiva de mantenerse al día con su agenda de blogs. Con este flujo de trabajo implementado, nunca más te olvidarás de escribir una nueva publicación. Si está interesado en crear su propio flujo de trabajo de recordatorios, asegúrese de consultar la documentación de GitHub Actions para obtener más información. ¡Feliz blogueo!