8
votes

définir PATH dans les pipelines Azure dans Windows

J'utilise Azure Pipelines pour créer un binaire Rakudo pour Raku (précédemment alias Perl 6) dans Windows.

C'est mon fichier azure-pipelines.yml :

'perl6' is not recognized as an internal or external command,
operable program or batch file.

Le script de pipeline construit perl6 binaire perl6 dans le $(Build.SourcesDirectory)/rakudo-win/bin . Il y a en effet perl6.exe dans $(Build.SourcesDirectory)/rakudo-win/bin . Pour le rendre disponible, j'ai défini le chemin en l'ajoutant au début du script bash. Mais quand j'essaye d'exécuter la commande perl6 -v , la construction échoue à cette étape.

J'ai recherché des problèmes similaires dans SO ici , ici , ici .

Je n'ai toujours pas pu résoudre mon problème. perl6 vous de l'aide pour rendre le binaire perl6 disponible sur PATH ?

ÉDITÉ

La prochaine chose que j'ai faite a été de créer un autre script .yml comme suit:

jobs:
- job: Windows
  pool:
    vmImage: 'vs2017-win2016'
  steps:
    - script: |
        call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
    - pwsh: |
        mkdir -p C:\rakudo-win
        Invoke-WebRequest -Uri "https://github.com/rakudo/rakudo/releases/download/2019.07.1/rakudo-2019.07.1.tar.gz" -OutFile "rakudo.tar.gz"
        tar -xvf .\rakudo.tar.gz
        cd rakudo-2019.07.1
        C:\Strawberry\perl\bin\perl Configure.pl --gen-moar --gen-nqp --backends=moar --prefix=C:\rakudo-win
        make
        make install
    - pwsh: |
        $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path
        $newpath = "C:\rakudo-win\bin;$oldpath" 
        Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newpath
    - script: |
        SET PATH=C:\rakudo-win\bin;%PATH%

    - script: |
        perl6 -v

et essayé de changer PATH deux fois une fois dans PowerShell et un autre dans cmdline. Mais toujours, il jette l'erreur suivante:

jobs:
- job: Windows
  pool:
    vmImage: 'vs2017-win2016'
  steps:
    - bash: |
        mkdir -p $(Build.SourcesDirectory)/rakudo-win
        curl -L https://github.com/rakudo/rakudo/releases/download/2019.07.1/rakudo-2019.07.1.tar.gz | tar xz
        mv rakudo-2019.07.1 rakudo
        cd rakudo
        C:/Strawberry/perl/bin/perl Configure.pl --gen-moar --gen-nqp --backends=moar --prefix=$(Build.SourcesDirectory)/rakudo-win
        make
        make install

    - bash: |
        echo "##vso[task.prependpath]$(Build.SourcesDirectory)/rakudo-win/bin"

    - bash: |
        perl6 -v

De l'aide?


3 commentaires

Ceci est juste une liste linéaire de commandes, pourquoi ne pas utiliser un fichier batch?


Je ne suis pas sûr, mais je pense que sur Win, le répertoire DOIT être c:\rakudo . Du moins, c'était le cas.


Oui , je peux définir le répertoire comme c:\rakudo , dans ce cas , je dois avoir C:\rakudo\bin dans PATH , afin que je puisse utiliser perl6 en aval après le script s.


3 Réponses :


1
votes

pourquoi ne pas simplement faire ceci:

- script: |
  PATH=$BUILD_SOURCESDIRECTORY/rakudo-win/bin:$PATH perl6 -v


3 commentaires

Une fois que perl6 est dans PATH, je veux exécuter ces commandes: git clone github.com/ugexe/zef.git , cd zef, perl6 -I. installation de bin / zef.


alors vous pouvez définir le chemin avec export PATH=$BUILD_SOURCESDIRECTORY/rakudo-win/bin:$PATH et exécuter ces commandes


Désolé ça ne marche pas. L'erreur qu'il génère avec le dernier script de mon .yml est /d/a/_temp/bd6b25db-74ec-40a1-90f3-0d0ef477f3df.sh: line 1: perl6: command not found .



2
votes

En fait, vous êtes très proche de la bonne solution. Votre deuxième tâche PowerShell a défini le PATH avec succès. Vous pouvez ajouter une autre tâche distincte pour imprimer la valeur PATH système pour vérifier cela.

- pwsh: |
    $NewPathInRegistry = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path
    Write-Host $NewPathInRegistry

entrez la description de l'image ici


Pour définir le PATH programmation, vous ne pouvez pas utiliser set commande set , cette commande peut en effet définir la variable d'environnement PATH , mais l' inconvénient de set est que la nouvelle valeur PATH n'est disponible que dans le terminal de ligne de commande actuel, elle n'a pas été ajoutée en fait dans la variable système . C'est pourquoi vous obteniez une erreur non reconnue dans la prochaine action de script .

Pour ajouter définitivement le répertoire à la variable d'environnement PATH afin qu'il puisse fonctionner pour les autres étapes suivantes, vous devez utiliser setx ou les ajouter dans le registre à l'aide de reg add . Mais l'utilisation de setx a pour limite que la valeur PATH dépasse pas 1024 caractères. Donc, ici, la meilleure solution consiste à mettre à jour PATH en modifiant la valeur du Registre.

MAIS, la mise à jour du registre pose encore un autre problème, vous devez tuer le processus actuel et exécuter un nouveau processus pour exécuter perl6 afin qu'il puisse lire le nouveau paramètre de registre disponible.

Si vous exécutez stop-process dans le pipeline Azure devops, la tâche échouera avec le code de sortie -1 . Il s'agit du code de sortie attendu, vous pouvez donc définir continueOnError: true sur step afin que les étapes suivantes puissent continuer.


0 commentaires

1
votes

La meilleure méthode que j'ai trouvée pour définir le PATH pour les tâches suivantes dans Azure Pipelines consiste à utiliser la syntaxe de commande de journalisation mentionnée dans le premier des trois liens SO que vous avez examinés. Étant donné que vous utilisez PowerShell dans votre pipeline yaml mis à jour, la commande serait:

Write-Host "##vso[task.prependpath]$(Build.SourcesDirectory)/rakudo-win/bin"

Notez que cela ne s'applique qu'aux tâches suivantes , si vous essayez de générer la variable PATH dans la tâche actuelle, elle ne sera pas mise à jour.


0 commentaires