web-dev-qa-db-fra.com

Comment obtenir l'URL SCM dans un pipeline Jenkins ou un pipeline multibranch?

J'essaie d'obtenir une fusion de pré-construction pour travailler à l'intérieur d'un pipeline multibranches et je voudrais éviter d'avoir à coder en dur l'url git dans mon script de pipeline.

Il semble que scm step doive stocker l'URL d'une manière ou d'une autre, mais je ne sais pas comment y accéder.

12
Isaac Stefanek

Vous avez raison, l'objet scm contient les informations dont vous avez besoin.

Lorsque vous utilisez git comme contrôle source dans un projet Pipeline (ou projet Pipeline Multibranch), la variable globale scm sera une instance de GitSCM . Cela signifie que `scm.getUserRemoteConfigs () 'renverra une liste d'instances serRemoteConfig . Ces instances ont le nom, l'url et refspec de la télécommande git. Vous pouvez parcourir cette liste pour trouver une télécommande correspondante, ou simplement prendre la première si vous êtes sûr que vous n'avez qu'une seule URL.

def scmUrl = scm.getUserRemoteConfigs()[0].getUrl()

REMARQUES

  • RejectedAccessException - Les méthodes getUserRemoteConfigs et getUrl lanceront toutes deux org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException jusqu'à ce que vous les approuviez manuellement, sous "Gérer Jenkins -> Approbation de script en cours". La seule façon que j'ai trouvée de le faire est d'essayer d'exécuter le script, de lui faire lever une exception d'accès, d'approuver la méthode qui a provoqué l'exception et de répéter pour chaque méthode jusqu'à ce qu'aucune exception d'accès ne soit levée. Heureusement, le paramètre est à l'échelle du serveur, vous n'avez donc à le faire qu'une fois par contrôleur jenkins, pas pour chaque travail de pipeline.

  • GitHub - Lors des tests avec un GitHub - pipeline multibranches d'origine, getUserRemoteConfigs a renvoyé deux instances UserRemoteConfig, un pour les succursales régulières et un autre pour les demandes de tirage. Ceux-ci avaient la même URL, donc ce n'est pas grave, mais quelque chose à garder à l'esprit. Par exemple, dans un projet utilisant une connexion HTTPS:

    echo scm.getUserRemoteConfigs()
    
    "[
        +refs/heads/*:refs/remotes/Origin/* => https://github.com/bitwiseman/project.git (Origin),
        +refs/pull/*/head:refs/remotes/Origin/pr/* => https://github.com/bitwiseman/project.git (Origin)
    ]"
    
20
BitwiseMan

Inspiré par un commentaire en réponse de @BitwiseMan, j'ai trouvé un moyen (hacky) d'obtenir l'URL sans RejectedAccessException:

checkout scm
def url = sh(returnStdout: true, script: 'git config remote.Origin.url').trim()

Veuillez noter que cela doit être fait après checkout scm. Fondamentalement, vous devez être dans un référentiel git extrait (c'est-à-dire a .git/config fichier dedans)

17
akhy