web-dev-qa-db-fra.com

Marquer un repo à partir d'un script de flux de travail Jenkins

J'essaie actuellement de baliser un référentiel à partir d'un script Jenkins Workflow. J'ai essayé d'utiliser une étape sh mais cela pose des problèmes car les informations d'identification ne sont pas définies.

fatal: could not read Username for 'https://<repo>': Device not configured

Existe-t-il une étape pouvant être utilisée pour baliser un référentiel ou pour résoudre le problème des informations d'identification? 

13
user3617723

J'ai réussi à faire fonctionner cela en utilisant l'étape withCredentials fournie par le plug-in de liaison des informations d'identification.

Ce n'est pas génial car il a fallu tout spécifier dans l'URL, mais ces valeurs sont masquées dans la sortie de la console.

withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'MyID', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {

    sh("git tag -a some_tag -m 'Jenkins'")
    sh("git Push https://${env.GIT_USERNAME}:${env.GIT_PASSWORD}@<REPO> --tags")
}
17
user3617723

Voici une alternative qui n'exige pas de connaître l'URL de la télécommande:

try {
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'MyID', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {
    sh("${git} config credential.username ${env.GIT_USERNAME}")
    sh("${git} config credential.helper '!echo password=\$GIT_PASSWORD; echo'")
    sh("GIT_ASKPASS=true ${git} Push Origin --tags")
  }
} finally {
    sh("${git} config --unset credential.username")
    sh("${git} config --unset credential.helper")
}

Cela fonctionne en faisant en sorte que git lise le nom d’utilisateur de la configuration et laisse l’assistant d’identification fournir le mot de passe uniquement. La variable supplémentaire echo à la fin sert à faire en sorte que la commande que git passe comme argument à l’assistant ne se retrouve pas sur la même ligne que le mot de passe.

11
Magnus Reftel

Si votre mot de passe git contient des caractères spéciaux tels que "%", ":", "@" ou "/", le fait de transmettre ${env.GIT_PASSWORD} à l'URL de git, à savoir https://${env.GIT_USERNAME}:${env.GIT_PASSWORD}@<REPO> sans effectuer aucun codage, risque d'entraîner une erreur Invalid username or password

Il est préférable d’utiliser un identifiant en ligne.Helper est une meilleure solution. Toutefois, la suggestion de !echo password=\$GIT_PASSWORD; echo' entraînera un avertissement dans vos journaux de construction warning: invalid credential line: get lorsqu’on transmettra à credential.helper un argument indiquant l’opération requise (get, store, effacer). Dans ce cas, l'assistant d'informations d'identification tente d'interpréter l'opération get comme une entrée d'informations d'identification. Les entrées valides sont protocole, hôte, chemin d'accès, nom d'utilisateur, mot de passe, URL. Voir https://git-scm.com/docs/git-credential#IOFMT

Un meilleur identifiant.helper en ligne serait !f() { echo password=\$GIT_PASSWORD; }; f. Ainsi, l'opération credential.helper get sera ignorée.

Exemple complet:

try {
  withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'MyID', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {
    sh("${git} config credential.username ${env.GIT_USERNAME}")
    sh("${git} config credential.helper '!f() { echo password=\$GIT_PASSWORD; }; f'")
    sh("GIT_ASKPASS=true ${git} Push Origin --tags")    
  }
} finally {
    sh("${git} config --unset credential.username")
    sh("${git} config --unset credential.helper")
}
5
Evan McLean

Vous pouvez créer votre propre jeton d'API personnel ( OAuth ) et l'utiliser de la même manière que vous utiliseriez vos informations d'identification normales (à: /settings/tokens). Par exemple:

git tag -a some_tag -m 'Jenkins'
git Push https://[email protected]/foo/bar
1
kenorb

J'ai donc essayé la solution de @ user3617723 mais, pour une raison quelconque, quelque chose manquait. après un moment, j'ai trouvé mon problème… .. J'ai un travail supérieur qui consiste à extraire le dépôt git et à déclencher le travail en pipeline avec mon script de flux de travail qui a un espace de travail différent:

//use the jenkins global credential id and create the env parametrs of GIT_PASSWORD and GIT_PASSWORD
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'cred-github', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) {

//change directory to the work dir with the ".git" files and create tags
sh("cd ${MANAGER_WORKSPACE} ; git tag -a v-${props.'VERSION_NUMBER'} -m ${BUILD_URL}")

//get only the url after the https
giturl_Push = GIT_URL.split("//")[1]

// change directory to the work dir with the ".git" files and Push the tags to the repo
sh("cd ${MANAGER_WORKSPACE} ; git Push https://${env.GIT_USERNAME}:${env.GIT_PASSWORD}@${giturl_Push} --tags")




}
0
dsaydon