Azure devops 从Azure DevOps经典管道执行YAML模板
我想通过以下几点提出我的问题,希望现在能澄清:Azure devops 从Azure DevOps经典管道执行YAML模板,azure-devops,yaml,azure-pipelines,Azure Devops,Yaml,Azure Pipelines,我想通过以下几点提出我的问题,希望现在能澄清: 应用程序源代码位于应用程序代码repo中 管道代码(YAML)在管道代码回购中。因为我想对它进行版本化,不想保留在应用程序代码repo中。只是为了避免将控制权交给开发团队来管理它 问题陈述: 管道YAML不会被触发,除非它位于基于事件pr、commit等的源代码存储库中 每当应用程序代码repo中触发事件时,我们是否可以触发或执行管道repo中的YAML文件 我曾尝试使用经典管道和YAML模板来实现上述目标,但这两种方法无法协同工作。因为我只能
- 管道YAML不会被触发,除非它位于基于事件pr、commit等的源代码存储库中
- 每当应用程序代码repo中触发事件时,我们是否可以触发或执行管道repo中的YAML文件
#azure-pipeline.yaml
jobs:
- job: NewJob
- template: job-template-bd1.yaml
有没有比上述更好的想法或解决方案?azure devops服务将很快提供针对YAML管道的多存储库支持功能。此功能将支持基于在多个存储库之一中所做的更改触发管道。请查收。该功能预计将在2020年第一季度针对azure devops服务推出 目前,您可以使用构建完成遵循下面的解决方法来实现上述目标(管道将在另一个构建完成时触发) 1、设置触发管道 为应用程序代码repo创建一个空的经典管道作为触发管道,该管道将始终成功,并且什么也不做 并选中触发器选项卡和设置Bracnh过滤器下的启用持续集成 2、设置触发的管道 在管道中,使用
Checkout
to对回购进行编码。您可以专门签出要构建的应用程序的源代码。请参考以下示例:
steps:
- checkout: git://MyProject/application_code_repo@refs/heads/master # Azure Repos Git repository in the same organization
- task: TaskName
...
然后在yaml管道编辑页面中,单击右上角的3dot,然后单击触发器。然后单击构建完成旁边的+添加,并选择在步骤1中创建的上述触发管道作为触发构建
完成以上两个步骤后,当对应用程序_代码repo进行更改时,将执行触发管道并成功完成。然后,触发的管道将被触发以运行真正的构建作业
更新:
在Bitbucket中显示Azure DevOps生成管道状态
您可以在yaml管道的末尾添加python脚本任务,以更新Bitbucket构建状态。您需要设置一个条件:always()
以始终运行此任务,即使其他任务失败
您可以使用env变量Agent.JobStatus
获取。例如:
有关更多信息,请参阅文档,以及
定义:“执行模板yaml文件”?既然已经定义了yaml文件,为什么还要使用经典?我看不出有任何理由不使用yaml管道导入或扩展模板作为PR构建验证和CI管道。您想解决什么问题?不清楚为什么要这样做。可以使用yaml管道执行模板yaml。经典管道无法做到这一点。我已经编辑了我的原始问题,以便它能够有意义。如果还不清楚,请告诉我。嗨,谢谢你的回答。在上面的场景中,我不能捕获上一次触发的构建作业的状态吗?因为构建作业将为我提供构建完成的真实状态,并且需要在Bitbucket页面上更新。但是在这种情况下,Bitbucket将始终显示成功,因为第一个触发器管道始终发送成功。@rajeevsharma我认为您可以尝试重新配置Bitbucket以显示生成作业的真实状态。您还可以参考我的更新,通过Bitbucket Api将构建状态更新为Bitbucket。
- task: PythonScript@0
condition: always()
inputs:
scriptSource: inline
script: |
import os
import requests
# Use environment variables that your CI server provides to the key, name,
# and url parameters, as well as commit hash. (The values below are used by
# Jenkins.)
data = {
'key': os.getenv('BUILD_ID'),
'state': os.getenv('Agent.JobStatus'),
'name': os.getenv('JOB_NAME'),
'url': os.getenv('BUILD_URL'),
'description': 'The build passed.'
}
# Construct the URL with the API endpoint where the commit status should be
# posted (provide the appropriate owner and slug for your repo).
api_url = ('https://api.bitbucket.org/2.0/repositories/'
'%(owner)s/%(repo_slug)s/commit/%(revision)s/statuses/build'
% {'owner': 'emmap1',
'repo_slug': 'MyRepo',
'revision': os.getenv('GIT_COMMIT')})
# Post the status to Bitbucket. (Include valid credentials here for basic auth.
# You could also use team name and API key.)
requests.post(api_url, auth=('auth_user', 'auth_password'), json=data)