Jenkins Pipeline Job с параметром файла

Я собираю задание конвейера Jenkins, которое будет принимать параметр файла. Я могу запустить задание и указать его на файл, но я не могу найти, где находится файл (в обычной работе фристайла он будет в рабочей области).

Где загружен файл? Или параметры файла, которые в настоящее время не работают с конвейерами?

Ответ 2

Решил это следующим образом:

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" в каталоге заданий, а не в рабочей области (не знаю, почему)

Ответ 3

Найдено WA (строго для ввода текстового файла) Мы можем использовать многострочный строковый параметр Jenkins и попросить пользователя вставить в него содержимое файла. И в нашем конвейере напишите содержимое этого параметра с помощью конвейера stepFile, как:

stage('File Param WA') {
          writeFile file: 'demo.yaml', text: params.DEMO_YAML
}

Многострочный строковый параметр

Ответ 4

Я попытался использовать решение, предоставленное @Christoph Forster, но входной файл не копировался нигде в рабочей области. Поэтому я использовал обходной путь, как это предусмотрено в https://bitbucket.org/janvrany/jenkins-27413-workaround-library/src/6b7dada8ea37?at=default

Библиотека предоставляет новую библиотеку - unstashParam - которая сохраняет параметр сборки файла в рабочее пространство. Хорошо работает с текстом и файлом yaml.

Ответ 5

Я нашел решение в виде глобальной библиотеки здесь: 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"

там

Ответ 6

Я также попытался использовать решение @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")]
        }