paint-brush
Comment automatiser le déploiement d'une application d'article de blog avec GitHub Actions, Node.js, CouchDB et Aptiblepar@wise4rmgod
3,259 lectures
3,259 lectures

Comment automatiser le déploiement d'une application d'article de blog avec GitHub Actions, Node.js, CouchDB et Aptible

par Wisdom Nwokocha19m2023/12/04
Read on Terminal Reader

Trop long; Pour lire

Bienvenue dans le guide sur l'automatisation du déploiement d'applications de publication de blog à l'aide de GitHub Actions, Node.js, CouchDB et Aptible. Ce didacticiel complet vous guidera dans la création, le déploiement et la gestion d'une application de publication de blog à l'aide des outils et technologies ci-dessus. Mais d'abord, permettez-moi de vous donner un bref aperçu de l'application Blogpost, de ce qu'elle fait et de ses principaux composants. L'application Blogpost est une application Web qui permet aux utilisateurs de créer et de partager des articles de blog. Les utilisateurs peuvent écrire, modifier, supprimer et afficher les publications d'autres utilisateurs. L'application utilise Node.js comme backend, CouchDB comme base de données et GitHub Actions comme outil d'intégration et de déploiement continu.
featured image - Comment automatiser le déploiement d'une application d'article de blog avec GitHub Actions, Node.js, CouchDB et Aptible
Wisdom Nwokocha HackerNoon profile picture

Bienvenue dans le guide sur l'automatisation du déploiement d'une application de publication de blog à l'aide de GitHub Actions, Node.js,

CouchDB et Aptible.


Ce didacticiel complet vous guidera dans la création, le déploiement et la gestion d'une application de publication de blog à l'aide des outils et technologies ci-dessus.


Mais d'abord, permettez-moi de vous donner un bref aperçu de l'application Blogpost , de ce qu'elle fait et de ses principaux composants. L'application Blogpost est une application Web qui permet aux utilisateurs de créer et de partager des articles de blog.


Les utilisateurs peuvent écrire, modifier, supprimer et afficher les publications d'autres utilisateurs. L'application utilise Node.js comme backend, CouchDB comme base de données et GitHub Actions comme outil d'intégration et de déploiement continu.


Pourquoi ai-je choisi ceux-ci ? Eh bien, il y a plusieurs raisons, mais voici quelques-unes des principales :


  • Node.js est un environnement d'exécution JavaScript rapide, évolutif et facile à utiliser qui peut s'exécuter sur diverses plates-formes. Il dispose de nombreuses bibliothèques et frameworks pour le développement Web, tels que Express, un framework d'application Web minimaliste et flexible que j'utiliserai dans ce projet.


  • CouchDB est un système de base de données NoSQL open source fiable, sécurisé et puissant. Il s'agit d'une base de données orientée document qui utilise JSON pour stocker des données.


  • GitHub Actions est un outil flexible, pratique et intégré qui vous permet d'automatiser les flux de travail pour vos référentiels GitHub. Il contient également de nombreuses actions prédéfinies que vous pouvez utiliser ou personnaliser selon vos besoins, telles que l'action Aptible Deploy, que j'utiliserai dans ce projet pour déployer l'application sur Aptible.


  • Aptible est une plate-forme basée sur le cloud pour le déploiement et la gestion d'applications conteneurisées, offrant des capacités simples de provisionnement, de mise à l'échelle et de surveillance.

Conditions préalables

Avant de se lancer dans le développement, la mise en place des outils et technologies nécessaires est essentielle.


  • Node.js : assurez-vous que Node.js est installé sur votre ordinateur.


  • CouchDB : vérifiez que CouchDB est installé et exécuté sur votre système.


  • Expertise Node.js et JavaScript : Posséder une solide compréhension des principes fondamentaux de Node.js et JavaScript.


  • Docker : installez et exécutez Docker sur votre ordinateur.


  • Compte Aptible : créez un compte Aptible et familiarisez-vous avec le déploiement d'une application de base.


  • Compte Docker Cloud : acquérez un compte Docker Cloud pour héberger vos applications.

Développement de l'application Blogpost

1 : Configurez votre projet Node.js

  • Créez un répertoire de projet pour votre application de publication de blog.


  • Initialisez un projet Node.js à l'aide de npm :
 npm init -y


  • Installez le framework Express.js, qui servira de base au backend :
 npm install express nano

