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?
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")
}
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.
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")
}
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
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")
}