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
build => release (stages ops and dev)
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
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
4 Réponses :
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
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.
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:
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.
il ne démarre toujours pas ... veuillez consulter la question mise à jour pour voir ce que j'ai fait après vos excellentes suggestions.
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 :
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: ...
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/definitions?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?api-version=6.1-preview.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/definitions?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 .
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