Migrer de Jenkins vers GitHub Actions
Pourquoi Migrer de Jenkins vers GitHub Actions ?
La transition de Jenkins vers GitHub Actions peut offrir plusieurs avantages, notamment :
- Intégration Native : GitHub Actions est intégré au workflow de développement quotidien sur GitHub, ce qui augmente la productivité et la connectivité.
- Simplicité et Rapidité : Avec GitHub Actions, le processus de configuration et d'exécution des pipelines devient plus simple et rapide.
- Coût Économique : GitHub Actions est gratuit pour les projets open source, ce qui peut aider à réduire les coûts associés aux systèmes CI/CD traditionnels comme Jenkins.
Prerequis
Connaissances Nécessaires :
- Connaissance de base en programmation et développement.
- Familiarité avec les terminologies Git et GitHub.
- Un projet existant ou un nouveau projet à développer sur GitHub.
Outils à Installer :
- Git : Pour versionner le code et intégrer à GitHub.
- Node.js (pour des projets JavaScript/TypeScript) : Version recommandée >= 14.0.0
- Python (pour des projets Python) : Version recommandée >= 3.8.0
Concepts Fondamentaux
Actions
Définition : Une action est le plus petit élément d'un workflow. Elle peut être une tâche simple, comme exécuter un script shell, ou elle peut être une collection de plusieurs actions. Schema Mental :
- Action 1: Exécuter un script bash
- Action 2: Installer des dépendances
Code Fonctionnel :
## Exécution d'un script bash
- name: Run a one-line script
run: echo "Hello, world!"
## Installation de dépendances (Node.js)
- name: Install dependencies
uses: actions/setup-node@v2
with:
node-version: '14'
Triggers
Définition : Un trigger détermine quand un workflow doit être exécuté. Par exemple, il peut être déclenché par une push dans le dépôt ou par une création de pull request. Schema Mental :
- Trigger 1: Exécuter le pipeline lors d'une push sur la branche main
Code Fonctionnel :
## Déclenchement du workflow sur une push dans la branche main
on:
push:
branches: [ main ]
Job
Définition : Un job est un ensemble d'actions qui s'exécutent dans le même environnement. Par exemple, vous pouvez avoir des jobs pour le build, les tests et le déploiement. Schema Mental :
- Job 1: Build l'application
- Job 2: Exécute les tests
Code Fonctionnel :
## Définition d'un job pour le build de l'application
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build the application
run: npm install && npm run build
Mise en Pratique : Projet Fil Rouge
Mini-Projet Réaliste
Nous allons créer un gestionnaire de tâches simple avec des fonctionnalités de création, lecture et suppression de tâches. Le projet sera basé sur Node.js et Express.
Étape 1 : Initialiser le Projet
mkdir task-manager
cd task-manager
npm init -y
Étape 2 : Installer les Dépendances
npm install express body-parser
Étape 3 : Créer le Code Source
Créez un fichier app.js avec le code suivant :
// app.js
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = process.env.PORT || 3000;
app.use(bodyParser.json());
let tasks = [];
app.get('/tasks', (req, res) => {
res.json(tasks);
});
app.post('/tasks', (req, res) => {
const task = req.body;
tasks.push(task);
res.status(201).json(task);
});
app.delete('/tasks/:id', (req, res) => {
const taskId = parseInt(req.params.id);
tasks = tasks.filter(task => task.id !== taskId);
res.sendStatus(204);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
Étape 4 : Créer le Workflow GitHub Actions
Créez un fichier .github/workflows/nodejs.yml avec le code suivant :
## .github/workflows/nodejs.yml
name: Node.js CI
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build project
run: npm run build
Étape 5 : Ajouter les Scripts dans package.json
{
"name": "task-manager",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node app.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"body-parser": "^1.20.1",
"express": "^4.18.2"
}
}
Étape 6 : Exécuter le Workflow
- Commitez et poussez vos modifications sur GitHub.
- Allez dans l'onglet Actions de votre dépôt GitHub pour suivre la progression du workflow.
Erreurs Frequentes et Debugging
Erreur 1 : Le build échoue avec une erreur de Node.js
Code Incorrect :
## .github/workflows/nodejs.yml
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
Code Correct :
## .github/workflows/nodejs.yml
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14.x'
Erreur 2 : Les tests ne sont pas exécutés
Code Incorrect :
## .github/workflows/nodejs.yml
- name: Run tests
run: npm test
Code Correct :
## .github/workflows/nodejs.yml
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
Erreur 3 : Le serveur ne démarre pas correctement
Code Incorrect :
// app.js
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
Code Correct :
// app.js
const server = app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
process.on('SIGTERM', () => {
server.close(() => {
process.exit(0);
});
});
Pour Aller Plus loin
- Migrer des Tâches Complexes : Découvrez comment migrer des tâches complexes, comme le déploiement sur des serveurs et la gestion de la production.
- Utiliser les Secrets : Apprenez à utiliser les secrets pour stocker des informations sensibles, comme les clés API ou les mots de passe.
- Intégration avec d'autres Services : Explorez comment intégrer GitHub Actions avec d'autres services tels que Docker, Kubernetes et AWS.
Défi Pratique
- Développer une Application API Simple : Créez une application API simple en utilisant Express.js ou FastAPI, puis configurez un workflow GitHub Actions pour la construction et les tests automatiques.