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模板来实现上述目标,但这两种方法无法协同工作。因为我只能

我想通过以下几点提出我的问题,希望现在能澄清:

  • 应用程序源代码位于应用程序代码repo中
  • 管道代码(YAML)在管道代码回购中。因为我想对它进行版本化,不想保留在应用程序代码repo中。只是为了避免将控制权交给开发团队来管理它 问题陈述:

    • 管道YAML不会被触发,除非它位于基于事件pr、commit等的源代码存储库中
    • 每当应用程序代码repo中触发事件时,我们是否可以触发或执行管道repo中的YAML文件
    我曾尝试使用经典管道和YAML模板来实现上述目标,但这两种方法无法协同工作。因为我只能从YAML管道执行YAML模板,而不能从下面这样的经典管道执行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)