Une horloge dans la main de quelqu'un

Planifier les builds sur Netlify

La planification des tâches est un besoin courant dans le développement de logiciels. Avec mes blogs générés par Hugo, j'avais besoin d'une telle tâche pour automatiser le flux de publication de mes articles.

Pourquoi planifier les builds

En utilisant Hugo comme un SSG (Static Site Generator), vous pouvez écrire un article et fixer la date de publication dans le futur.

Cependant, en raison du fonctionnement des SSG, vous avez besoin d’un build pour publier l’article à la date choisie.

Je pouvais facilement déclencher un build manuellement à partir du tableau de bord de Netlify, mais ne serait-il pas préférable qu’un processus automatisé s’en charge ? Comment faites-vous pour automatiser un build ?

Grâce à Talves sur ce fil de discussion qui m’a orienté vers ce guide (même si la solution est un peu obsolète), j’ai réussi à trouver la solution à partir de ce point de départ.

Les étapes

Sur le tableau de bord de Netlify

  • Créer un build hook à partir de https://app.netlify.com/sites/<votre-nom-de-site>/configuration/deploys

    • Sélectionnez votre site.
    • Ensuite, allez dans la lame Deploys dans le menu principal.
    • Ensuite, sélectionnez Deploy settings.
    • Par défaut, vous êtes dans l’écran approprié (Build & deploy > continuous deployment). Là, faites défiler vers le bas Build hooks.
    • Cliquez sur Add build book.
    • Donnez un nom à votre hook comme Daily publish et sélectionnez la branche que vous voulez cibler.

    Ajouter un hook de “build”

    • Cliquez sur Save et copiez l’URL.
  • Ensuite, rendez-vous dans Environment variables, qui se trouve un peu plus bas dans ce menu secondaire.

    Emplacement du menu “Environment variables”

  • Ajoutez une nouvelle variable d’environnement que vous appellerez RECURRING_PUBLISH et collez l’URL copiée comme valeur.

Si vous nommez la variable différemment, veuillez ajuster le script de la fonction.

Dans votre IDE avec un clone de votre dépôt

  • Installez Netlify CLI en tant que dépendance de développement sur votre dépôt :

    1
    
    npm i -D netlify-cli*
    
  • Installez le paquet @netlify/functions pour que Netlify sache comment exécuter votre fonction, en particulier la partie planification :

    1
    
    npm i @netlify/functions\*
    
  • Ajoutez un script npm pour pouvoir lancer la CLI pour créer la fonction :

    1
    
    "netlify" : "netlify"
    
  • Créer une fonction en utilisant la Netilfy CLI :

    1
    
    npm run netlify functions:create recurring_publish\*
    
  • Ajoutez l’endroit où vous stockez les fonctions dans le fichier netlify.toml :

    1
    2
    3
    4
    
    [build]
    ignore = "exit 1"
    publish = "public"
    functions = "functions" #la fonction a été créée dans le répertoire 'functions' à la racine de votre référentiel.
    
  • Utilisez ce code pour la fonction (je l’ai fortement commenté) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
 * Import the schedule function to use cron expression
 * for recurring functions.
 */
import { schedule } from "@netlify/functions";
import { log } from "console";
log("RECURRING_PUBLISH>Starting registering recurring-publish function...");
/**
 *
 * @param {Object} event The event sent by Netlify CD to the function.
 * @returns
 */
const handler = async (event) => {
  log("RECURRING_PUBLISH>Starting function");
  log("RECURRING_PUBLISH>event", event);
  /**
   * Environment variables are retrieved via process.env
   * but not the global object `Netlify.env` as some docs
   * suggests.
   * Or it requires a certain package. The said-
   * docs don't mention it.
   *
   * @see https://docs.netlify.com/functions/get-started/?fn-language=ts#environment-variables
   *
   * For setting Environment Variable, go to your app deploy settings and select the "Environment Variables" blade.
   *
   * @see https://docs.netlify.com/configure-builds/environment-variables/
   */
  let RECURRING_BUILD_HOOK = process.env.RECURRING_BUILD_HOOK;
  log(
    "RECURRING_PUBLISH>Got RECURRING_BUILD_HOOK variable =>",
    RECURRING_BUILD_HOOK
  );
  log("RECURRING_PUBLISH>Fetching as POST the RECURRING_BUILD_HOOK...");
  /**
   * Note: because functions use the standard Fetch API,
   * which was only added natively to Node.js in version
   * 18.0.0, no need for other libraries...
   *
   * As of March 25th 2024, it should be fine.
   * @see https://docs.netlify.com/functions/get-started/?fn-language=ts#runtime
   */
  try {
    await fetch(RECURRING_BUILD_HOOK, { method: "POST" });
    log("RECURRING_PUBLISH>Build hook fetch success!");
    return {
      statusCode: 200,
      body: JSON.stringify({ message: `Build triggered successfully.` }),
    };
  } catch (error) {
    log("RECURRING_PUBLISH>Build hook fetch error!");
    return { statusCode: 500, body: error.toString() };
  }
};

/**
 * This was my attempt to use an environment variable to configure the cron.
 * But Netlify build agent tells me it is not possible...
 * Though the logs show the variable is read...
 */
let RECURRING_PUBLISH_CRON = process.env.RECURRING_PUBLISH_CRON;
log(
  "RECURRING_PUBLISH>Got RECURRING_PUBLISH_CRON variable =>",
  RECURRING_PUBLISH_CRON
);
//module.exports.handler = schedule(RECURRING_PUBLISH_CRON, handler);
//module.exports.handler = schedule("*/5 * * * *", handler);//every 5 min
module.exports.handler = schedule("0 4 * * *", handler); //every day at 4am GMT
log("RECURRING_PUBLISH>Done registering");
  • Pousser le tout pour un nouveau build.

Retour sur le tableau de bord Netlify

A la fin du build, vérifiez la lame Logs > Functions sous votre application :

Exemple sur mon site français

La fonction recurring_publish devrait apparaître et vous dire qu’elle s’exécutera au prochain cron paramétré dans la fonction, dans l’exemple à 4:00 GMT.

NB : vous ne pouvez pas utiliser une variable d’environnement pour définir la valeur de cron car Netlify vous le dira :

1
2
3
9:25:40 AM:   Unable to find cron expression for scheduled function.
              The cron expression (first argument) for the `schedule` helper needs to be
              accessible inside the file and cannot be imported.

Cette procédure fonctionne le 8 avril 2024.

Comme je l’utilise pour mes deux blogs, si elle nécessite des ajustements, je mettrai à jour cet article en conséquence.

Merci d’avoir lu jusqu’ici et profitez de vos builds planifiés sur Netlify.

Crédit : photo d’entête par Lukas Blazek sur Unsplash.