Étape 2 : configurer CouchDB

  • Assurez-vous que CouchDB est installé et en cours d'exécution. Vous pouvez accéder à CouchDB via votre navigateur à l'adresse http://127.0.0.1:5984/_utils/ .


Tableau de bord CouchDB

Étape 3 : Créez votre application Node.js

  • Créez un fichier blog.js dans le répertoire de votre projet.


  • Initialisez Express et connectez-le à CouchDB :
 const express = require("express"); const nano = require("nano")("http://admin:[email protected]:5984"); const app = express(); const port = 3000; // Middleware to parse JSON data app.use(express.json()); // async function asyncCall() { // // await nano.db.destroy("alice"); // await nano.db.create("blogposts"); // const db = nano.use("blogposts"); // return response; // } // asyncCall(); const db = nano.use("blogposts");


  • Ce code définit les points de terminaison de l'API pour créer, récupérer, mettre à jour et supprimer des articles de blog à l'aide d'une base de données CouchDB.


 // Create a new blog post app.post("/posts", async (req, res) => { const { title, description, author } = req.body; try { const doc = await db.insert({ title, description, author, createdAt: new Date(), updatedAt: new Date(), }); res.json({ id: doc.id, rev: doc.rev }); } catch (err) { console.error(err); res.status(500).send("Error creating post"); } }); // Get all blog posts app.get("/posts", async (req, res) => { try { const docs = await db.list({ include_docs: true }); res.json(docs.rows); } catch (err) { console.error(err); res.status(500).send("Error retrieving posts"); } }); // Get a specific blog post app.get("/posts/:id", async (req, res) => { const { id } = req.params; try { const doc = await db.get(id); res.json(doc); } catch (err) { console.error(err); res.status(404).send("Post not found"); } }); // Update a blog post app.put("/posts/:id", async (req, res) => { const { id } = req.params; const { title, description } = req.body; try { await db.insert({ _id: id, title, description, updatedAt: new Date(), }); res.json({ message: "Post updated successfully" }); } catch (err) { console.error(err); res.status(500).send("Error updating post"); } }); // Delete a blog post app.delete("/posts/:id", async (req, res) => { const { id } = req.params; try { await db.destroy(id); res.json({ message: "Post deleted successfully" }); } catch (err) { console.error(err); res.status(500).send("Error deleting post"); } }); app.listen(port, () => { console.log(`Blogpost app listening on port ${port}`); });


Le tester localement :

Des tests approfondis sont essentiels pour garantir la fonctionnalité et la robustesse de votre projet. Voici un exemple de documentation API pour guider votre processus de test :

Documentation API

URL de base :

En supposant que votre serveur s'exécute localement sur le port 3000, l'URL de base de votre API serait :

 http://localhost:3000

Points de terminaison de l'API :

Créer un nouvel article de blog

  • Point final : POST /posts

  • Description : Crée un nouveau billet de blog.

  • Corps de la demande :

     { "title": "String", "description": "String", "author": "String" }
  • Exemple :

     POST http://localhost:3000/posts { "title": "Sample Title", "description": "Sample Description", "author": "John Doe" }

Obtenez tous les articles du blog

  • Point de terminaison : GET /posts

  • Description : Récupère tous les articles du blog.

  • Réponse :

     [ { "id": "String", "key": "String", "value": { "rev": "String" }, "doc": { "_id": "String", "_rev": "String", "title": "String", "description": "String", "author": "String", "createdAt": "Date", "updatedAt": "Date" } } ]
  • Exemple :

     GET http://localhost:3000/posts

Obtenez un article de blog spécifique

  • Point de terminaison : GET /posts/:id

  • Description : Récupère un article de blog spécifique par son ID.

  • Paramètres :

    • id : ID de l'article de blog.
  • Réponse :

     { "_id": "String", "_rev": "String", "title": "String", "description": "String", "author": "String", "createdAt": "Date", "updatedAt": "Date" }
  • Exemple :

     GET http://localhost:3000/posts/your-post-id

Mettre à jour un article de blog

  • Point final : PUT /posts/:id

  • Description : Met à jour un article de blog spécifique par son identifiant.

  • Paramètres :

    • id : ID de l'article de blog.
  • Corps de la demande :

     { "title": "String", "description": "String" }
  • Exemple :

     PUT http://localhost:3000/posts/your-post-id { "title": "Updated Title", "description": "Updated Description" }

