Pour une fois un article qui n’est pas lié directement à une technologie en particulier , mais à la plateforme de sources github.
J’ai plusieurs modules qui sont disponibles sur cette plateforme et pour lequel un clone du dépôt ne permets pas d’obtenir un module fonctionnel.

Pour  cette raison il est nécessaire de créer des “releases” qui sont disponibles sur une page spécifique du dépot ( ex:  https://github.com/nenes25/eicaptcha/releases ) et sur lequel on peut mettre à disposition une archive ( ou tout autre fichier ) associé à la release à télécharger :

Ei captcha releases

Il est possible de faire cela manuellement directement depuis l’interface github, mais par principe manuellement c’est plus lent et plus souvent source d’erreurs qu’un script automatique.
Nous allons donc voir comment scripter tout ça en utilisant l’api v3 de github et curl.

Sachant que dans mon cas j’ai les prérequis suivants :

Je pense qu’il est possible de faire l’ensemble de la procédure ci-dessous via un script bash, mais pour moi c’était plus facile de le faire en php.

Le script nécessitera 3 fichiers situés dans un même emplacement :

  • config.php //(optionnel)
  • create_release.sh //Fichier shell
  • create_release.php // Fichier php

Le fichier config.php contiendra uniquement les identifiants d’accès à github.
( Dans le cas d’un script privé vous pouvez tout à fait les intégrer directement dans le script )

<?php 
$github_user = 'githubuser'; 
$github_password = 'githubpassword';

Le fichier create_release.sh est très basique :
il créé le tag git et le pousse sur github puis lance le script php

#! /bin/bash
 
if [ -z "$1" ]
  then
    echo "Please provide version number"
fi
 
version=$1
 
#Création du tag git et on le pousse en ligne 
git tag $version
git push --tags
 
#Lancement du script php qui se charge des autres tâches
php create_release.php $version

Tout la logique de livraison de la release est réalisée dans le fichier create_release.php

<?php
require_once dirname(__FILE__).'/config.php';
 
$baseApiUrl = 'https://api.github.com/repos/userName/RepoName/'; //Url de base du dépot
 
//On vérifie qu'un numéro de release est passé au script
if ($argc < 2) { exit("Please give a release number \n"); } //On vérifie que le numéro $release = $argv[1]; echo "Check if the release exists \n"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $baseApiUrl.'releases/tags/'.$release); $curlGlobalOptions = array( CURLOPT_USERAGENT => $github_user,
    CURLOPT_USERNAME => $github_user,
    CURLOPT_PASSWORD => $github_password,
    CURLOPT_RETURNTRANSFER => true, //Response in variable
);
 
//Curl options
curl_setopt_array($ch, $curlGlobalOptions);
 
$content = curl_exec($ch);
$info    = curl_getinfo($ch);
curl_close($ch);
 
//Si le tag existe déjà inutile de continuer le script
if ($info['http_code'] == 200) {
    echo "this tag already exists \n";
    exit('end of the script');
}
 
//Sinon création de la release
echo "Creation of the release \n";
$releaseDatas = array(
    "tag_name" => $release,
    "target_commit" => 'master', // Mettre ici la branche cible
    "name" => $release,
    "body" => "Description de la release ".$relase.' see changelog',
    //Passer à true pour debug
    "draft" => false,
    "prerelease" => false,
);
 
$curlDraft = curl_init();
curl_setopt_array($curlDraft, $curlGlobalOptions);
curl_setopt($curlDraft, CURLOPT_URL, $baseApiUrl.'releases');
curl_setopt($curlDraft, CURLOPT_POSTFIELDS, json_encode($releaseDatas));
 
$draftExec = curl_exec($curlDraft);
$draftInfo = curl_getinfo($curlDraft);
 
if ($draftInfo['http_code'] == '201') {
    echo "Release created with success \n";
} else {
    exit("Error during the creation of the release \n");
}
curl_close($curlDraft);
 
//Traitement de la réponse
$draftResponse  = json_decode($draftExec);
$assetUploadUrl = str_replace('{?name,label}', '', $draftResponse->upload_url);
 
//Logique de création du fichier joint à implémenter
 
//Ajout de la pièce jointe à la release
$archive = 'test.zip';
echo "Add zip archive to release \n";
 
$curlUpload = curl_init();
curl_setopt_array($curlUpload, $curlGlobalOptions);
curl_setopt($curlUpload, CURLOPT_URL,$assetUploadUrl.'?name='.urlencode($archive));
curl_setopt($curlUpload, CURLOPT_HTTPHEADER,
    array(
    'Content-Type: application/zip' //
    )
);
curl_setopt($curlUpload, CURLOPT_POSTFIELDS, file_get_contents($archive));
$uploadExec = curl_exec($curlUpload);
$uploadInfo = curl_getinfo($curlUpload);
curl_close($curlUpload);
 
echo "The relase is published on github \n";

Pour publier la release il suffit ensuite d’appeler le script via la commande

 ./create_release.sh 2.0.2