N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
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 :
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 :
- environnement linux ou wsl ( voir tuto : Alternative à wampserver : windows bash)
- git renseigné dans le path
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 |