Как не завершить задачу Azure Pipeline с помощью CopyFilesOverSSH, если файлы существуют и перезапись имеет значение false

У меня есть приведенная ниже задача CopyFilesOverSSH@0 в файле шаблона конвейера Azure. Если это релизная сборка, я хочу, чтобы она скопировала артефакты сборки на другой сервер с помощью ssh. Но только если на сервере еще нет артефактов, хранящихся для этой сборки/версии. Я установил overwrite на false, чтобы предотвратить это.

  - task: CopyFilesOverSSH@0
    displayName: "Copy Release Artifacts to server"
    condition: and(succeeded(), eq(variables.isRelease, '0'))
    inputs:
      sshEndpoint: 'myRemoteServer'
      sourceFolder: "$(Build.ArtifactStagingDirectory)/${{ parameters.buildName }}"
      contents: '**'
      targetFolder: "/artifacts/$(Build.Repository.Name)/${{ parameters.buildName }}/$(buildVersion)"
      readyTimeout: '20000'
      overwrite: false
      failOnEmptySource: true

Эта задача работает нормально в первый раз для конкретной сборки/версии, но если сборка повторяется, эта задача сборки завершается с ошибкой, поскольку файлы уже существуют. Я получаю сообщение об ошибке, похожее на:

##[error]Failed to copy /home/azure-pipeline-agents/hostOS_1/50/a/myBuildName/myBuildArtifactFile. File /artifacts/***/myBuildName/v1.2.3/myBuildArtifactFile cannot be copied to the remote machine because it already exists and the 'Overwrite' option is disabled.

Как мне либо:

  1. Не допускайте сбоя этой задачи, что приведет к сбою всей сборки, поскольку файлы уже существуют на удаленном сервере.
  2. Обнаружить наличие файлов на удаленном сервере в более ранней задаче, чтобы я мог пропустить эту задачу копирования в предложении condition.

ОБНОВЛЕНИЕ: я добавил continueOnError: true к задаче, и сборка продолжается, но в сборке по-прежнему отображаются ошибки. Было бы неплохо иметь возможность различать проблему «файлы существуют» как норму и ошибки типа «невозможно подключиться к серверу» или «исходные файлы не существуют» как реальные ошибки.


51
1

Ответ:

Решено

Установив continueOnError: true на задаче CopyFilesOverSSH@0, вы можете перейти к следующей задаче, если она сообщит об ошибке.

Задача не поддерживается, чтобы различать ошибки и рассматривать ее как нормальную или реальную ошибку.

Согласно вашему требованию:

Detect the presence of the files on the remote server in an earlier task so that I can skip this copy task in the condition clause.

Вы можете добавить предварительную задачу ssh@0 для обнаружения файлов, пример кода ниже:

- task: SSH@0
  inputs:
    sshEndpoint: 'your_ssh_service_connection'
    runOptions: 'commands'
    commands: |
      if [ -f /pathonremote/myBuildArtifactFile ]; then
        echo "##vso[task.setvariable variable=fileExists;isOutput=true]true"
      else
        echo "##vso[task.setvariable variable=fileExists;isOutput=true]false"
      fi
  name: CheckFile

условно запустите задачу CopyFilesOverSSH@0:

- task: CopyFilesOverSSH@0
  condition: ne(variables['CheckFile.fileExists'], 'true')
  inputs:
    sshEndpoint: 'your_ssh_service_connection'
    ...