Supprimer un article de blog

  • Point de terminaison : DELETE /posts/:id

  • Description : Supprime un article de blog spécifique par son identifiant.

  • Paramètres :

    • id : ID de l'article de blog.
  • Exemple :

     DELETE http://localhost:3000/posts/your-post-id


Veuillez remplacer your-post-id par un identifiant réel de l'article de blog lors du test des requêtes GET , PUT et DELETE .

Étape 4 : Dockerisez votre application Node.js

Vous devez disposer d'un compte Docker Hub. Si vous n'en avez pas encore créé, inscrivez-vous sur Docker Hub.

Assurez-vous que Docker est installé et exécuté sur votre ordinateur local.

Étapes pour transférer l'application Dockerisée vers Docker Hub :

  • Créez un Dockerfile dans le répertoire racine de votre projet Node.js.
 # Use an official Node.js runtime as the base image FROM node:16 # Set the working directory in the container WORKDIR /usr/src/app # Copy package.json and package-lock.json to the working directory COPY package*.json ./ # Install app dependencies RUN npm install # Copy the rest of the application files to the working directory COPY . . # Expose the port the app runs on EXPOSE 3000 # Define the command to run the app CMD ["node", "blog.js"]
  • Marquez votre image Docker : ouvrez votre terminal/invite de commande et accédez au répertoire racine de votre application Node.js, où se trouve votre fichier Docker.


Exécutez la commande suivante pour créer votre image Docker et marquez-la avec votre nom d'utilisateur Docker Hub et le nom du référentiel souhaité :


 docker build -t your-docker-username/blogpost-app:latest .

Remplacez your-docker-username par votre nom d'utilisateur Docker Hub et votre blogpost-app par le nom de votre référentiel souhaité.


Vous obtiendrez une réponse similaire comme celle-ci :

 [+] Building 1.1s (10/10) FINISHED docker:desktop-linux => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 489B 0.0s => [internal] load metadata for docker.io/library/node:16 1.0s => [1/5] FROM docker.io/library/node:16@sha256:f77a1aef2da8d83e45ec990f45df50f1a286c5fe8bbfb8c6e4246c6389705c0b 0.0s => [internal] load build context 0.0s => => transferring context: 45.31kB 0.0s => CACHED [2/5] WORKDIR /usr/src/app 0.0s => CACHED [3/5] COPY package*.json ./ 0.0s => CACHED [4/5] RUN npm install 0.0s => CACHED [5/5] COPY . . 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:c5f046a9b99389aea6bf3f503e9b05cce953daf1b3f77ee5fb3f7469dc36c709 0.0s => => naming to docker.io/wise4rmgod/blogpost-app:latest


  • Connectez-vous à Docker Hub : authentifiez votre client Docker avec votre compte Docker Hub en exécutant la commande suivante :
 docker login


Entrez votre nom d'utilisateur et votre mot de passe Docker Hub lorsque vous y êtes invité.

 Authenticating with existing credentials... Login Succeeded


  • Transférer l'image Docker vers Docker Hub : une fois connecté, transférez votre image Docker balisée vers votre référentiel Docker Hub à l'aide de la commande suivante :
 docker push your-docker-username/blogpost-app:latest

