У меня есть приведенная ниже задача 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
к задаче, и сборка продолжается, но в сборке по-прежнему отображаются ошибки. Было бы неплохо иметь возможность различать проблему «файлы существуют» как норму и ошибки типа «невозможно подключиться к серверу» или «исходные файлы не существуют» как реальные ошибки.
@RuiJarimba Я не хочу удалять существующие файлы выпуска из-за сборок, имеющих контрольные суммы sha256, и пересборка может изменить их. Поэтому заменяйте только в том случае, если возникла проблема, требующая этого, и это было сделано вручную и намеренно. Но тем временем конвейер сборки может быть повторно запущен.
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'
...
Спасибо, мне пришлось сделать вариацию этого. Я не смог заставить его работать, используя runOptions: 'commands'
. Вместо этого я перешел на inline
, поставив inline:
вместо commands:
, и это сработало. Кроме того, мне пришлось использовать глобальную переменную, поскольку я нахожусь в шаблоне, и мне не удалось получить задачи с уникальными именами, которые работают с доступом к переменным, определенным в задаче. И задачу проверки я переместил вверх. Если это релизная сборка и у меня уже есть артефакты для этой версии, то даже не беспокойтесь о ее сборке.
Также добавлено echo "##vso[task.logissue type=warning]Release files already exist"
предупреждающее сообщение об истинном случае. Это дает обратную связь, не делая сборку незеленой.
Может быть, попробовать установить
cleanTargetFolder: true
и/илиcleanHiddenFilesInTarget: true
? Перед копированием будут удалены все существующие файлы и подпапки в целевой папке.