# ChatGPT 🤖 écris-moi un github action

Hello cher lecteur, ravi de vous retrouver, je ne peux démarrer l'année sans vous parlez de **ChatGPT**, phénomène de mode ou véritable révolution ? En-tout-cas, j'ai une recommandation à vous faire.

> 🏃🏾‍♀️Aller crée votre compte si vous ne l'avez pas encore fait.

## Préparer votre première question :

Comme tout programme informatique **chatGPT** à besoin d'être initialisé ou configuré pour être performant dans le domaine choisie. Votre première question a pour rôle de le préparer, voici comment bien écrire votre première question.

### 1⃣ Choisir le thème

Dans notre cas, nous allons lui demander de construire un **github** **action**, ce qui limite déjà nos possibilités de réponse.

### 2⃣ Définir les tâches

Maintenant, qu'a un domaine d'application, nous allons expliquer nos besoins à **chatGPT** en précisant les tâches que notre **github** **action** devras exécuter, il est important.

* De vous exprimer en une seule langue (français ou anglais ou autre)
    
* D'utiliser des mots simples
    
* De détailler chacune des tâches
    
* D'éviter les jargons
    

**Voici ma première question :**

> Je voudrais un github action pour contrôler le statut http de mes sites et voir s'ils sont au code 200 sinon ouvrir un issues

## 🤖 Première réponse de chatGPT

*Bien sûr, voici un exemple de fichier YAML pour une action GitHub qui effectue une vérification de statut HTTP sur une liste de sites web, crée une issue pour ceux qui ont une erreur de statut, et commente sur l'issue en cas de changement de statut :*

```yaml
name: Check Website Status

on:
  schedule:
    - cron: '0 * * * *'  # Vérifie toutes les heures

jobs:
  check_status:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Install Dependencies
        run: npm install

      - name: Check status
        run: node checkStatus.js

      - name: Create issue
        if: steps.check_status.outputs.failed_sites
        uses: peter-evans/create-issue-from-file@v2
        with:
          title: Website status check failed
          content-filepath: ./issue-body.md
          labels: website, status check
```

*Ce workflow utilise le planificateur cron pour vérifier l'état des sites web toutes les heures. Il utilise également l'action* `peter-evans/create-issue-from-file` *pour créer une issue si un site a une erreur de statut.*

*Vous devrez également créer un fichier* `checkStatus.js` *qui contient la logique de vérification des statuts de site. Voici un exemple de fichier* `checkStatus.js` *:*

```javascript
const https = require('https');

const sites = [
  'https://example.com',
  'https://example.org',
  'https://example.net'
];

let failedSites = [];

sites.forEach(site => {
  https.get(site, (res) => {
    if (res.statusCode !== 200) {
      failedSites.push(site);
      console.error(`Site ${site} failed with status code ${res.statusCode}`);
    }
  }).on('error', (e) => {
    failedSites.push(site);
    console.error(`Site ${site} failed with error: ${e.message}`);
  });
});

if (failedSites.length > 0) {
  console.log(`The following sites failed: ${failedSites.join(', ')}`);
  const output = {
    failed_sites: failedSites.join('\n')
  };
  console.log(JSON.stringify(output));
} else {
  console.log('All sites passed');
}
```

*Ce fichier vérifie les statuts de site en utilisant le module Node.js* `https`*. Les sites à vérifier sont stockés dans un tableau* `sites`*. Si un site a une erreur de statut, il est ajouté à un tableau* `failedSites`*. À la fin de la vérification, si des sites ont échoué, la sortie de l'action est configurée pour inclure ces sites.*

