Windows GitLab CI Runner utilisant Bash

J’essaie d’utiliser bash comme shell sous Windows pour un GitLab CI Runner.

concurrent = 1 check_interval = 0 [[runners]] name = "DESKTOP-RQTQ13S" url = "https://example.org/ci" token = "fooooooooooooooooooobaaaaaaaar" executor = "shell" shell = "bash" [runners.cache] 

Malheureusement, je ne peux pas trouver une option pour spécifier le programme shell réel que le coureur de CI doit utiliser. Par défaut, il essaie juste d’exécuter bash qu’il ne peut pas trouver. Je ne sais pas pourquoi, car lorsque j’ouvre une ligne de commande Windows et que je bash cela fonctionne.

 Running with gitlab-ci-multi-runner 1.9.4 (8ce22bd) Using Shell executor... ERROR: Build failed (system failure): Failed to start process: exec: "bash": executable file not found in %PATH% 

J’ai essayé d’append un fichier bash.cmd à mon répertoire utilisateur contenant

 @"C:\Program Files\Git\usr\bin\bash.exe" -l 

Cela me donne cette erreur étrange:

 Running with gitlab-ci-multi-runner 1.9.4 (8ce22bd) Using Shell executor... Running on DESKTOP-RQTQ13S... /usr/bin/bash: line 43: /c/Users/niklas/C:/Users/niklas/builds/aeb38de4/0/niklas/ci-test.tmp/GIT_SSL_CAINFO: No such file or directory ERROR: Build failed: exit status 1 

Y a-t-il un moyen de le configurer correctement?

Deux problèmes se posent ici, et les deux peuvent probablement être résolus.

  1. gitlab-runner ne peut pas trouver bash
  2. gitlab-runner ne combine pas très bien les chemins de style Unix et Windows.

Vous avez essentiellement réussi à résoudre le premier en créant le fichier bash.cmd . Mais si vous êtes curieux de savoir pourquoi cela n’a pas fonctionné sans cela, je pense que bash s’exécute dans votre invite de commandes car le répertoire qui le contient (par exemple dans votre cas “C: \ Program Files \ Git \ usr \ bin”) ) est inclus dans la variable d’environnement PATH de votre compte utilisateur . Mais peut-être que vous exécutez le gitlab-runner dans le compte système , qui peut ne pas avoir le même PATH. Donc, la première chose à faire est de vérifier la variable PATH de votre système et d’append le répertoire bin si nécessaire (c’est-à-dire en utilisant l’applet Système dans le Panneau de configuration comme décrit ici ou ici ). Assurez-vous simplement de redémarrer votre ordinateur après avoir effectué la modification, car la modification n’est appliquée qu’après le redémarrage. Cela devrait permettre à bash fonctionner, même s’il est appelé depuis un service exécuté sur le compte système ou admin.

En ce qui concerne l’erreur étrange que vous avez rencontrée après la création de bash.cmd, cela était dû au deuxième problème. Les chemins sont souvent très difficiles à combiner en combinant bash et Windows. Gitlab-runner essaie probablement de déterminer si le chemin de génération est relatif ou absolu et finit par append le chemin d’access de Windows à ce qu’il pense être le répertoire de travail ( $PWD ). Cela ressemble à un bogue, mais gitlab ne l’a toujours pas corrigé (à partir de la version 9.0 du coureur !!) et ne le fera probablement jamais. Peut-être ont-ils décidé que ce n’est pas un bogue ou que cela est dû à des bogues dans les logiciels ou outils sous-jacents qu’ils ne peuvent pas réparer ou qu’il serait trop difficile de corriger. De toute façon, j’ai découvert un travail. Vous pouvez spécifier le chemin de base pour les builds dans le fichier config.toml . Si vous utilisez un chemin de style Unix, il résout le problème. Sur windows, config.toml trouve généralement dans le même dossier que votre gitlab-runner.exe (ou gitlab-multi-runner-amd64.exe, etc.). Ouvrez ce fichier dans votre éditeur de texte préféré. Trouvez ensuite la section [[runners]] et ajoutez deux lignes similaires à la suivante.

 builds_dir="/c/gitlab-runner/builds/" builds_cache="/c/gitlab-runner/cache/" 

Le chemin que vous utilisez doit être la “version bash” de tout répertoire que vous voulez que gitlab-runner utilise pour stocker les versions, /cygdrive/c/... si vous utilisez cygwin, vous utiliserez un chemin similaire à /cygdrive/c/... au lieu de juste /c/... (ce qui est approprié pour msys-git ou autonome MSYS2, etc.).

Voici un exemple de fichier config.toml:

 [[runners]] name = "windows" url = "https://your.server.name" token = "YOUR_SECRET_TOKEN" executor = "shell" shell = "bash" builds_dir="/c/gitlab-runner/builds/" builds_cache="/c/gitlab-runner/cache/" 

On dirait que vous essayez de lier gitlab-ci avec le sous-système Windows pour Linux (accessible en tapant bash à l’invite de commande Windows)? Je doute que cela soit supporté directement par la configuration du runner de Gitlab.

Au lieu de cela, je suggère d’utiliser Powershell avec votre exécuteur shell.

  Executor = 'shell' Shell = 'powershell' 

Vous pouvez ensuite accéder à Bash dans les scripts que vous appelez depuis .gitlab-ci.yml.

Étant donné qu’il est déconseillé d’exécuter plus de scripts shell très sortingviaux dans le fichier .gitlab-ci.yml lui-même (au lieu de faire appel à un script externe), vous perdez peu en étant obligé d’utiliser un shell Windows natif.