Исключение определенных файлов в конвейере Azure CI (YAML)

#azure #azure-devops #yaml #azure-pipelines

#azure #azure-devops #yaml #azure-конвейеры

Вопрос:

У меня есть конвейер CI (YAML), который создает репозиторий, который будет развернут в существующую функцию Azure. Конвейер CI выполняет это задание. Однако после того, как это будет сделано, и я перехожу к функции App -> App files -> я вижу azure-pipeline.yml включен туда (или я думаю, что он был включен в процесс сборки). Я пробовал использовать пути и исключения, но они не работают. Мой вопрос в том, как мне исключить только этот azure-pipeline.yml, чтобы после завершения сборки конвейера, azure-pipeline.yml отсутствует в файлах приложения в приложении функций. Ниже приведен мой YAML

 trigger:
  branches:
    include:
      - master
  paths:
    exclude:
      - README.md
      - azure-pipelines.yml

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureSubscription: 'DevOps-Test'
  # Function app name
  functionAppName: 'test'
  # Agent VM image name
  vmImageName: 'vs2017-win2016'
  # Working Directory
  workingDirectory: '$(System.DefaultWorkingDirectory)/'

  
stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - powershell: |
        if (Test-Path "extensions.csproj") {
            dotnet build extensions.csproj --output ./$(workingDirectory)/bin
        }
      displayName: 'Build extensions'
    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: $(workingDirectory)
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true
    - publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      artifact: drop
    - task: DownloadBuildArtifacts@0
      inputs:
        buildType: 'current'
        downloadType: 'single'
        artifactName: 'drop'
        downloadPath: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
    - task: AzureFunctionApp@1
      displayName: 'Azure functions app deploy'
      inputs:
        azureSubscription: '$(azureSubscription)'
        appType: functionApp
        appName: $(functionAppName)
        package: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'        

 

Ответ №1:

Следующий синтаксис означает file README.md или azure-pipelines.yml не будет запускать сборку. Это не означает, что файл README.md или azure-pipelines.yml исключены из рабочего каталога.

 trigger:
  branches:
    include:
      - master
  paths:
    exclude:
      - README.md
      - azure-pipelines.yml
 

Я заметил, что вы пытались архивировать папку $(workingDirectory) и workingDirectory определили в переменной, которая была на самом деле $(System.DefaultWorkingDirectory)/ . System.DefaultWorkingDirectory это локальный путь к агенту, по которому загружаются файлы исходного кода.

Очевидно, что file README.md и azure-pipelines.yml находятся в исходном коде, поэтому они также архивируются. Вы можете добавить CopyFiles task before ArchiveFiles task для копирования необходимых файлов из исходной папки в целевую папку с использованием шаблонов сопоставления, а затем заархивировать целевую папку. Например:

 - task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory) '
  inputs:
    SourceFolder: '$(workingDirectory)'
    Contents: |
     **/*
     !*.md
     !*.yml
    TargetFolder: '$(Build.ArtifactStagingDirectory) '

- task: ArchiveFiles@2
  displayName: 'Archive files '
  inputs:
    rootFolderOrFile: '$(Build.ArtifactStagingDirectory) '
 

Комментарии:

1. Вы проверили мой ответ? Полезно ли это?

Ответ №2:

Посмотрите здесь

     - powershell: |
        if (Test-Path "extensions.csproj") {
            dotnet build extensions.csproj --output ./$(workingDirectory)/bin
        }
      displayName: 'Build extensions'
    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: $(workingDirectory)
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true
 

Вы создаете свой вывод здесь ./$(workingDirectory)/bin , но вы заархивировали rootFolderOrFile: $(workingDirectory) . Пожалуйста, измените его на rootFolderOrFile: $(workingDirectory)/bin .

Редактировать

Пожалуйста, добавьте это перед вызовом archive

 - script: |
    rm README.md
    rm azure-pipelines.yml
  workingDirectory: $(workingDirectory)
 

Таким образом, вы удалите их из папки, которую позже заархивируете.

Комментарии:

1. Пожалуйста, проверьте, как выглядит ваш рабочий каталог, добавив - script: ls '$(workingDirectory)' Archove files шаг before.

2. Вот мой рабочий каталог, который я хочу исключить README.md и azure-pipelines.yml не будет отображаться в файлах приложения в приложении-функции imgur.com/a/tIT1wFw

3. Это немного странно, но проверьте мою правку.