Ответ 1
В настоящее время существует проблема с параметрами конвейера и файла (https://issues.jenkins-ci.org/browse/JENKINS-27413).
Я собираю задание конвейера Jenkins, которое будет принимать параметр файла. Я могу запустить задание и указать его на файл, но я не могу найти, где находится файл (в обычной работе фристайла он будет в рабочей области).
Где загружен файл? Или параметры файла, которые в настоящее время не работают с конвейерами?
В настоящее время существует проблема с параметрами конвейера и файла (https://issues.jenkins-ci.org/browse/JENKINS-27413).
Решил это следующим образом:
node {
deleteDir()
stage("upload") {
def inputFile = input message: 'Upload file', parameters: [file(name: 'data.zip')]
new hudson.FilePath(new File("$workspace/data.zip")).copyFrom(inputFile)
inputFile.delete()
}
stage("checkout") {
echo fileExists('data.zip').toString()
}
}
Я знаю, что решение не такое красивое, потому что конвейер прерывается для загрузки, но он работает.
Кроме того, "copyFrom" необходимо, потому что вход сохраняет "data.zip" в каталоге заданий, а не в рабочей области (не знаю, почему)
Найдено WA (строго для ввода текстового файла) Мы можем использовать многострочный строковый параметр Jenkins и попросить пользователя вставить в него содержимое файла. И в нашем конвейере напишите содержимое этого параметра с помощью конвейера stepFile, как:
stage('File Param WA') {
writeFile file: 'demo.yaml', text: params.DEMO_YAML
}
Я попытался использовать решение, предоставленное @Christoph Forster, но входной файл не копировался нигде в рабочей области. Поэтому я использовал обходной путь, как это предусмотрено в https://bitbucket.org/janvrany/jenkins-27413-workaround-library/src/6b7dada8ea37?at=default
Библиотека предоставляет новую библиотеку - unstashParam - которая сохраняет параметр сборки файла в рабочее пространство. Хорошо работает с текстом и файлом yaml.
Я нашел решение в виде глобальной библиотеки здесь: https://bitbucket.org/janvrany/jenkins-27413-workaround-library/src/default/
Он содержит вызовы внутренних методов Jenkins, которые устарели (я думаю). Поэтому я сделал свою собственную версию так:
import hudson.FilePath
import hudson.model.ParametersAction
import hudson.model.FileParameterValue
import hudson.model.Executor
def call(String name, String fname = null) {
def paramsAction = currentBuild.rawBuild.getAction(ParametersAction.class);
if (paramsAction == null) {
error "unstashParam: No file parameter named '${name}'"
}
for (param in paramsAction.getParameters()) {
if (param.getName().equals(name)) {
if (! param instanceof FileParameterValue) {
error "unstashParam: not a file parameter: ${name}"
}
if (env['NODE_NAME'] == null) {
error "unstashParam: no node in current context"
}
if (env['WORKSPACE'] == null) {
error "unstashParam: no workspace in current context"
}
workspace = new FilePath(getComputer(env['NODE_NAME']), env['WORKSPACE'])
filename = fname == null ? param.getOriginalFileName() : fname
file = workspace.child(filename)
file.copyFrom(param.getFile())
return filename;
}
}
}
def getComputer(name){
for(computer in Jenkins.getInstance().getComputers()){
if(computer.getDisplayName() == name){
return computer.getChannel()
}
}
error "Cannot find computer for file parameter workaround"
}
Вы можете вставить его в глобальную библиотеку, а затем использовать его следующим образом:
library "file-workaround"
node {
def file_in_workspace = unstashParam "myFile"
sh "cat ${file_in_workspace}"
}
Это не красиво, но работает, и пока нет официального исправления, это мой лучший шанс.
Обновление
Оказывается, вы можете столкнуться с "Нет такого файла или каталога". Это потому, что ничто в обходном пути не запускает Jenkins для создания каталога рабочей области. Если это сработало где-то еще в pipeопроводе, хорошо, иначе вы почесаете голову.
Вы можете бросить
touch "thisIsAFile"
там
Я также попытался использовать решение @Christoph Forster, но получил сообщение об ошибке безопасности сценария, когда Groovy Sandbox включен
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new hudson.FilePath java.io.File
Однако кажется, что мы можем пропустить действия по копированию и удалению файлов (и обойти ограничение песочницы Groovy), просто потребовав загрузки файла в рабочую область задания. Просто добавьте переменную рабочей области к имени файла следующим образом:
stage("upload") {
def inputFile = input message: 'Upload file', parameters: [file(name: "$workspace/data.zip")]
}