• Accueil / Salesforce / Comment exporter et…
, Comment exporter et importer des étiquettes de problème GitHub entre des projets &#8211; Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers13 minutes de lecture


En développant Planificateur d’action de masse, J’ai créé mon propre GitHub personnalisé Étiquettes pour m’aider à mieux organiser les problèmes et les demandes de fonctionnalités, ainsi que pour être un moyen de mieux communiquer aux utilisateurs sur l’état de leurs commentaires.

Parmi tous les libellés de Mass Action Scheduler, il y en a au moins 12 que je souhaite réutiliser dans mes autres projets. Depuis juillet 2019, GitHub ne fournit pas un moyen «simple» de copier des étiquettes d’un référentiel à un autre. Cependant, après avoir recherché les interwebs, j’ai finalement découvert plusieurs façons de le faire avec différents niveaux d’effort. J’ai pensé que ce serait bien de partager les différentes approches que j’ai rencontrées et que j’ai fini par utiliser.

Mes solutions préférées

Mes deux solutions préférées sont (1) ma propre approche utilisant la ligne de commande et l’API GitHub, et (2) certaines fonctions JavaScript que vous exécutez dans la console de votre navigateur pour automatiser les clics sur GitHub.com.

Automatisation de la ligne de commande avec Bash

La solution que j’ai finalement retenue était un script bash d’environ 50 lignes qui utilise curl, jq, et le API GitHub. Ce que j’ai aimé dans mon script personnalisé, c’est que je pourrais le faire faire exactement ce que je voulais, haha. Il prend en charge la copie du nom, de la couleur et de la description de l’étiquette; et créera ou mettra à jour des étiquettes dans le dépôt de destination. Les autres solutions que j’ai explorées n’écrasent pas les étiquettes dans l’organisation de destination. Je ne les blâme pas, c’est probablement un choix sûr. Cependant, pour mes besoins, je voulais mettre à jour les étiquettes afin de pouvoir synchroniser les couleurs et les descriptions entre les projets si et quand les étiquettes changent. Étant donné que cela utilise l’API GitHub, vous devez fournir un jeton d’accès personnel.

