0
votes

Déclencher une autre build existe dans le projet dans Azure Devops

J'ai un nom de dépôt appelé A avec son pipeline de construction comme azure-pipelines.yml Ensuite, j'ai un autre dépôt appelé B avec son pipeline de construction comme azure-pipelines.yml

A et B sont sous le même projet ProjectA

C'est le flux pour

  1. repo A, build => release (stages ops and dev)
  2. repo B, Build create the Artifact and store the Artifact

Donc, ce que je veux réaliser, c'est que dès que la publication est terminée à partir du dépôt A, elle devrait déclencher le dépôt de compilation B. Mon pipeline A ressemble à ceci:

resources:
  pipelines:
  - pipeline: azurepipelines
    source: azurepipelines
    branch: DATA-1234
    project: ProjectA
    trigger:
      branches:
      - DATA-1234
      stages:
        - Dev

J'ai donc fait en sorte que le pipeline B ressemble à ceci:

name: 

trigger:
  - none

resources:
 pipelines:
   - pipeline: SomethingFancy
     source: azure-pipelines
     branch: DATA-1234
     project: ProjectA
     trigger:
      branches:
      - DATA-1234
     stages:
    - dev
    - ops
 containers:
    - container: docker
      image: docker:1.6

Jusqu'à présent, je ne suis pas en mesure d'exécuter le pipeline car il se plaint "L'entrée de ressource de pipeline SomethingFancy doit être valide." selon la documentation, il s'agit de quelque chose # identifier for the resource (used in pipeline resource variables) .

Je fais référence à [this] [1] pour la collecte de ressources.

Je suis également destiné à utiliser l'appel [api] [2] pour mettre en file d'attente la construction du B , mais je ne suis pas en mesure de trouver ce que devrait être le corps du message, par exemple comment ajouter la branche du pipeline B , ou comment passer les paramètres du pipeline de B

ÉDITER

