jenkinsci / file-operations-plugin

File Operations as Build Step in Jenkins
https://plugins.jenkins.io/file-operations
33 stars 31 forks source link

folderRenameOperation fails for no obvious reason #118

Closed fidelski closed 3 months ago

fidelski commented 3 months ago

Jenkins and plugins versions report

Environment ```text Jenkins: 2.462.1 OS: Linux - 6.10.3-arch1-2 Java: 17.0.12 - Eclipse Adoptium (OpenJDK 64-Bit Server VM) --- analysis-model-api:12.4.0 ant:511.v0a_a_1a_334f41b_ antisamy-markup-formatter:162.v0e6ec0fcfcf6 apache-httpcomponents-client-4-api:4.5.14-208.v438351942757 apache-httpcomponents-client-5-api:5.3.1-110.v77252fb_d4da_5 asm-api:9.7-33.v4d23ef79fcc8 authentication-tokens:1.119.v50285141b_7e1 basic-branch-build-strategies:81.v05e333931c7d blueocean:1.27.14 blueocean-autofavorite:1.2.5 blueocean-bitbucket-pipeline:1.27.14 blueocean-commons:1.27.14 blueocean-config:1.27.14 blueocean-core-js:1.27.14 blueocean-dashboard:1.27.14 blueocean-display-url:2.4.3 blueocean-events:1.27.14 blueocean-git-pipeline:1.27.14 blueocean-github-pipeline:1.27.14 blueocean-i18n:1.27.14 blueocean-jwt:1.27.14 blueocean-personalization:1.27.14 blueocean-pipeline-api-impl:1.27.14 blueocean-pipeline-editor:1.27.14 blueocean-pipeline-scm-api:1.27.14 blueocean-rest:1.27.14 blueocean-rest-impl:1.27.14 blueocean-web:1.27.14 bootstrap5-api:5.3.3-1 bouncycastle-api:2.30.1.78.1-248.ve27176eb_46cb_ branch-api:2.1178.v969d9eb_c728e build-timeout:1.33 caffeine-api:3.1.8-133.v17b_1ff2e0599 checks-api:2.2.0 cloudbees-bitbucket-branch-source:888.v8e6d479a_1730 cloudbees-folder:6.942.vb_43318a_156b_2 command-launcher:115.vd8b_301cc15d0 commons-compress-api:1.26.1-2 commons-lang3-api:3.14.0-76.vda_5591261cfe commons-text-api:1.12.0-129.v99a_50df237f7 config-file-provider:973.vb_a_80ecb_9a_4d0 configuration-as-code:1836.vccda_4a_122a_a_e configuration-as-code-groovy:1.1 credentials:1371.vfee6b_095f0a_3 credentials-binding:681.vf91669a_32e45 data-tables-api:2.0.8-1 display-url-api:2.204.vf6fddd8a_8b_e9 docker-commons:443.v921729d5611d docker-workflow:580.vc0c340686b_54 dtkit-api:3.0.2 durable-task:568.v8fb_5c57e8417 echarts-api:5.5.0-1 eddsa-api:0.3.0-4.v84c6f0f4969e email-ext:1814.v404722f34263 emailext-template:1.5 embeddable-build-status:487.va_0ef04c898a_2 external-monitor-job:215.v2e88e894db_f8 favorite:2.221.v19ca_666b_62f5 file-operations:266.v9d4e1eb_235b_a_ font-awesome-api:6.5.2-1 forensics-api:2.4.0 generic-webhook-trigger:2.2.2 git:5.3.0 git-client:5.0.0 github:1.40.0 github-api:1.321-468.v6a_9f5f2d5a_7e github-branch-source:1793.v1831e9c68d77 gitlab-api:5.6.0-97.v6603a_83f8690 gitlab-branch-source:704.vc7f1202d7e14 gitlab-logo:1.1.2 gradle:2.12 gson-api:2.11.0-41.v019fcf6125dc handy-uri-templates-2-api:2.1.8-30.v7e777411b_148 htmlpublisher:1.36 http_request:1.19 instance-identity:185.v303dc7c645f9 ionicons-api:74.v93d5eb_813d5f jackson2-api:2.17.0-379.v02de8ec9f64c jakarta-activation-api:2.1.3-1 jakarta-mail-api:2.1.3-1 javadoc:280.v050b_5c849f69 javax-activation-api:1.2.0-7 javax-mail-api:1.6.2-10 jaxb:2.3.9-1 jdk-tool:80.v8a_dee33ed6f0 jenkins-design-language:1.27.14 jersey2-api:2.44-151.v6df377fff741 jjwt-api:0.11.5-112.ve82dfb_224b_a_d job-dsl:1.87 joda-time-api:2.12.7-29.v5a_b_e3a_82269a_ jquery3-api:3.7.1-2 jsch:0.2.16-86.v42e010d9484b_ json-api:20240303-41.v94e11e6de726 json-path-api:2.9.0-58.v62e3e85b_a_655 junit:1284.vf75d778f98c5 ldap:725.v3cb_b_711b_1a_ef lockable-resources:1255.vf48745da_35d0 mailer:472.vf7c289a_4b_420 mapdb-api:1.0.9-40.v58107308b_7a_7 matrix-auth:3.2.2 matrix-project:832.va_66e270d2946 mina-sshd-api-common:2.13.1-117.v2f1a_b_66ff91d mina-sshd-api-core:2.13.1-117.v2f1a_b_66ff91d okhttp-api:4.11.0-172.vda_da_1feeb_c6e pam-auth:1.11 pipeline-build-step:540.vb_e8849e1a_b_d8 pipeline-github-lib:61.v629f2cc41d83 pipeline-graph-analysis:216.vfd8b_ece330ca_ pipeline-groovy-lib:727.ve832a_9244dfa_ pipeline-input-step:495.ve9c153f6067b_ pipeline-maven:1421.v610fa_b_e2d60e pipeline-maven-api:1421.v610fa_b_e2d60e pipeline-milestone-step:119.vdfdc43fc3b_9a_ pipeline-model-api:2.2205.vc9522a_9d5711 pipeline-model-definition:2.2205.vc9522a_9d5711 pipeline-model-extensions:2.2205.vc9522a_9d5711 pipeline-rest-api:2.34 pipeline-stage-step:312.v8cd10304c27a_ pipeline-stage-tags-metadata:2.2205.vc9522a_9d5711 pipeline-stage-view:2.34 pipeline-utility-steps:2.17.0 plain-credentials:183.va_de8f1dd5a_2b_ plugin-util-api:4.1.0 prism-api:1.29.0-15 publish-over:0.22 publish-over-cifs:0.16 pubsub-light:1.18 resource-disposer:0.23 scm-api:696.v778d637b_a_762 script-security:1341.va_2819b_414686 snakeyaml-api:2.2-121.v5a_68b_9300b_d4 sse-gateway:1.27 ssh-credentials:343.v884f71d78167 ssh-slaves:2.973.v0fa_8c0dea_f9f sshd:3.330.vc866a_8389b_58 structs:338.v848422169819 subversion:1269.v53185011cd9f text-finder:1.29 timestamper:1.27 token-macro:400.v35420b_922dcb_ trilead-api:2.147.vb_73cc728a_32e variant:60.v7290fc0eb_b_cd warnings-ng:11.4.0 workflow-aggregator:600.vb_57cdd26fdd7 workflow-api:1332.vc21122317a_8e workflow-basic-steps:1058.vcb_fc1e3a_21a_9 workflow-cps:3922.va_f73b_7c4246b_ workflow-durable-task-step:1364.v2fd76fb_6fd41 workflow-job:1436.vfa_244484591f workflow-multibranch:795.ve0cb_1f45ca_9a_ workflow-scm-step:427.v4ca_6512e7df1 workflow-step-api:678.v3ee58b_469476 workflow-support:920.v59f71ce16f04 ws-cleanup:0.46 xunit:3.1.4 ```

