Jenkins Pipeline Job with file parameter

前端 未结 8 1925
难免孤独
难免孤独 2020-12-01 10:33

I\'m putting together a Jenkins pipeline job which will take a file parameter. I can trigger the job and point it at a file however I can\'t find where the file has ended up

相关标签:
8条回答
  • 2020-12-01 10:49

    Solved it the following way:

    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()
        }
    }
    

    I know the solution is not that beautiful because the pipeline gets interrupted for the upload but it works.

    Further the "copyFrom" is necessary, because the input stores the "data.zip" in the jobs directory and not in the workspace (don't know why)

    0 讨论(0)
  • 2020-12-01 10:51

    Tried what Christoph suggested and it didnt work for me. Here is what worked for me and the setup which I have, his should help others figure out what to do.

    Problem: I am executing my pipeline on dedicated nodes and use sanitized workspaces. After some research and troubleshooting I found out that by default the file upload only works with Master node. I realized this after digging through the file system and finding the file I am uploading in the workspace on the master

    Solution:

    stage('Upload Key') {
        agent { label 'master' }
        steps {
            script {
                // Uploads file via master node and stases it for other nodes to access
                def inputFile = input message: 'Upload file', parameters: [file(name: "key.p12")]
                new hudson.FilePath(new File("${workspace}/key.p12")).copyFrom(inputFile)
                inputFile.delete()
            }
            stash name: 'key.p12' , includes: "key.p12"
        }
    }
        stage('Register') {
            steps {
                ws (sanitizedWorkspaceName) {
                    echo "Registering"
                    unstash 'key.p12'
                }
            }
        }
    
    1. Execute the suggested file copy solution by Christoph. This stores the file in the job workspace on the master node
    2. Allow the scripts in Manage Jenkins > In Process Script approval
    3. use the stash step to stash the uploaded file
    4. In the target stage "running on a different node" use the unstash

    Hope this helps

    0 讨论(0)
  • 2020-12-01 10:52

    There is currently an issue with pipeline and file parameter (https://issues.jenkins-ci.org/browse/JENKINS-27413).

    0 讨论(0)
  • 2020-12-01 11:02

    I tried using the solution provided by @Christoph Forster , but the input File was not getting copied anywhere in the workspace . So I used the workaround as provided in https://bitbucket.org/janvrany/jenkins-27413-workaround-library/src/6b7dada8ea37?at=default

    The library provides a new library - unstashParam - that saves the file build parameter into a workspace. Works fine with text and yaml file .

    0 讨论(0)
  • 2020-12-01 11:04

    Found a WA (Strictly for text based file input) We can use Jenkins multi-line string parameter and ask user to paste file contents to it. And in our pipeline, write contents of this parameter using pipeline step writeFile, as :

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

    0 讨论(0)
  • 2020-12-01 11:08

    I also tried using the solution by @Christoph Forster but I received a script security error when Groovy Sandbox is enable

    org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new hudson.FilePath java.io.File
    

    However, it seems we can skip the file copying and deleting actions (and bypass the Groovy sandbox restriction) by simply requiring that the file is uploaded to the job workspace. Just add the workspace variable to the file name as follows:

    stage("upload") {
    def inputFile = input message: 'Upload file', parameters: [file(name: "$workspace/data.zip")]
            }
    
    0 讨论(0)
提交回复
热议问题