voir ci-joint le nom de mon pipeline [! [entrer la description de l'image ici] [3]] [3] et construire le pipeline source également appelé azurepipelines.yml et le pipeline de publication a une étape appelée Dev

Maintenant, mon pipeline B ressemble à ceci:

name: SomethingFancy

trigger:
  - none

resources:
 containers:
    - container: docker
      image: docker:1.6
    - container: python3
      image: python:3

variables:
  major: 2
  minor: 0

toujours je ne vois pas de lancement automatique du pipeline de construction de B [1]: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/resources?view=azure-devops&tabs=example#resources-pipelines [2]: https://docs.microsoft .com / en-us / rest / api / azure / devops / build / builds / queue? view = azure-devops-rest-5.1 [3]: https://i.stack.imgur.com/2Uk7A.png


0 commentaires

4 Réponses :


0
votes

Comme je l'ai lu dans la même documentation, je pense que vous devriez définir la propriété source sur le nom de votre pipeline à partir du repo A. source: SomethingFancy


3 commentaires

C'est déroutant, laissez-moi essayer ...


ne fonctionne toujours pas, comment exactement A et B communiqueront, lequel est le nom du repo. dans les deux référentiels, le pipeline porte le même nom.


Aure les noms des pipelines également les mêmes dans l'interface utilisateur Web ADO? Essayez de spécifier le nom du pipeline que vous voyez dans l'interface utilisateur.



0
votes

Le message d'erreur semble vous indiquer qu'il ne peut pas trouver de pipeline avec le nom que vous avez spécifié, probablement parce que, name signifie fait référence au format de numérotation de construction dans le pipeline YAML, par exemple

name: $(BuildID)

Comme @Roderick l'a noté, le nom du pipeline doit être ce que vous voyez dans l'interface utilisateur. Depuis l'écran principal «Azure Pipelines» de votre projet. Cliquez d'abord sur les "trois points" pour obtenir un sous-menu, puis cliquez sur "Renommer / déplacer". Exemple de capture d'écran:

Azure DevOps - Renommer les pipelines

Vous devriez maintenant avoir le nom du projet et les noms du pipeline dont vous avez besoin pour mettre à jour votre YAML dans le pipeline B et cela devrait fonctionner.


1 commentaires

il ne démarre toujours pas ... veuillez consulter la question mise à jour pour voir ce que j'ai fait après vos excellentes suggestions.



0
votes

J'ai remarqué que le flux pour le repo A est build => release (stages ops and dev) . Je me demande si la build est le pipeline de construction en tant que azure-pipelines.yml , et si la release (stages ops and dev) est le pipeline de version classique dans Azure Devops Releases hub? Vous devez savoir que les déclencheurs de ressources de pipeline ne fonctionnent pas pour le pipeline de version classique.

build => release (stages ops and dev) pour le dépôt A doit être dans le même pipeline (c'est-à-dire azure-pipelines.yml). Ainsi, le déclencheur de ressources de pipeline que vous avez défini dans le pipeline B ne fonctionne que lorsque le pipeline A ressemble à ci-dessous:

curl -X POST --silent \
-H "Authorization:Bearer $(System.AccessToken)"  \  
-H "Content-Type:application/json" \ 
        $(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?api-version=6.1-preview.6 \

-d '{  
     "definition":{ "id": id-of-pipelineB}, 
     "sourceBranch":"refs/heads/DATA-1234"
    }'

La source dans le pipeline B est le nom du pipeline A comme julie-ng l'a mentionné. Voir l'exemple ci-dessous:

POST https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=6.1-preview.6

Nom du pipeline A :

entrez la description de l'image ici

Déclencheur de ressource dans le pipeline B:

- task: benjhuser.tfs-extensions-build-tasks.trigger-build-task.TriggerBuild@3
  displayName: 'Trigger a new build of 48'
  inputs:
    buildDefinition: {ID of pipeline B}
    buildParameters: 'variableName: variableValue'  
    password: '$(System.AccessToken)'

Si le pipeline de publication pour le référentiel A est le pipeline de version classique. Vous pouvez ajouter cette tâche externe Trigger Build dans stage dev pour déclencher le pipeline B dans stage dev:

resources:
 pipelines:
   - pipeline: AnyString
     source: pipelineA
     branch: DATA-1234

Si vous souhaitez transmettre certaines variables du pipeline A au pipeline B., vous pouvez utiliser le champ buildParameters .

Dans pipelien B, cliquez sur le bouton Variables pour définir une variable pour maintenir la valeur de la variable. (Remarque: cochez cette option Laisser les utilisateurs remplacer cette valeur lors de l'exécution de ce pipeline, afin qu'il puisse être remplacé à partir d'un pipeline)

Vous pouvez toujours utiliser l'API Rest pour déclencher le pipeline. Veuillez consulter les fils ci-dessous pour plus d'informations

ce fil

envoyer plusieurs paramètres à la tâche de pipeline Azure-Devops via Powershell

Pouvez-vous transmettre un fichier à un pipeline Azure?

Mise à jour:

Vous pouvez utiliser Builds - Queue rest api pour déclencher un pipeline.

resources:
  pipelines:
  - pipeline: {Can be Any String} #identifier for the resource (used in pipeline resource variables)
    source: {Name of the pipeline A what you see in the UI}  #name of the pipeline that produces an artifact

Voir l'exemple ci-dessous:

name: ..
trigger:
  - none
resources:
 containers:
    ..
variables:
  ..

stages:
- stage: build  # build the project in build stage
  jobs:
  - job 
    ..

- stage: ops    #stage ops
  jobs:
  - job:
    ...

- stage: dev    #stage dev
  jobs:
  - job:
    ...


13 commentaires

merci, mon pipeline est un pipeline classique, et après avoir lu votre entrée. J'ai abandonné l'utilisation du déclencheur de ressources. Cependant, j'ai commencé à utiliser la file d'attente de construction de l'API pour appeler le pipeline de construction pour le repo B @ DATA-1234 après l'étape Dev de A , j'ai obtenu l'ID de construction et l'ID de projet en utilisant un appel api, puis en appelant POST pour lancer le pipeline de construction. Maintenant, il me lance cette erreur "message":"The request specifies project ID 0b330b4e-1ecb-47e7-854f-e6e799833627 but the supplied pipeline specifies project ID 00000000-0000-0000-0000-000000000000." voir ci-dessous le post pour vérifier l'appel API.


curl -X POST \ --silent \ -H "Authorization:Bearer $(System.AccessToken)" \ -H "Content-Type:application/json" \ $(System.TeamFoundationCollectionUri)/$(System.TeamProject)/‌​_apis/build/definiti‌​ons?api-version=6.0 \ --output /tmp/response1.json \ -d'{ "id":"$id", "sourceBranch":"refs/heads/DATA-1234", "project":{"name":"ProjectA", "id":"$project_id"} }' donc je ne l'obtiens pas d'où l'ID de projet 00000000-0000-0000-0000-000000000000 vient. Toute pensée?


@ change198 Il semble que vous utilisiez la mauvaise API de repos. Au-dessus de l'API que vous avez utilisée, vous créez une définition de pipeline sans mettre en file d'attente une construction. Vous devez utiliser l'API de repos de file d'attente de builds pour déclencher un pipeline. Voir la mise à jour ci-dessus.


@ change198 Avez-vous vérifié la mise à jour ci-dessus, comment cela s'est-il passé?


Maintenant, il me donne "message":"TF400898: An Internal Error Occurred. Activity Id: acbae1be-ceb0-4cc1-a1df 453211e2d8c6.", "typeName": "Newtonsoft.Json. JsonReaderException, Newtonsoft.Json","typeKey":"JsonReaderException" Je ne sais pas ce que je fais de mal? curl -X POST --silent -H "Authorization:Bearer $(System.AccessToken)" -H "Content-Type:application/json" $(System.TeamFoundationCollectionUri)$(System.TeamProject)/_‌​apis/build/builds?ap‌​i-version=6.1-previe‌​w.6 --output /tmp/response1.json -d '{ "sourceBranch":"refs/heads/DATA-1234", "definition":{ "id": $id } }'


Si je remplace $ id par la valeur réelle, cela fonctionne, mais dès que je le paramétre, l'erreur est générée.


@ change198 essayez d'encapsuler $id dans` $ () `dans le corps de la requête. comme ça $($id)


ne fonctionne toujours pas c'est ce que je fais curl --silent -X GET -H "Authorization:Bearer $(System.AccessToken)" -H "Content-Type:application/json" $(System.TeamFoundationCollectionUri)$(System.TeamProject)/_‌​apis/build/definitio‌​ns?api-version=6.0 --output /tmp/response.json puis id=$(cat /tmp/response.json | jq -r --arg key ${name} '.value[] | select(.name==$key)| .id' --raw-output) puis l' POST API call with the id . J'utilise la version 6.0 api car il semble que la sortie json de 6.1 a changé. et key est le nom du projet.


Cela fonctionne maintenant, mais je ne sais toujours pas ce qui n'allait pas dans JSON. J'appelle donc le POST avec JSON d'une manière différente. Voir la réponse Je l'ai ajouté. Merci.


@ change198 C'est super que vous ayez travaillé. Je vérifiais aussi les données json. Pourriez-vous accepter la réponse ci-dessus, puisque le problème a été résolu? Merci


Oui, je viens de le faire. Merci. Est-ce que ça va si nous déplaçons cette conversation vers le chat.


@ change198 bien sûr, vous pouvez. Merci


Continuonscette discussion en chat .



0
votes

Après beaucoup de lutte et l'aide de gens sages ici, j'ai enfin réussi à apprivoiser le problème. Je poste ici pour que n'importe qui puisse prendre un arbitre. Cela fonctionne maintenant référez-vous: ListBuild et QueueTheBuild

name="ProjectA"
    curl --silent -X GET -H "Authorization:Bearer $(System.AccessToken)" -H "Content-Type:application/json"  $(System.TeamFoundationCollectionUri)/$(System.TeamProject)/_apis/build/definitions?api-version=6.0 --output /tmp/response.json
    #Now get the build-id of your project you are interested in
    #please be aware that api-version > 6 has different json output and below command 
    #may not help you to give the right id
    id=$(cat /tmp/response.json | jq -r --arg key ${name} '.value[] | select(.name==$key)| .id'  --raw-output)
    #create your body to post
    generate_post_data()
    {
      cat <<EOF
    {
      "sourceBranch":"refs/heads/DATA-1234", 
      "definition":{"id": $id}
    }
    EOF
    }

#Now queue your build to run
#have to still verify if this command works for API_VERSION 6

curl -X POST \
                --silent \
                -H "Authorization:Bearer $(System.AccessToken)"  \
                -H "Content-Type:application/json" \
$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?api-version=6.1-preview.6  \
--output /tmp/response1.json \
-d "$(generate_post_data)"
#check the outcome
cat /tmp/response1.json


0 commentaires