2
votes

Valider / transmettre les modifications au référentiel Azure DevOps à la fin de la génération

Dans le cadre de notre processus de construction, nous mettons à jour les numéros de version et nous voulons valider et repousser les modifications vers le référentiel principal. Il s'agit d'un dépôt git hébergé sur azure devops et utilisant get sources comme première étape:

entrez la description de l'image ici J'ai ajouté une tâche de ligne de commande à la fin du pipeline avec le code suivant. Il semble y avoir quelque chose qui ne va pas, comment puis-je le faire correctement? Merci.

##[section]Starting: Commit/Push Changes To Git Repo
==============================================================================
Task         : Command Line
Description  : Run a command line script using cmd.exe on Windows and bash on macOS and Linux.
Version      : 2.148.0
Author       : Microsoft Corporation
Help         : [More Information](https://go.microsoft.com/fwlink/?LinkID=613735)
==============================================================================
Generating script.
========================== Starting Command Output ===========================
##[command]"C:\windows\system32\cmd.exe" /D /E:ON /V:OFF /S /C "CALL "D:\a\_temp\8b19361b-8f47-4d31-834d-132fedb0b386.cmd""
HEAD detached at e7a1479d
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   ../../../Properties/AssemblyInfo.cs
        .. (more files modified)

SOURCE BRANCH IS refs/heads/master
ADDING MODIFIED FILES
CREATING COMMIT
[detached HEAD 5c1bf6dc] Update version numbers for Build myBuildNumber_5.1.001
 2 files changed, 2 insertions(+), 2 deletions(-)
error: src refspec master does not match any
error: failed to push some refs to     'https://{org}@dev.azure.com/{projectName}/_git/{reponame}'
##[error]Cmd.exe exited with code '1'.
##[section]Finishing: Commit/Push Changes To Git Repo

Voici les résultats:

git config --global user.email "my@email.address.com"
git config --global user.name "VSTS Admin"
git status

ECHO SOURCE BRANCH IS %BUILD_SOURCEBRANCH%

ECHO ADDING MODIFIED FILES
git add *.cs
git add *.build
git add *.wxs

ECHO CREATING COMMIT
git commit -m "Update version numbers for Build %BUILD_BUILDNUMBER%"
git push origin master


0 commentaires

3 Réponses :


0
votes

" src refspec master does not match any " signifie que le re n'est pas une branche maître locale à pousser.

C'est parce que le commit a été créé dans un HEAD détaché (pas de branche)

Vous devez d'abord créer la branche master avec git checkout -b master avant d'ajouter et de valider.
Plus précisément, comme je l'ai mentionné ici :

git checkout master 2>/dev/null || git checkout -b master;

L' OP dan confirme dans les commentaires :

quand il a obtenu des sources à l'étape précédente, il a été extrait dans une branche différente de celle de master ( git checkout --progress --force e7a1479dc5d2139be5247a027721e2a88b44a890 )

Une extraction d'un commit aboutit directement par définition à un HEAD détaché.


2 commentaires

Merci. ça a marché. quand il a obtenu des sources à l'étape précédente, il a été extrait dans une branche différente de celle de master (git checkout --progress --force e7a1479dc5d2139be5247a027721e2a88b44a890)


@dan Super! J'ai inclus votre commentaire dans la réponse pour plus de visibilité.



0
votes

erreur: src refspec master ne correspond à aucun

erreur: échec de l'envoi de certaines références vers "https: // {org} @ dev.azure.com / {projectName} / _git / {reponame}"

Supposons d'abord que le référentiel que vous exploitez est A et que le référentiel vers lequel vous voulez pousser est B. La raison de cette erreur est que vos référentiels A et B ne sont pas synchronisés. Avant de pousser la branche A, vous devez vous assurer que la branche B est synchronisée, vous devez donc d'abord tirer la branche B vers la branche A, puis pousser la branche A, ou essayer une autre méthode: créer un nouveau référentiel (aucun nouveau commit n'est généré ), puis poussez une branche vers le nouveau dépôt.

git pull origin master
git push origin master

1 commentaires

J'apprécie la réponse mais cela n'a pas fonctionné. J'ai dû payer au lieu de tirer selon la réponse ci-dessus.



0
votes

Les choses à noter sont:

  1. Azure Pipeline effectue git checkout lors de la validation, ce qui a déclenché le pipeline.
    Ex: git checkout <commit-hash-SHA1>
  2. Ceci est appelé état HEAD détaché puisque la tête du référentiel au lieu de pointer vers une branche valide, elle pointe maintenant vers le commit lui-même. (ie HEAD est détaché)
  3. Puisque nous sommes dans l'état HEAD détaché, nous ne pouvons pas repousser directement et à la place, on peut utiliser l'approche suivante qui pousse directement vers la branche cible.
    Ex: git push <remote-repo-url> HEAD:refs/heads/<target-branch> pourrait être origin ou repo-url complet
    ou git push url_with_pat HEAD:refs/heads/<target-branch> (l'url peut également contenir le PAT (jeton d'accès personnel à Github - avec accès en écriture au repo cible) de format:
    https://<username>:<PAT>@github.com/<username>/<repo>.git
    En procédant de cette manière, nous ajoutons l'historique de validation local du pipeline actuel à l'état détaché, à la branche cible souhaitée.
  4. Comme nous avons toujours besoin de la branche cible (ou de la branche source qui a déclenché la construction), nous pouvons utiliser environment variable $(Build.SourceBranch) qui est de format /refs/head/<branch> car elle est en mode d'état détaché ( uses refs-heads )

Ceci est particulièrement utile si, pour une raison quelconque, vous essayez de ne pas extraire une branche

Si la méthode ci-dessus n'est pas requise, alors une extraction directe d'une branche spécifique peut être effectuée en utilisant git checkout -b <branch> classique git checkout -b <branch>

REMARQUE : peut être remplacé par trimmed $ (Build.SourceBranch) où le préfixe /refs/heads/ peut être supprimé avant d'utiliser


0 commentaires