Cette commande télécharge votre image locale sur Docker Hub sous votre référentiel spécifié.


  • Vérifiez le Push : accédez à votre compte Docker Hub sur le Web et accédez à votre référentiel pour confirmer que votre image Docker a été poussée avec succès.

    Tableau de bord cloud Docker



 aptible deploy --app reactgame --docker-image wise4rmgod/blogpost-app --private-registry-username wise4rmgod --private-registry-password H$(_tS+W~ZBST63

Étape 5 : Déploiement d’Aptible

Ce didacticiel suppose que vous avez une compréhension de base de la configuration d'un environnement , d'une application , d'un point de terminaison et d'une base de données sur la plateforme Aptible. Le didacticiel utilise CouchDB comme base de données et utilise Direct Docker pour le déploiement.


  • Connectez-vous à Aptible via CLI à l'aide de la commande suivante :
 aptible login


Vous serez invité à saisir votre e-mail et votre mot de passe. En cas de succès, vous recevrez une réponse similaire à celle-ci :

 Token written to /Users/wisdomnwokocha/.aptible/tokens.json This token will expire after 6 days, 23 hrs (use --lifetime to customize)


  • Maintenant, déployez votre application à l'aide de la commande suivante :

Syntaxe:

 aptible deploy --app <app name> --docker-image <docker image in cloud>


Voici un exemple de commande :

 aptible deploy --app reactgame --docker-image wise4rmgod/blogpost-app


Vous recevrez une réponse semblable à celle-ci :

 INFO -- : Starting App deploy operation with ID: 61135861 INFO -- : Deploying without git repository INFO -- : Writing .aptible.env file... INFO -- : Fetching app image: wise4rmgod/blogpost-app... INFO -- : Pulling from wise4rmgod/blogpost-app INFO -- : 26ee4ff96582: Pulling fs layer INFO -- : 446eab4103f4: Pulling fs layer INFO -- : 2e3c22a0f840: Pulling fs layer INFO -- : a7ab8ad9b408: Pulling fs layer INFO -- : 3808fdf0c601: Pulling fs layer INFO -- : ab9e4075c671: Pulling fs layer INFO -- : 362360c8cef6: Pulling fs layer INFO -- : 928b5d11ac66: Pulling fs layer INFO -- : dc87e077ac61: Pulling fs layer INFO -- : f108e80f4efc: Pulling fs layer INFO -- : 84ac53840ac8: Pulling fs layer INFO -- : e81f21b79a1f: Pulling fs layer INFO -- : 2e3c22a0f840: Downloading: 523 KB / 49.8 MB INFO -- : 446eab4103f4: Downloading: 173 KB / 16.6 MB INFO -- : 26ee4ff96582: Downloading: 483 KB / 47 MB INFO -- : 2e3c22a0f840: Downloading: 25.7 MB / 49.8 MB INFO -- : a7ab8ad9b408: Downloading: 528 KB / 175 MB INFO -- : ab9e4075c671: Downloading: 355 KB / 33.4 MB INFO -- : a7ab8ad9b408: Downloading: 35.3 MB / 175 MB INFO -- : 26ee4ff96582: Pull complete INFO -- : 446eab4103f4: Pull complete INFO -- : 2e3c22a0f840: Pull complete INFO -- : a7ab8ad9b408: Downloading: 71.2 MB / 175 MB INFO -- : a7ab8ad9b408: Downloading: 106 MB / 175 MB INFO -- : a7ab8ad9b408: Downloading: 142 MB / 175 MB INFO -- : a7ab8ad9b408: Pull complete INFO -- : 3808fdf0c601: Pull complete INFO -- : ab9e4075c671: Pull complete INFO -- : 362360c8cef6: Pull complete INFO -- : 928b5d11ac66: Pull complete INFO -- : dc87e077ac61: Pull complete INFO -- : f108e80f4efc: Pull complete INFO -- : 84ac53840ac8: Pull complete INFO -- : e81f21b79a1f: Pull complete INFO -- : Digest: sha256:de9d04d069ca89ebdb37327365a815c88cd40d90cbc5395cc31c351fff1206dd INFO -- : Status: Downloaded newer image for wise4rmgod/blogpost-app:latest INFO -- : No Procfile found in git directory or /.aptible/Procfile found in Docker image: using Docker image CMD INFO -- : No .aptible.yml found in git directory or /.aptible/.aptible.yml found in Docker image: no before_release commands will run INFO -- : Pushing image dualstack-v2-registry-i-0a5ec8cff8e775b34.aptible.in:46022/app-63213/72184c41-7dc6-4313-b10e-749125f72577:latest to private Docker registry... INFO -- : The push refers to repository [dualstack-v2-registry-i-0a5ec8cff8e775b34.aptible.in:46022/app-63213/72184c41-7dc6-4313-b10e-749125f72577] INFO -- : dd387bc6b362: Pushed INFO -- : 586bd9d5efcf: Pushed INFO -- : 8ae0c889ca84: Pushed INFO -- : c91ec53bcc27: Pushing: 522 KB / 93.6 MB INFO -- : aec897bac4f0: Pushed INFO -- : 0ead224631d3: Pushed INFO -- : ad3b30eb29d3: Pushing: 542 KB / 444 MB INFO -- : 2a7587eb01b6: Pushing: 544 KB / 137 MB INFO -- : be36d2a441aa: Pushed INFO -- : 03f6e3800bbe: Pushed INFO -- : a10e482288d1: Pushing: 338 KB / 30.7 MB INFO -- : f9cfc9f6b603: Pushing: 513 KB / 103 MB INFO -- : c91ec53bcc27: Pushing: 31.3 MB / 93.6 MB INFO -- : c91ec53bcc27: Pushing: 62.7 MB / 93.6 MB INFO -- : ad3b30eb29d3: Pushing: 44.5 MB / 444 MB INFO -- : 2a7587eb01b6: Pushing: 34.4 MB / 137 MB INFO -- : a10e482288d1: Pushed INFO -- : ad3b30eb29d3: Pushing: 88.9 MB / 444 MB INFO -- : f9cfc9f6b603: Pushing: 34.6 MB / 103 MB INFO -- : 2a7587eb01b6: Pushing: 68.9 MB / 137 MB INFO -- : ad3b30eb29d3: Pushing: 133 MB / 444 MB INFO -- : f9cfc9f6b603: Pushing: 70.2 MB / 103 MB INFO -- : c91ec53bcc27: Pushed INFO -- : 2a7587eb01b6: Pushing: 103 MB / 137 MB INFO -- : ad3b30eb29d3: Pushing: 178 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 224 MB / 444 MB INFO -- : 2a7587eb01b6: Pushed INFO -- : f9cfc9f6b603: Pushed INFO -- : ad3b30eb29d3: Pushing: 270 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 312 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 355 MB / 444 MB INFO -- : ad3b30eb29d3: Pushing: 401 MB / 444 MB INFO -- : ad3b30eb29d3: Pushed INFO -- : latest: digest: sha256:de9d04d069ca89ebdb37327365a815c88cd40d90cbc5395cc31c351fff1206dd size: 2841 INFO -- : Pulling from app-63213/72184c41-7dc6-4313-b10e-749125f72577 INFO -- : Digest: sha256:de9d04d069ca89ebdb37327365a815c88cd40d90cbc5395cc31c351fff1206dd INFO -- : Status: Image is up to date for dualstack-v2-registry-i-0a5ec8cff8e775b34.aptible.in:46022/app-63213/72184c41-7dc6-4313-b10e-749125f72577:latest INFO -- : Image app-63213/72184c41-7dc6-4313-b10e-749125f72577 successfully pushed to registry. INFO -- : STARTING: Register service cmd in API INFO -- : COMPLETED (after 0.28s): Register service cmd in API INFO -- : STARTING: Derive placement policy for service cmd INFO -- : COMPLETED (after 0.15s): Derive placement policy for service cmd INFO -- : STARTING: Create new release for service cmd INFO -- : COMPLETED (after 0.24s): Create new release for service cmd INFO -- : STARTING: Schedule service cmd .. INFO -- : COMPLETED (after 13.49s): Schedule service cmd INFO -- : STARTING: Stop old app containers for service cmd INFO -- : COMPLETED (after 0.0s): Stop old app containers for service cmd INFO -- : STARTING: Start app containers for service cmd INFO -- : WAITING FOR: Start app containers for service cmd INFO -- : WAITING FOR: Start app containers for service cmd INFO -- : COMPLETED (after 18.4s): Start app containers for service cmd INFO -- : STARTING: Delete old containers for service cmd in API INFO -- : COMPLETED (after 0.0s): Delete old containers for service cmd in API INFO -- : STARTING: Commit app containers in API for service cmd INFO -- : COMPLETED (after 0.26s): Commit app containers in API for service cmd INFO -- : STARTING: Commit service cmd in API INFO -- : COMPLETED (after 0.13s): Commit service cmd in API INFO -- : STARTING: Cache maintenance page INFO -- : COMPLETED (after 0.28s): Cache maintenance page INFO -- : STARTING: Commit app in API INFO -- : COMPLETED (after 0.19s): Commit app in API INFO -- : App deploy successful.


  • Visitez le tableau de bord Aptible pour confirmer que le déploiement a réussi.

  • Cliquez sur l'onglet Endpoint dans le tableau de bord et enregistrez le point de terminaison. Cela vous permettra d’exposer votre base de données à l’Internet public.

  • Cliquez sur Ajouter un point de terminaison dans l'écran suivant pour créer un nouveau point de terminaison.

Conclusion

Ce didacticiel complet vous aidera à créer, déployer et gérer une application de publication de blog avec Node.js, CouchDB et Aptible.


Vous avez compris les principes fondamentaux de la configuration des outils et des technologies essentiels, de la création du backend de l'application de publication de blog, de la dockerisation de l'application, du transfert de l'image Docker vers Docker Hub et du déploiement de l'application sur Aptible.


Félicitations pour avoir terminé ce didacticiel complet et votre parcours vers le développement d'applications cloud natives à l'aide d'Aptible !