У меня есть приведенная ниже задача 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.
Как мне либо:
condition
.ОБНОВЛЕНИЕ: я добавил continueOnError: true
к задаче, и сборка продолжается, но в сборке по-прежнему отображаются ошибки. Было бы неплохо иметь возможность различать проблему «файлы существуют» как норму и ошибки типа «невозможно подключиться к серверу» или «исходные файлы не существуют» как реальные ошибки.
Установив 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'
...