Erreur 401 à l’installation d’une dépendance depuis le registre privé de GitHub avec npm v7

Au quotidien, sur l’une des briques logicielles sur laquelle je travaille, nous avons dans les dépendances de notre projet Node, une bibliothèque partagée à partir du registre privé de GitHub. Après une mise à jour de npm de la version 6 à la version 7, j’ai commencé à voir apparaître des erreurs 401 à l’exécution de la commande npm install. Ayant d’autres sujets plus urgents à traiter, nous avons donc pris la décision de rester sur la version 6 de npm.

Quelques mois après, avec le passage de Node 16 en version LTS et la publication de npm version 8, je me suis penché une nouvelle fois sur la question. En changeant la syntaxe de mon fichier .npmrc et en utilisant le nouveau format de token GitHub déployé il y a plusieurs semaines, les erreurs ont fini par disparaître. Voici donc la syntaxe utilisée:

//npm.pkg.github.com/:_authToken=ghp_xxxxxxxxxxxxxxxxxxxx
@scope:registry=https://npm.pkg.github.com

J’ai été devancé alors que je m’apprêtais à partager la disparition des erreurs avec cette configuration dans le ticket de bug dédié, où nous apprenons que cette correction fonctionne correctement pour les versions 6, 7 et 8 de npm.

Fusion automatique de branches avec Github Actions

Un projet récent sur lequel je travaille dispose d’une branche, qui, lorsque celle-ci reçoit des modifications, déclenche un événement dans notre système de déploiement continue, afin de déployer le contenu de la branche sur notre environnement de développement. Avec l’augmentation des effectifs de développeurs sur le projet, et pour essayer de garder un environnement de développement le plus à jour possible et faciliter le test des nouvelles fonctionnalités ou des corrections, je me suis penché sur la question de la fusion automatique de branches avec les Github Actions.

Voici un exemple de configuration fonctionnelle:

name: auto-merge
on:
  workflow_dispatch:
  schedule:
    # * is a special character in YAML so you have to quote this string
    - cron: '0 7 * * 1-5'
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          ref: master
          fetch-depth: 0
      - name: Merge on dev-env
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git config --global pull.ff only
          git checkout dev-env
          git pull
          git merge master
          git push

Dans cet exemple, tous les jours du lundi au vendredi à 7h, la branche master sera fusionnée dans la branche dev-env et poussée dans le dépôt distant, déclenchant ainsi le processus de déploiement automatisé.

Node-Elastical: Delete by query option

What is Elastical?

Elastical is a Node.js client library for the ElasticSearch REST API.

That’s it for the presentation.

Until a few weeks ago, it wasn’t possible to delete data by query without using a hack. The hack was the following:

client.delete('twitter', 'tweet', '', {q: 'user:Shay'} );

Here, we set id to an empty string and we use the options parameter to perform a search on user with value Shay. Not so practical at all.

Using curl to interact with ElasticSearch, it is possible to delete by query:

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d ' 
  { "term" : { "user" : "kimchy" } 
}
'

This handy way of deleting things in ElasticSearch was not possible with Elastical (unless, you managed to use the hack above).

So I’ve added a new parameter options.query which allow us to perform such a query more easily.

client.delete('twitter', 'tweet', '', {query:
  { "term" : { "user" : "kimchy" } } 
});

When using the query parameter, id and all other options except ignoreMissing will be ignored.

Let’s take a quick look at the code involved:

if(params.query) {
  url = '/' + encode(this.name) + '/' + encode(type) + '/_query';

  this.client._request(url, {method: 'DELETE', json: params.query}
  , function (err, res) {
    if (err) {
      if (ignoreMissing && res && res.found === false) {
        return callback(null, res), undefined;
      } else {
        return callback(err, res), undefined;
      }
    }
    callback(null, res);
  });
} else {

It’s pretty simple. First, we need to build the url, then we’re requesting ElasticSearch on the given url, passing the query in the json parameter. If options.query doesn’t exist, then the original code is used.

As a conclusion, delete by query is now available in Elastical and you should use it!

 

ElasticSearch: Delete By Query API

Pull Request: Remarques

Quelques bons usages qui peuvent faciliter l’acceptation d’une Pull Request sur Github et que j’ai découvert après quelques Pull Request.

  • Toujours décrire la fonctionnalité que vous ajoutez du mieux possible.
  • Faire des Pull Request contenant peu de fichier. On gagne ici en lisibilité. En effet, une Pull Request ajoutant 50 000 fichiers à cause de nouvelles dépendances, à beaucoup de chance de rebuter le développeur. En conclusion, faire quelque chose de clair!
  • Utiliser les outils de tests du projet. Cela nécessite peut-être de prendre en main des nouveaux outils mais augmente grandement les chances de faire accepter votre demande. Et surtout, vous évitez les commit de plusieurs milliers de fichiers.
  • Ça peut sembler idiot, mais utiliser le mécanisme de test du projet libre à la place de tester seulement son cas de test à la main peut vous évitez de chercher pendant des heures pourquoi cela ne marche pas comme vous le pensez.

Git(hub): les commandes pour démarrer.

Voilà les commandes utiles pour récupérer un dépot github et commencer à développer son projet ou contribuer, ici en prenant l’exemple de npmconf.

On récupère les données du dépôts
git clone https://github.com/username/npmconf.git
cd npmconf
On ajoute le dépôt parent dans le cas d’un fork, pour être en mesure de faire des merges.
git remote add upstream https://github.com/isaacs/npmconf.git
On récupère les données du dépôts parent
git fetch upstream

Un petit point de configuration pour pouvoir faire un push correctement.
On édite .git/config:

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = https://github.com/vvision/npmconf.git
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "upstream"]
url = https://github.com/isaacs/npmconf.git
fetch = +refs/heads/*:refs/remotes/upstream/*

On remplace la ligne url = https://github.com/vvision/npmconf.git par
url = https://username@github.com/vvision/npmconf.git .
En mettant votre nom d’utilisateur en lieu et place de username.
De cette façon, il n’y a plus qu’à entrer son mot de passe lors du push.