<!--
  canonical-url: https://www.avonture.be/fr/blog/github-profile-last-blogposts
  published:     2026-02-09
  This is a static plain-Markdown mirror generated at build time.
  Visit the canonical URL above for the fully rendered page, with images and interactive components.
-->

# Automatisez votre README GitHub avec vos derniers articles de blog

> Gardez le README de votre profil GitHub à jour avec vos derniers articles de blog grâce aux GitHub Actions. Découvrez comment mettre en place un workflow planifié qui récupère votre flux RSS et met à jour votre README automatiquement chaque semaine.

---
![Automatisez votre README GitHub avec vos derniers articles de blog](/img/v2/github_profile_automate.webp)

**TL;DR**

Cet article explique comment utiliser la GitHub Action `gautamkrishnar/blog-post-workflow` pour mettre à jour automatiquement un README de profil avec les derniers articles d'un flux RSS. Le principe : créer un fichier de workflow YAML planifié via un cron et ajouter des tags en commentaire dans le fichier README.md pour marquer l'endroit où la liste dynamique des articles doit être injectée.

J'ai récemment découvert la GitHub Action `gautamkrishnar/blog-post-workflow` et je me suis dit : *voilà de quoi garder le README de mon profil à jour automatiquement*.

Comme j'avais déjà refactorisé le [flux RSS](https://www.avonture.be/blog/rss.xml) de mon Docusaurus (voir [Best Practice - Customizing the Docusaurus RSS Feed for Full Content & Images](/blog/blog-post-feed)), c'est parfait pour automatiser l'affichage des dix derniers articles sur mon profil GitHub.

*C'est la deuxième GitHub Action qui tourne sur ce blog ; la première, décrite dans [GitHub - Use Actions to deploy this blog](/blog/github-action), publie le site lui-même.*