What Operating System are you using (both controller, and any agents involved in the problem)?

Arch Linux x86_64

Reproduction steps

  1. Use folderRenameOperation in pipeline with destination folder outside source folder
  2. Execute the pipeline
  3. Watch it fail

Example pipeline:

pipeline {
    agent any

    stages {
        stage ('Test folder rename') {
            steps {
                dir ('from/folder') {
                    writeFile file: 'bla.txt', text: 'Blabla'
                }

                dir ('to/folder') {
                    writeFile file: '.keep', text: ''
                }

                dir ('from') {
                    script {
                        findFiles ().each {entry ->
                            fileOperations ([
                                folderRenameOperation ([
                                    source: entry.name,
                                    destination: "to/folder/${entry.name}"
                                ])
                            ])
                        }
                    }
                }
            }
        }
    }
}

As per documentation the destination folder is treated as starting from workspace ("base directory is workspace").

Expected Results

The rename operation succeeds.

Actual Results

The operation fails, there is no useful error message that would explain why it fails. It shows the following error in the log:

Folder Rename Operation:

File Operations failed.
fidelski commented 3 months ago

The problem is the encosing dir - the statement in the docs that the destination directory starts at WORKSPACE is misleading. Its actually not workspace but the current working directory (to me that's not the same). So it works when specifying the full path:

fileOperations ([
    folderRenameOperation ([
        source: entry.name,
        destination: "${WORKSPACE}/to/folder/${entry.name}"
    ])
])