web-dev-qa-db-fra.com

Pousser vers Azure DevOps Git local depuis Build Pipeline

version courte

Quelqu'un peut-il me dire comment configurer une tâche "Script de ligne de commande" dans un pipeline de génération Azure DevOps qui pousse les modifications vers un référentiel Git local (en fait, le référentiel Git sur lequel le pipeline est basé)?

Peu importe ce que j'essaie, mon script expire toujours après l'impression Pushing commits to git.

version plus longue

Nous migrons des projets Java/Maven existants d'un serveur de génération Jenkins vers un environnement de génération Azure DevOps, et j'essaie de configurer un pipeline de génération qui imite la fonctionnalité "Release Staging" de Jenkins.

Ma première tentative a été d'appeler le plugin de sortie Maven directement sur les sources extraites. Cela a impliqué plusieurs obstacles, dont la plupart ont pu être surmontés d'une manière ou d'une autre:

  1. L'environnement git Azure DevOps standard n'a pas les valeurs de configuration requises "user.email" et "user.name" définies; cela peut être résolu en appelant git config dans une tâche "Script de ligne de commande" distincte avant de pousser.
  2. Azure DevOps vérifie les sources dans un "état détaché HEAD" - pour résoudre ce problème, les tâches de script de configuration appellent également git checkout master.

Une fois que cela est configuré, mon script d'appel Maven s'exécute au point où le plug-in de publication tente de pousser vers Git; les lignes correspondantes dans le fichier journal lues

[INFO] Executing: cmd.exe /X /C "git Push https://xxx.visualstudio.com/YYY/_git/zzz refs/heads/master:refs/heads/master"
[INFO] Working directory: D:\a\1\s</code>

Après cela, rien ne se passe (au moins, rien n'est enregistré) jusqu'à ce que le délai expire:

##[error]The operation was canceled.
##[section]Finishing: Maven pom.xml

Afin de découvrir les causes de ce problème, j'ai essayé plusieurs choses, entre autres,

  • désactiver l'appel maven et appeler git Push directement depuis le script,
  • enregistrer un assistant d'informations d'identification Git de type "magasin" (en supposant qu'un problème d'authentification est responsable du délai),

mais sans succès. Je suis maintenant à court d'idées sur la façon dont je pourrais obtenir le git Push appel au travail - y a-t-il quelqu'un ici qui peut m'aider?

P.S .: Comme vous pouvez le dire, je suis plutôt un débutant en ce qui concerne Azure DevOps, donc je ne connais sûrement pas toutes les astuces et fonctionnalités de ce système. En particulier, je ne sais pas s'il existe quelque chose qui offre les mêmes fonctionnalités que le plugin de sortie Maven. Nous utilisons la gestion des packages Azure DevOps, mais nous voulons conserver des flux séparés pour les instantanés et les versions (comme le font les outils comme Nexus), nous devons donc disposer d'un mécanisme pour faire avancer automatiquement les numéros de version, les extraire et les récupérer. la création et la publication du module intégré dans le flux de publication.

Si quelqu'un peut suggérer un autre moyen d'y parvenir, je suis également ouvert aux suggestions.

8
jpvee

Pour pousser le changement vers Azure DevOps, vous devez intégrer vos informations d'identification dans l'URL du référentiel Git :

  • Tout d'abord, créez un PAT si ce n'est pas le cas.
  • Utilisez ensuite la commande ci-dessous pour pousser:

    git Push https://Personal%20Access%20Token:[email protected]/YYY/_git/zzz master
    
4
Marina Liu

Vous ne devriez pas avoir à suivre la route PAT pour l'authentification - selon this , si votre dépôt fait partie du même projet Azure DevOps que le pipeline de génération, les informations d'identification devraient simplement circuler. Est-il possible que vous n'ayez pas autorisé l'agent de build à écrire dans vos dépôts? Deux choses sont nécessaires:

  • Sous Paramètres du projet -> Référentiels pour votre projet Azure DevOps, autorisez le Service de création de collection de projets entité Contributeur droits sur le référentiel approprié (ou tous les référentiels de projet).

  • Autorisez les scripts à accéder au jeton OAuth sous les paramètres "Travail de l'agent":

    enter image description here

Notez également un mauvais gotcha: cela ne fonctionnera pas pour les opérations de sous-module, car DevOps ne transmet pas automatiquement les informations d'identification aux instances de sous-module, et le seul symptôme est un blocage silencieux. Une solution de contournement pour transférer les informations d'identification manuellement est trouvée ici .

17
gregsmi

J'ai rencontré le même problème (git Push se bloque jusqu'à expiration) dans DevOps Server sur site même si Autoriser les scripts à accéder au jeton OAuth ainsi que les autorisations Repo ont été correctement définis.

Dans mon cas, le problème était que Build Agent ajoute un chemin au début de la variable d'environnement PATH - pour moi, c'était 'C:\ins\agent\externals\git\cmd \'. Ici, une ancienne version git (version git 2.18.0.windows.1) résidait et a été lancée dans le contexte du pipeline de l'agent de build. Vous pouvez le vérifier en ajoutant l'appel "git --version" à votre tâche de génération.

Je n'ai pas cherché à savoir pourquoi l'ancienne version de git ne fonctionnait pas et j'ai simplement utilisé la qualification de chemin d'accès complète pour mon git.exe mis à jour dans la tâche de pipeline

"C:\Program Files\Git\bin\git.exe" Push Origin master

et avec cette version git - actuellement "git version 2.24.0.windows.2" tout fonctionne bien. La mise à jour de votre agent de build vers une version avec git.exe plus récent devrait également résoudre ce problème, bien sûr.

0
Michal