Ajoutons une GitHub Action planifiée (par exemple, chaque lundi) pour mettre à jour automatiquement mon repo [cavo789](https://github.com/cavo789/cavo789).

## Le résultat {#the-result}

Ce n'est pas une maquette — c'est la sortie réelle du workflow, récupérée directement depuis le README de [cavo789/cavo789](https://github.com/cavo789/cavo789) tel qu'il est aujourd'hui :

```html
<!-- BLOG-POST-LIST:START --><tr><td>Adding Reader Reactions to Your Docusaurus Blog</td><td>https://www.avonture.be/blog/docusaurus-reactions</td></tr><tr><td>AI-Powered Code Tooltips in Docusaurus — Explain Like I'm Five</td><td>https://www.avonture.be/blog/docusaurus-eli5-snippet-tooltips</td></tr><tr><td>Meerkat Mischief: Sprinkling Easter Eggs Across my Blog</td><td>https://www.avonture.be/blog/docusaurus-easter-eggs</td></tr><tr><td>ripgrep — The Search Tool That Changed My WSL2 Workflow</td><td>https://www.avonture.be/blog/ripgrep</td></tr><tr><td>git worktree: Work on Two Branches at the Same Time</td><td>https://www.avonture.be/blog/git-worktree</td></tr><!-- ... 5 more rows ... --><!-- BLOG-POST-LIST:END -->
```

Neuf vrais articles, injectés automatiquement entre les deux tags en commentaire — exactement le template `<tr><td>$title</td><td>$url</td></tr>` du workflow ci-dessous, alimenté par le flux RSS en direct, sans aucune modification manuelle.

## Créer le fichier YAML du workflow {#create-the-workflow-yaml-file}

Pour que les choses soient claires :

* Une fois par semaine, je veux que le fichier `README.md` de mon repo [cavo789](https://github.com/cavo789/cavo789) soit mis à jour automatiquement.
* Le contenu du chapitre `My last published articles on my blog` sera réécrit et la liste des articles viendra de mon fichier [blog/rss.xml](https://www.avonture.be/blog/rss.xml).

Commençons par cloner le repository.

Dans mon cas, je clone donc mon repo [cavo789](https://github.com/cavo789/cavo789) sur mon disque puis je lance VSCode pour l'éditer.

Je dois créer une GitHub Action (je dois donc créer le dossier `.github/workflows` s'il n'existe pas encore).

Et dans ce dossier, je vais créer un nouveau fichier YAML, appelons-le `blog-post-workflow.yml` :

**.github/workflows/blog-post-workflow\.yml**

```yaml
name: Latest blog post workflow
on:
  schedule: # Run workflow automatically (in a cron)
    - cron: "0 12 * * 1" # Runs every Monday at 12:00 UTC
  workflow_dispatch: # This will allow to run the workflow manually too

permissions:
  contents: write # To write the generated contents to the readme

concurrency:
  group: blog-post-readme
  cancel-in-progress: true

jobs:
  update-readme-with-blog:
    # A profile README lives in the repository named after its owner
    # (cavo789/cavo789): anywhere else, there is no README to update.
    if: github.repository == format('{0}/{0}', github.repository_owner)
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      # Both actions are pinned to a commit SHA rather than a tag. That matters
      # most in this workflow: it is the only one holding `contents: write`, so
      # whoever controls the code behind these references can commit to the
      # repository. A tag can be repointed at new code at any time; a SHA cannot.
      - name: Checkout Repository
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

      - name: Fetch and Update README
        # v1 is an annotated tag; this is the commit it dereferences to.
        uses: gautamkrishnar/blog-post-workflow@f177491c77670f150ab4e9b9890254d8eba4164b # v1
        with:
          feed_list: "https://www.avonture.be/blog/rss.xml"
          max_post_count: 10
          comment_tag_name: "BLOG-POST-LIST"
          date_format: "yyyy-mm-dd"
          template: "<tr><td>$title</td><td>$url</td></tr>"
          commit_message: "feat: Update README with latest blog posts"
```

### Explications pas à pas {#step-by-step-explanations}

#### Le bloc d'introduction {#the-introduction-block}

Rien de compliqué ici, ce sera le nom de notre action.

```yaml
name: Latest blog post workflow
```

Ici, on indique à GitHub de lancer notre workflow via un cron, c'est-à-dire automatiquement selon une planification précise.
Dans l'exemple ci-dessous, chaque lundi à 12:00 UTC.

```yaml
on:
  schedule:              # Run workflow automatically (in a cron)
    - cron: '0 12 * * 1' # Runs every Monday at 12:00 UTC
  workflow_dispatch:     # This will allow to run the workflow manually too
```

mais nous voulons aussi pouvoir démarrer le workflow manuellement. Pour cela, ouvrez simplement votre repo dans un navigateur, cliquez sur le bouton `Actions` et, dans la barre latérale de gauche, vous verrez l'action (`Latest blog post workflow` dans notre exemple) et vous trouverez le bouton `Run workflow` quelque part dans la partie droite de l'écran.

Nous devons aussi autoriser l'action à écrire des fichiers (puisque nous allons mettre à jour le fichier `README.md`).

```yaml
permissions:
  contents: write       # To write the generated contents to the readme
```

#### Le bloc jobs {#the-jobs-block}

Nous devons prévoir deux étapes ; la première pour cloner le repo et la seconde pour faire le vrai travail.

La première étape, c'est comme sur votre machine : il faut faire un `git clone` du repo avant de pouvoir le mettre à jour.

La seconde étape est prise en charge par l'action `gautamkrishnar/blog-post-workflow@v1`.

```yaml
jobs:
  update-readme-with-blog:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Fetch and Update README
        uses: gautamkrishnar/blog-post-workflow@v1
        with:
          feed_list: 'https://www.avonture.be/blog/rss.xml'
          max_post_count: 10
          comment_tag_name: 'BLOG-POST-LIST'
          date_format: 'yyyy-mm-dd'
          template: "<tr><td>$title</td><td>$url</td></tr>"
          commit_message: 'feat: Update README with latest blog posts'
```

Vous trouverez une documentation détaillée sur son site officiel : <https://github.com/marketplace/actions/blog-post-workflow> mais, en résumé :

* `feed_list` est le flux RSS source à interroger pour récupérer les articles
* `max_post_count` est le nombre maximum d'articles à récupérer et à injecter dans votre fichier `README.md`
* `comment_tag_name` est le bloc en commentaire à remplacer (nous verrons cela plus bas)
* `date_format` pour être sûr, si vous affichez des dates dans votre contenu, qu'elles utilisent le format souhaité
* `template` est un ... template (HTML dans mon cas) qui sera utilisé pour chaque entrée du résultat (donc si vous récupérez 10 articles, vous obtiendrez une chaîne contenant dix fois votre template) et
* `commit_message` sera utilisé par l'action `gautamkrishnar/blog-post-workflow` pour pousser les changements vers votre repo.

## Mettre à jour le fichier README.md {#updating-the-readmemd-file}

Nous avons vu que, dans notre étape, nous avons demandé à `gautamkrishnar/blog-post-workflow` de chercher un tag en commentaire appelé `BLOG-POST-LIST`.

Voyons maintenant comment l'utiliser :

**README.md**

```markdown
<!-- markdownlint-disable MD033 -->

# Hi there 👋

Get the full list of my repositories on [https://www.avonture.be/repositories](https://www.avonture.be/repositories)

![Stats](https://github-readme-stats.vercel.app/api?username=cavo789&show_icons=true&theme=radical&count_private=true)

![Most used languages](https://github-readme-stats.vercel.app/api/top-langs/?username=cavo789)

## My last published articles on my blog

I'm publishing at least one article by week on my [blog](https://www.avonture.be). Below the last nine ones:

<table>
  <tr><th>Title</th><th>Link</th></tr>
  <!-- BLOG-POST-LIST:START --><!-- BLOG-POST-LIST:END -->
</table>
```

Comme vous le voyez, il y a un bloc `<!-- BLOG-POST-LIST:START -->` et `<!-- BLOG-POST-LIST:END -->` dans mon fichier — les deux mêmes tags entre lesquels la sortie réelle montrée en début d'article a été injectée.

Et maintenant, plus vraiment un secret : la GitHub Action va donc générer une chaîne HTML avec mes 10 articles, l'injecter dans mon fichier en remplaçant le contenu entre les deux tags en commentaire et pousser le changement vers GitHub.

Désormais, chaque lundi, mon repo sera mis à jour automatiquement.

Facile, non ?