*Vous devrez également créer un fichier* [`issue-body.md`](http://issue-body.md) *qui contient le contenu de l'issue à créer. Voici un exemple de fichier* [`issue-body.md`](http://issue-body.md) *:*

```bash
## Sites with failed status check

The following sites failed the status check:

{{ failed_sites }}
```

*Ce fichier est utilisé par l'action* `peter-evans/create-issue-from-file` *pour créer le contenu de l'issue. Le texte* `{{ failed_sites }}` *est remplacé par la liste des sites qui ont échoué la vérification de statut.*

## Conversation avec chatGPT

Et voilà 🎉, un bon début pour notre prototype.

> 🚨Mais attention pour continuer le travail une compréhension minimum du fonctionnement des **github actions** est nécessaire pour vérifier, décrypter et améliorer cette réponse. Si votre niveau de compréhension de github action est de zéro, je vous recommande de commencer par l'apprendre avec **chatGPT**.

### Refactoré le code ou améliorer les réponses

Après une analyse minutieuse du code, je voudrais maintenant apporter une amélioration. Comment faire ? En continuant la conversation avec **chatGPT** tout en demander les modifications à apporter. Prenez garde à ne demander qu'une amélioration à la fois.

**Deuxième question :**

> Dans le fichier checkStatus.js peut tu remplacer le variable sites par les données venant d'un fichier site.csv qui dans le dossier data

🤖 **Réponse :**

*Oui, bien sûr. Voici comment vous pouvez modifier le fichier* `checkStatus.js` *pour utiliser les données d'un fichier* `sites.csv` *situé dans le dossier* `data` *:*

```javascript
const https = require('https');
const fs = require('fs');
const path = require('path');
const csv = require('csv-parser');

const sites = [];

fs.createReadStream(path.join(__dirname, 'data', 'sites.csv'))
  .pipe(csv())
  .on('data', (row) => {
    sites.push(row.url);
  })
  .on('end', () => {
    console.log(`Loaded ${sites.length} sites from sites.csv`);
    checkSites(sites);
  });

function checkSites(sites) {
  let failedSites = [];

  sites.forEach(site => {
    https.get(site, (res) => {
      if (res.statusCode !== 200) {
        failedSites.push(site);
        console.error(`Site ${site} failed with status code ${res.statusCode}`);
      }
    }).on('error', (e) => {
      failedSites.push(site);
      console.error(`Site ${site} failed with error: ${e.message}`);
    });
  });

  if (failedSites.length > 0) {
    console.log(`The following sites failed: ${failedSites.join(', ')}`);
    const output = {
      failed_sites: failedSites.join('\n')
    };
    console.log(JSON.stringify(output));
  } else {
    console.log('All sites passed');
  }
}
```

*J'ai ajouté les modules* `fs`*,* `path` *et* `csv-parser` *pour lire le fichier CSV et ajouter chaque URL de site au tableau* `sites`*. Le fichier CSV doit avoir une colonne nommée* `url` *pour que cela fonctionne. J'ai également extrait la logique de vérification des sites dans une fonction séparée* `checkSites` *pour pouvoir l'appeler à partir du gestionnaire d'événements* `on('end')` *du lecteur CSV.*

*Notez également que j'ai utilisé* `__dirname` *pour obtenir le chemin absolu du dossier* `data`*, ce qui est important pour éviter les problèmes de résolution de chemin relatifs. Si le fichier CSV est dans un sous-dossier de* `data`*, vous pouvez simplement ajouter le chemin relatif au chemin absolu de* `data`*.*

## Tester le prototype

Avant d'aller plus loin, il est temps de tester notre **github action**, encore quelques questions de plus à **chatGPT** pour préparer notre repo github et le déployer.

**Troisième question :**

> Merci, peux-tu me donner la structure des fichiers et dossier à créer dans mon repo github

🤖 **Réponse :**

*Bien sûr, voici la structure de fichiers et de dossiers que vous pouvez utiliser dans votre dépôt GitHub pour implémenter la vérification de l'état HTTP des sites Web :*

```bash
.github
└── workflows
    └── check-status.yml
checkStatus.js
package.json
README.md
data
└── sites.csv
```

* *Le dossier* `.github` *contient des fichiers de configuration pour les workflows GitHub Actions. Vous pouvez le créer à la racine de votre dépôt.*
    
* *Le dossier* `workflows` *contient le fichier de workflow* `check-status.yml`*. Vous pouvez le créer à l'intérieur du dossier* `.github`*.*
    
* *Le fichier* `checkStatus.js` *contient le code pour vérifier l'état HTTP des sites Web. Vous pouvez le créer à la racine de votre dépôt.*
    
* *Le fichier* `package.json` *contient les dépendances du projet. Vous pouvez le créer à la racine de votre dépôt et y ajouter le module* `csv-parser` *en tant que dépendance.*
    
* *Le fichier* [`README.md`](http://README.md) *contient des informations sur le projet. Vous pouvez le créer à la racine de votre dépôt.*
    
* *Le dossier* `data` *contient le fichier CSV* `sites.csv` *qui contient les URL des sites Web à vérifier. Vous pouvez le créer à la racine de votre dépôt.*
    

*Assurez-vous de remplacer les URL de sites dans* `sites.csv` *par les URL des sites que vous souhaitez vérifier. Vous pouvez également personnaliser le message d'erreur ou d'alerte qui est généré en fonction de vos besoins.*

**Quatrième question :**

> Super pour finir, donne-moi le fichier [README.MD](http://README.MD) et package.json ajoute comme auteur mon nom.

🤖 **Réponse :**

*Voici le contenu du fichier* [`README.md`](http://README.md) *:*

```markdown
# Vérification de l'état HTTP des sites Web

Ce projet est un exemple de vérification de l'état HTTP des sites Web à l'aide de Node.js et GitHub Actions.

## Utilisation

1. Clonez le dépôt sur votre ordinateur
2. Ajoutez les URL des sites Web à vérifier dans le fichier `data/sites.csv`
3. Exécutez `npm install` pour installer les dépendances
4. Exécutez `npm start` pour vérifier l'état HTTP des sites Web

## Auteur

Votre nom
```

*Et voici le contenu du fichier* `package.json` *avec votre nom en tant qu'auteur :*

```json
{
  "name": "check-http-status",
  "version": "1.0.0",
  "description": "Vérification de l'état HTTP des sites Web à l'aide de Node.js et GitHub Actions",
  "main": "checkStatus.js",
  "scripts": {
    "start": "node checkStatus.js"
  },
  "keywords": [
    "http",
    "status",
    "check",
    "node",
    "github",
    "actions"
  ],
  "author": "Votre nom",
  "license": "MIT",
  "dependencies": {
    "csv-parser": "^3.0.0"
  }
}
```

### Déployer le code chez github

À ce stade reste plus cas copier coller le code généré par **chatGPT** dans un dossier tout en respectant la structure des fichiers et dossiers ci-dessus.

[https://github.com/dofbi/gh-actions-check-http-status](https://github.com/dofbi/gh-actions-check-http-status)

> 💡Il serait intéressant de pouvoir installer un pluging dans **chatGPT** pour nous permettre d'ajouter des fonctionnalités, comme lancer les commandes `git commit` , `git push` depuis **chatGPT**.

## Résultats Test

[![Check Website Status](https://github.com/dofbi/gh-actions-check-http-status/actions/workflows/check-status.yml/badge.svg align="left")](https://github.com/dofbi/gh-actions-check-http-status/actions/workflows/check-status.yml)

Le **github action**, c'est bien exécuter 🎉 sans aucune erreur, pour un début ce n'est pas mal pour une intelligence artificielle surtout sur un domaine tel que les **github actions**.

À vous de jouer, n'hésitez pas à commenter et à partager vos **github actions** ici.
