En tant qu'écrivain, je comprends l'importance de la cohérence lorsqu'il s'agit de publier de nouveaux contenus. Cependant, il y a des moments où la vie se met en travers, et il peut être difficile de se rappeler d'écrire un nouveau billet de blog. Pour m'aider à rester sur la bonne voie avec mon calendrier de partage, j'ai créé un simple rappel à l'aide de GitHub Actions. Dans cet article, je vais partager comment j'ai créé ce flux de travail.
GitHub Actions est un outil puissant qui vous permet d'automatiser vos workflows. Vous pouvez l'utiliser pour créer, tester et déployer votre code. Vous pouvez également l'utiliser pour effectuer un large éventail d'autres tâches, telles que l'envoi de notifications ou la planification de rappels.
Pour créer un rappel pour écrire un article de blog, j'utilise le référentiel spécial GitHub de README.md et j'ai ajouté un fichier nommé .github/workflows/blog-posts.yml. Dans ce fichier, j'ai défini le flux de travail que GitHub Actions exécuterait. Voici le contenu initial du fichier :
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 }}
Ce workflow est déclenché tous les dimanches à 00:00. Il exécute ensuite un script qui met à jour la liste des articles de blog. Le script est écrit en JavaScript et utilise le package de flux pour analyser le flux RSS de mon blog. Il génère ensuite une liste d'articles de blog et met à jour le fichier README.md. Enfin, il valide les modifications et les envoie à GitHub. J'utilise le référentiel de ouuan comme référence pour ce flux de travail.
D'où vient le rappel ? C'est en fait dans le fichier list-posts.js. J'ai ajouté un rappel à la liste des articles du blog. Voici le contenu du fichier :
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') }
Le script lit le flux RSS de mon blog et génère une liste d'articles de blog. Il met ensuite à jour le fichier README.md avec la liste des articles de blog. S'il n'y a pas de nouveaux articles de blog, cela génère une erreur pour me rappeler d'écrire un article de blog.
C'est juste une erreur qui sera lancée lors de l'exécution du script alors que les messages sont toujours les mêmes et ce n'est pas un rappel qui sera envoyé à mon e-mail ou quelque chose de plus visible pour moi. J'ai donc décidé d'activer la notification pour toute exécution de workflow ayant échoué.
Voici comment procéder :
Maintenant, je reçois une notification lorsque le script est exécuté et qu'il n'y a pas de nouveaux articles de blog. Je peux également voir la notification sur le site Web GitHub.
Le workflow précédent que je vous dis est une version modifiée donc mon README.md est toujours à jour. J'ai également exploré une autre façon de créer un rappel pour écrire un article de blog. Mais, c'est un pur rappel sans aucun mécanisme de mise à jour README.md, juste un rappel.
Pour créer un rappel pour écrire un article de blog, j'ai créé un nouveau référentiel GitHub et ajouté un fichier nommé .github/workflows/remind.yml
. Dans ce fichier, j'ai défini le flux de travail que GitHub Actions exécuterait. Voici le contenu du fichier :
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]
Ce flux de travail m'envoie un rappel par e-mail tous les jours de la semaine à 10h00, me rappelant d'écrire un nouveau billet de blog. J'ai utilisé une action tierce, dawidd6/action-send-mail, pour envoyer l'e-mail. J'ai fourni mes identifiants de messagerie en tant que secrets GitHub, ils ne sont donc pas visibles dans le fichier de workflow.
J'ai exploré deux façons de créer un rappel pour écrire un article de blog. La première façon est de mettre à jour le fichier README.md de mon profil GitHub. La deuxième méthode consiste à envoyer un rappel par e-mail. J'utilise actuellement la première méthode car elle est plus visible que la seconde. Je peux voir le rappel chaque fois que je visite mon profil GitHub.
Créer un rappel pour écrire un article de blog à l'aide de GitHub Actions est un moyen simple et efficace de rester sur la bonne voie avec votre calendrier de blogs. Avec ce flux de travail en place, vous n'oublierez plus jamais d'écrire un nouveau message. Si vous souhaitez créer votre propre flux de travail de rappel, assurez-vous de consulter la documentation GitHub Actions pour en savoir plus. Bon blog !