# Ce script utilise l’API REST GitHub Labels
# https://developer.github.com/v3/issues/labels/
# Fournir un jeton d’accès personnel qui peut
# accéder aux référentiels source et cible.
# C’est ainsi que vous autorisez avec l’API GitHub.
# https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line
GH_TOKEN =« VOTRE_TOKEN« 
# Si vous utilisez GitHub Enterprise, remplacez-le par «  GH_DOMAIN =« https://api.github.com« 
# Le référentiel source dont les étiquettes doivent être copiées.
SRC_GH_USER =« moi« 
SRC_GH_REPO =« mon-repo« 
# Le référentiel cible pour ajouter ou mettre à jour des étiquettes.
TGT_GH_USER =« toi« 
TGT_GH_REPO =« votre-repo« 
# ————————————————– ——-
# En-têtes utilisés dans les commandes curl
GH_ACCEPT_HEADER =« Accepter: application / vnd.github.symmetra-preview + json« 
GH_AUTH_HEADER =« Autorisation: porteur $ GH_TOKEN« 
# Bash for-loop sur un tableau JSON avec jq
# https://starkandwayne.com/blog/bash-for-loop-over-json-array-using-jq/
sourceLabelsJson64 =$ (curl –silent -H « $ GH_ACCEPT_HEADER«  -H « $ GH_AUTH_HEADER«  $ {GH_DOMAIN}/ repos /$ {SRC_GH_USER}/$ {SRC_GH_REPO}/Étiquettes?per_page = 100 | jq [ .[] | {« name »: .name, « color »: .color, « description »: .description}] | jq -r .[] | @ base64 )
# pour chaque étiquette du référentiel source,
# invoquer l’API github pour créer ou mettre à jour
# le libellé dans le repo cible
pour sourceLabelJson64 dans $ sourceLabelsJson64; faire
# base64 décode le json
sourceLabelJson =$ (écho $ {sourceLabelJson64} | base64 –décode | jq -r .)
# essayez de créer l’étiquette
# POST / repos /: owner /: repo / labels {nom, couleur, description}
# https://developer.github.com/v3/issues/labels/#create-a-label
createLabelResponse =$ (écho $ sourceLabelJson | curl –silent -X POST -d @ – -H « $ GH_ACCEPT_HEADER«  -H « $ GH_AUTH_HEADER«  $ {GH_DOMAIN}/ repos /$ {TGT_GH_USER}/$ {TGT_GH_REPO}/Étiquettes)
# si la création a échoué, la réponse n’inclut pas d’id et jq renvoie ‘null’
createdLabelId =$ (écho $ createLabelResponse | jq -r .id)
# si l’étiquette n’a pas été créée, c’est peut-être parce qu’elle existe déjà, essayez de la mettre à jour
si [[« $ createdLabelId«  == « nul«  ]
puis
updateLabelResponse =$ (écho $ sourceLabelJson | curl –silent -X PATCH -d @ – -H « $ GH_ACCEPT_HEADER«  -H « $ GH_AUTH_HEADER«  $ {GH_DOMAIN}/ repos /$ {TGT_GH_USER}/$ {TGT_GH_REPO}/Étiquettes/$ (écho $ sourceLabelJson | jq -r .name | @uri))
écho « Mettre à jour la réponse de l’étiquette: n« $ updateLabelResponse«  n« 
autre
écho « Créer une réponse d’étiquette: n« $ createLabelResponse«  n« 
Fi
terminé

Automatisation du navigateur avec JavaScript

Contrairement à l’utilisation de l’API GitHub pour copier des étiquettes d’un dépôt à un autre, une autre astuce que j’ai trouvée était simplement d’utiliser JavaScript dans la console de votre navigateur pour automatiser les clics sur le site Web GitHub.

Au début de ma recherche, je suis tombé sur cet essentiel par Max Thirouin pour l’exportation d’étiquettes et cet essentiel par Chang-Hsi Hsieh pour importer des étiquettes. Les scripts d’origine ne prenaient pas en charge les descriptions d’étiquettes, mais les personnes dans les commentaires des deux éléments essentiels ont fourni des mises à jour.

, Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

Par rapport à l’approche « une seule commande et vous avez terminé » de la Automatisation de la ligne de commande avec Bash solution, la technique d’automatisation du navigateur vous oblige à exécuter manuellement JavaScript dans la console de votre navigateur pour exporter les libellés, puis à exécuter un autre JavaScript pour importer les libellés. En effet, les scripts fonctionnent en supposant que vous avez déjà navigué dans votre navigateur vers la page des étiquettes du référentiel dont vous souhaitez exporter ou importer les étiquettes. Cependant, le compromis est que vous n’avez pas à fournir votre mot de passe GitHub ou votre jeton d’accès au code tiers. Tout se passe dans votre navigateur lorsque vous êtes déjà connecté en toute sécurité à GitHub.

/ **
* Inspiré du script original de @MoOx: https://gist.github.com/MoOx/93c2853fee760f42d97f
* Ajoute le téléchargement de fichiers par @micalevisk https://gist.github.com/MoOx/93c2853fee760f42d97f#gistcomment-2660220
*
* Les changements incluent:
* – Récupère la description de l’attribut `title` au lieu de` aria-label` (n’existe plus)
* – Utilisez style.backgroundColor et analysez le rgb (…) en hexadécimal (plutôt que l’analyse regex de la chaîne ‘style’)
* – Télécharge les étiquettes dans un fichier JSON nommé d’après la page Web pour savoir de quel dépôt GitHub elles proviennent.
*
* Dernier test 2019-juillet-27:
* – Chrome 75.0.3770.142
* – Safari 12.1.2
* – macOS 10.14.6
* /
fonction exportGitHubLabels() {
laisser Étiquettes = [[];
[[].tranche.appel( document.querySelectorAll( « .label-link » ) )
.pour chaque( élément => {
Étiquettes.pousser({
Nom: élément.textContent.réduire(),
la description: élément.getAttribute( ‘Titre’ ),
Couleur: (
// style.backgroundColor renvoie « rgb (…) »
// mais GitHub attend de l’hexagone lorsque nous importons les couleurs
élément.style.Couleur de l’arrière plan
// saisir entre ‘rgb (‘ et ‘)’
.sous-chaîne( 4, élément.style.Couleur de l’arrière plan.longueur 1 )
// convertit une chaîne délimitée par des virgules en un tableau de trois nombres
.Divisé( ‘,’ )
// réduit le tableau de trois nombres en une seule couleur hexadécimale
.réduire( ( hexValue, rgbValue ) => {
revenir (
// ajoute la valeur hexadécimale à deux chiffres suivante
hexValue +
// convertir décimal en hexadécimal
Nombre( rgbValue ).toString( 16 )
// chaque nombre dans une couleur hexadécimale est composé de deux caractères
.padStart( 2, «0» )
);
},  » )
)
});
});
revenir Étiquettes;
}
fonction saveDataAsJSON( Les données, nom de fichier ) {
const goutte = Nouveau Goutte( [[ JSON.stringifier( Les données, nul, 4 ) ], { type: ‘text / json’ } );
const une = document.createElement( ‘une’ );
une.Télécharger = nom de fichier;
une.href = la fenêtre.URL.createObjectURL( goutte );
une.base de données.downloadurl = [[ ‘text / json’, une.Télécharger, une.href ].joindre( ‘:’ );
une.Cliquez sur();
}
saveDataAsJSON( exportGitHubLabels(), document.Titre + «.json» );
/ **
* Inspiré du script original de @Isaddo: https://gist.github.com/Isaddo/7efebcb673a0957b9c6f07cd14826ea4
* Ajoute des descriptions par @NillerMedDild https://gist.github.com/Isaddo/7efebcb673a0957b9c6f07cd14826ea4#gistcomment-2715349
*
* Les changements incluent:
* – Les sélecteurs CSS utilisent le préfixe `js`
*
* Dernier test 2019-juillet-27:
* – Chrome 75.0.3770.142
* – Safari 12.1.2
* – macOS 10.14.6
* /
fonction createLabel( étiquette ) {
document.querySelector( ‘.js-new-label-name-input’ ).valeur = étiquette.Nom;
document.querySelector( ‘.js-nouvelle-étiquette-description-entrée’ ).valeur = étiquette.la description;
document.querySelector( ‘.js-nouvelle-étiquette-couleur-entrée’ ).valeur = «#» + étiquette.Couleur;
document.querySelector( ‘.js-details-target ~ .btn-primary’ ).désactivée = faux;
document.querySelector( ‘.js-details-target ~ .btn-primary’ ).Cliquez sur();
}
fonction updateLabel( étiquette ) {
laisser mis à jour = faux;
[[].tranche.appel( document.querySelectorAll( ‘.js-labels-list-item’ ) ).pour chaque( élément => {
si ( élément.querySelector( ‘.js-label-link’ ).textContent.réduire() === étiquette.Nom ) {
mis à jour = vrai;
élément.querySelector( « .js-edit-label » ).Cliquez sur();
élément.querySelector( ‘.js-new-label-name-input’ ).valeur = étiquette.Nom;
élément.querySelector( ‘.js-nouvelle-étiquette-description-input’ ).valeur = étiquette.la description;
élément.querySelector( ‘.js-nouvelle-étiquette-couleur-entrée’ ).valeur = «#» + étiquette.Couleur;
élément.querySelector( ‘.js-edit-label-cancel ~ .btn-primary’ ).Cliquez sur();
}
});
revenir mis à jour;
}
fonction createOrUpdate( étiquette ) {
si ( !updateLabel( étiquette ) ) {
createLabel( étiquette );
}
}
[[
// VOS LABELS JSON ICI
].pour chaque( étiquette => createOrUpdate( étiquette ) );
[[
{
« Nom« : « a11y« ,
« la description« : « Cela nécessite une accessibilité améliorée. https://a11yproject.com/« ,
« Couleur« : « 20e5d8« 
},
{
« Nom« : « bug: crash 💥« ,
« la description« : « L’application plante et est inutilisable de manière significative.« ,
« Couleur« : « fbca04« 
},
{
« Nom« : « bug: régression ↩️« ,
« la description« : « Une nouvelle version de l’application a cassé quelque chose.« ,
« Couleur« : « fbca04« 
},
{
« Nom« : « bug 🐞« ,
« la description« : « L’application ne fonctionne pas correctement.« ,
« Couleur« : « fbca04« 
},
{
« Nom« : « discussion 💬« ,
« la description« : « Discuter de l’utilisation, des meilleures pratiques, des questions, etc.« ,
« Couleur« : « e99695« 
},
{
« Nom« : « documentation 📓« ,
« la description« : « Lié à l’amélioration de la documentation et du wiki.« ,
« Couleur« : « 6addf7« 
},
{
« Nom« : « amélioration ✨« ,
« la description« : « Une nouvelle suggestion de fonctionnalité ou une amélioration sur une fonctionnalité existante.« ,
« Couleur« : « 84b6eb« 
},
{
« Nom« : « problème connu de Salesforce ⚠️« ,
« la description« : « Un problème connu avec la plate-forme Salesforce et probablement pas quelque chose que l’application peut résoudre.« ,
« Couleur« : « fcec85« 
},
{
« Nom« : « sécurité 🔒« ,
« la description« : « Questions, préoccupations ou suggestions pour améliorer la sécurité de l’application.« ,
« Couleur« : « 1d76db« 
},
{
« Nom« : « statut: en cours ❇️« ,
« la description« : « En cours de développement pour une future version.« ,
« Couleur« : « c2e0c6« 
},
{
« Nom« : « état: en attente 💤« ,
« la description« : « Le travail s’est arrêté. Il peut y avoir un ou plusieurs bloqueurs ou avoir besoin de plus d’informations.« ,
« Couleur« : « c2e0c6« 
},
{
« Nom« : « statut: résolu ✅« ,
« la description« : « Ce problème a été résolu dans une succursale et sa publication sera prévue dans le jalon assigné.« ,
« Couleur« : « c2e0c6« 
}
]
, Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

Mentions honorables

Ce sont les autres options que j’ai envisagées mais que j’ai finalement non utilisées.

, Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

Application des paramètres Probot

Les applications Probot sont Applications GitHub pour automatiser et améliorer votre flux de travail. L’une de ces applications est la Réglages app. Il lit la configuration à partir d’un .github/settings.yml sur votre branche par défaut applique ensuite les modifications à votre dépôt GitHub.

Par exemple, vous pouvez spécifier si le référentiel doit être public ou privé, le nom et la description du référentiel, les collaborateurs, les libellés à utiliser, et bien plus encore.

La capture d’écran suivante est un extrait de .github/settings.yml qui définit les étiquettes, leurs couleurs et même comment renommer une étiquette.

, Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

Cependant, une mise en garde majeure avec l’application Probot Settings est qu’elle redirige intrinsèquement toute personne disposant d’autorisations push vers le admin rôle, car ils peuvent pousser des changements à settings.yml fichier au master branche, qui appliquera ensuite les modifications au dépôt lui-même.

En fin de compte, j’ai choisi de ne pas utiliser l’application Probot Settings en raison de ce problème de sécurité et parce que je voulais une solution encore plus légère que d’installer une application tierce sur mon compte GitHub.

destan / github-label-manager

Créateur d’étiquettes GitHub est une application Web open source pour créer, mettre à jour, supprimer et copier des étiquettes d’un référentiel à un autre. Il est développé par Destan Sarpkaya. Au moment de la rédaction de cet article, cette application utilise l’API REST GitHub mais ne prend en charge que la gestion des noms et des couleurs des étiquettes. Il n’a pas été mis à jour pour prendre en charge la gestion des descriptions d’étiquettes.

, Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

La page Web est assez simple à utiliser, mais j’ai choisi de ne pas l’utiliser parce que je veux la description de mes étiquettes et que je ne me sentais pas à l’aise de saisir mon mot de passe GitHub sur le site Web.

jvandemo / copie-github-labels

Copier les étiquettes GitHub est un module CLI Node.js open source pour copier des étiquettes d’un référentiel à un autre. Il est développé par Jurgen Van de Moere. Au moment de la rédaction de cet article, cette application utilise la bibliothèque officielle GitHub Node.js, octokit / rest.js, pour interagir avec l’API GitHub. En ce qui concerne les fonctionnalités, l’application ne crée que de nouveaux libellés, elle ne met pas à jour les libellés existants dans le dépôt de destination. Le projet est bien documenté et comporte de nombreux exemples à suivre.

, Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

Au final, j’ai choisi de ne pas utiliser cette solution car je voulais quelque chose d’encore plus léger que d’installer un tas de modules de nœuds.

thetutlage / gh-copy-labels

Étiquettes de copie GitHub est un module CLI Node.js open source pour copier des étiquettes d’un référentiel à un autre. Il est développé par Harminder Virk. Au moment de la rédaction de cet article, cette application utilise une bibliothèque Node.js GitHub, octonode, pour interagir avec l’API GitHub. En ce qui concerne les fonctionnalités, l’application ne crée que de nouveaux libellés, elle ne met pas à jour les libellés existants dans le dépôt de destination.

, Comment exporter et importer des étiquettes de problème GitHub entre des projets – Douglas C. Ayers<span class="wtr-time-wrap after-title"><span class="wtr-time-number">13</span> minutes de lecture</span>

En fait, je n’ai pas pu installer ou faire fonctionner cette application. Tentative d’installation du package via npm selon le LISEZ-MOI a donné une erreur concernant le fichier manquant build/bin.js. La vidéo de démonstration semble prometteuse et utilise ironiquement le build/bin.js fichier que npm s’est plaint de ne pas trouver, donc votre kilométrage peut varier.



Source de l’article traduit automatiquement en Français

Besoin d'aide ?
Voulez-vous utiliser Pardot à sa capacité maximale et avoir
+ DE LEADS QUALIFIÉS

Notre analyse de votre Pardot offerte dès aujourd'hui
Merci, vous pouvez compléter notre questionnaire
Nous allons revenir vers vous rapidement !

Fermer