DĂ©velopper une GitHub Action peut ĂȘtre une expĂ©rience enrichissante pour plonger dans le monde de l’automatisation. Dans cet article, je vous emmĂšne dans les coulisses de la crĂ©ation de "Is First Commit", une petite mais utile GitHub Action qui vĂ©rifie si le commit actuel est le tout premier d’un dĂ©pĂŽt.


Mise en place du projet

Chaque GitHub Action commence par un fichier fondamental : package.json. Ce fichier dĂ©finit les mĂ©tadonnĂ©es de l’action, ses dĂ©pendances et ses scripts utiles.

Pour l’action Is First Commit, voici un aperçu rapide :

  • Nom : first-commit-action
  • Description : VĂ©rifie si le commit actuel est le tout premier du dĂ©pĂŽt.
  • Script principal : index.js
  • DĂ©pendances : @actions/core, @actions/github et axios fournissent les bases pour interagir avec GitHub et effectuer les requĂȘtes API.
{
  "name": "first-commit-action",
  "version": "1.0.0",
  "description": "Check if the current commit is the first ever commit of the project",
  "main": "index.js",
  "keywords": ["github", "action"],
  "author": "Dennis de Best",
  "license": "ISC",
  "scripts": {
    "lint": "eslint .",
    "prepare": "ncc build index.js -o dist --source-map --license licenses.txt",
    "test": "jest",
    "all": "npm run lint && npm run prepare && npm run test"
  },
  "dependencies": {
    "@actions/core": "^1.10.0",
    "@actions/github": "^5.1.1",
    "axios": "^1.5.0"
  }
}

DĂ©finir les mĂ©tadonnĂ©es de l’action

Le fichier action.yaml agit comme le plan de votre GitHub Action. Il fournit des informations essentielles telles que son nom, sa description, ses entrĂ©es, ses sorties et sa configuration d’exĂ©cution.

Voici Ă  quoi cela ressemble pour cette action :

name: 'Is First Commit'
description: 'Check if the current commit is the first-ever commit of the project'
inputs:
  github-token:
    description: 'GitHub token (optional)'
    required: false
outputs:
  isFirstCommit:
    description: 'A boolean indicating if the current commit is the first one'
runs:
  using: 'node16'
  main: 'dist/index.js'

Cette configuration indique Ă  GitHub comment exĂ©cuter l’action et quoi attendre en termes d’entrĂ©es et de sorties. Le github-token optionnel est utilisĂ© pour effectuer des appels API authentifiĂ©s lorsque nĂ©cessaire.


Créer la logique

La vraie magie se trouve dans index.js. C’est ici que nous vĂ©rifions si le commit actuel est bien le premier du dĂ©pĂŽt.

Le script rĂ©cupĂšre la liste des commits du dĂ©pĂŽt via l’API GitHub et vĂ©rifie si un seul commit existe. Si c’est le cas, c’est le commit initial.

Voici une version simplifiée de la logique :

const core = require('@actions/core');
const github = require('@actions/github');
const axios = require('axios');

async function isFirstCommit() {
  try {
    const { owner, repo } = github.context.repo;
    const token = core.getInput('github-token');

    const headers = { 'Accept': 'application/vnd.github.v3+json' };
    if (token) {
      headers['Authorization'] = `Bearer ${token}`;
    }

    const url = `https://api.github.com/repos/${owner}/${repo}/commits`;
    const response = await axios.get(url, {
      headers,
      params: { per_page: 2 }
    });

    const commits = response.data;
    const isFirst = commits.length === 1;

    core.setOutput('isFirstCommit', isFirst ? 'true' : 'false');
  } catch (error) {
    core.setFailed(error.message);
  }
}

isFirstCommit();

Cette logique simple garantit que l’action reste efficace et fiable, tout en minimisant les appels à l’API.


Pour conclure

CrĂ©er cette GitHub Action a Ă©tĂ© Ă  la fois amusant et instructif. Cela montre comment de petites automatisations ciblĂ©es peuvent amĂ©liorer vos workflows CI/CD. En dĂ©tectant le premier commit d’un dĂ©pĂŽt, vous pouvez dĂ©clencher conditionnellement des tĂąches d’initialisation, configurer des ressources ou mĂȘme cĂ©lĂ©brer la naissance d’un projet automatiquement 🎉.

Si vous dĂ©butez avec GitHub Actions, cet exemple constitue un excellent point de dĂ©part pour explorer comment l’automatisation peut simplifier votre processus de dĂ©veloppement.

Happy coding !