使用 YAML 管道构建和部署多个 azure 函数项目

Build and Deploy multiple azure function projects using YAML pipeline

我正在尝试使用 YAML 管道在单个解决方案中构建和发布多个 azure 函数项目,但是当我发布包时,它们会相互覆盖,所以我只发布了最后一个构建的项目。

我使用这些步骤来构建:

- task: DotNetCoreCLI@2
  displayName: 'Restore project dependencies'
  inputs:
    command: 'restore'
    feedsToUse: 'config'
    nugetConfigPath: Nuget.config
    projects: '**/*.csproj'

- task: DotNetCoreCLI@2
  displayName: 'Build the project - $(configuration)'
  inputs:
    command: 'build'
    arguments: '--no-restore --configuration $(configuration) -p:DesktopBuildPackageLocation="$(Build.ArtifactStagingDirectory)\Functions" -p:ArtifactStagingDirectory="$(Build.ArtifactStagingDirectory)\Artifacts"'
    projects: '**/*.csproj'

- task: DotNetCoreCLI@2
  displayName: 'Publish the project - $(configuration)'
  inputs:
    command: 'publish'
    projects: '**/*Functions.csproj'
    publishWebProjects: false
    arguments: '--no-build --configuration $(configuration) --output $(Build.ArtifactStagingDirectory)\Functions'
    zipAfterPublish: true
    modifyOutputPath: true

 - publish: '$(Build.ArtifactStagingDirectory)\Functions'
   displayName: 'Publish drop'
   artifact: functions

有没有办法按项目发布功能?我尝试了 VSBuild 任务来构建解决方案,但是当尝试使用 AzureFunctionApp 任务部署到 Azure 时,它​​出错说 msBuild 包不受支持。

欢迎提出任何建议!

而不是 Publish Pipeline Artifacts task you could use artifact.upload 记录命令从单个脚本步骤上传多个工件:

Upload: Upload an artifact

##vso[artifact.upload]local file path

Usage

Upload a local file into a file container folder, and optionally publish an artifact as artifactname.

Properties

containerfolder = folder that the file will upload to, folder will be created if needed.
artifactname = artifact name. (Required)

例子

- pwsh: |
    Get-ChildItem -LiteralPath '$(Build.ArtifactStagingDirectory)\Functions' -Filter '*.zip' -File |
    ForEach-Object {
        '##vso[artifact.upload containerfolder={0};artifactname={0}]{1}' -f $_.BaseName, $_.FullName
    }
  displayName: Publish artifacts

Is there a way I can publish the functions by project?

根据您的描述,您在一个解决方案文件中有多个项目。

据我所知,在 Dotnet Publish 任务中,您可以设置 publishWebProjects: false。然后功能将按项目发布。

你可以参考我的例子:

- task: DotNetCoreCLI@2
  displayName: Restore
  inputs:
    command: restore
    projects: '**/*.csproj'

- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    projects: '**/*.csproj'
    arguments: '--no-restore --configuration $(configuration) -p:DesktopBuildPackageLocation="$(Build.ArtifactStagingDirectory)\Functions" -p:ArtifactStagingDirectory="$(Build.ArtifactStagingDirectory)\Artifacts"'

- task: DotNetCoreCLI@2
  displayName: Publish
  inputs:
    command: publish
    publishWebProjects: false
    projects: '**/*.csproj'
    arguments: '--no-build --configuration $(configuration) --output $(Build.ArtifactStagingDirectory)/Functions'
    zipAfterPublish: True
  continueOnError: true

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact'
  inputs:
    PathtoPublish: ' $(build.artifactstagingdirectory)'
  condition: succeededOrFailed()

结果:

我想出了一个适合我的模式。我没有尝试仅通过一项任务发布我的解决方案中的所有项目,而是将它们拆分并为每个项目分配了自己的任务。所以我从这里开始:

  - task: DotNetCoreCLI@2
    displayName: 'Publish Functions'
    inputs:
      command: publish
      projects: '**/*.Functions.csproj'
      publishWebProjects: false
      arguments: '--no-build --configuration ${{ variables.configuration }} -o $(Build.ArtifactStagingDirectory)\Functions'
      modifyOutputPath: true
      zipAfterPublish: true

对此:

  - task: DotNetCoreCLI@2
    displayName: 'Publish Project 1 Functions'
    inputs:
      command: publish
      projects: '**/Project1.Functions.csproj'
      publishWebProjects: false
      arguments: '--no-build --configuration ${{ variables.configuration }} -o $(Build.ArtifactStagingDirectory)\Functions\Project1'
      modifyOutputPath: true
      zipAfterPublish: true

  - task: DotNetCoreCLI@2
    displayName: 'Publish Project2 Functions'
    inputs:
      command: publish
      projects: '**/Project2.Functions.csproj'
      publishWebProjects: false
      arguments: '--no-build --configuration ${{ variables.configuration }} -o $(Build.ArtifactStagingDirectory)\Functions\Project2'
      modifyOutputPath: true
      zipAfterPublish: true

我保留了模板的其余部分与原始模板相同 post。

感谢大家的帮助。