Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to "reduce" Jenkins Pipeline output path

We were building our solution without any "Pipeline" in Jenkins until recently, so I'm currently in the progress to move our build to multibranch pipelines.

The issue that I'm running into is that we have a lot of structure une our solution(lot of subfolder, and sometimes some big names).

Currently, the jenkins pipeline extract everything in a folder that looks like:

D:\ws\ght-build_feature_pipelines-TMQ33LB5OQIQ5VXVMFKFDG2HWCD4MUOGEGUWJUOMZ5D2GI42BIQA

Which is very-long, and now we are reaching the 260 characters limit of MSBuild:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2991,5): error MSB3553: Resource file "obj\Release\xx.aaaaaaaaaa.yyy.bbbbbb.dddddddddddddd.yyyyyyy.vvv.dddddddddd.Resources.resources" has an invalid name. The item metadata "%(FullPath)" cannot be applied to the path "obj\Release\xx.aaaaaaaaaa.yyy.bbbbbb.dddddddddddddd.yyyyyyy.vvv.dddddddddd.Resources.resources". The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. [D:\ws\ght-build_feature_pipelines-TMQ33LB5OQIQ5VXVMFKFDG2HWCD4MUOGEGUWJUOMZ5D2GI42BIQA\Src\bbbbbb\dddddd\dddddddddddddd\yyyyyyy\xx.aaaaaaaaaa.yyy.bbbbbb.dddddddddddddd.yyyyyyy.vvv\xx.aaaaaaaaaa.yyy.bbbbbb.dddddddddddddd.yyyyyyy.vvv.csproj]

We have so much cases where the length is big that it's really a big job to refactor everything, so I'm looking on how to specify to jenkins a smaller path?

like image 313
J4N Avatar asked Jun 13 '18 14:06

J4N


People also ask

What is lightweight checkout in Jenkins pipeline?

The Jenkins Pipeline plugin has a feature known as "lightweight checkout", where the master only pulls the Jenkinsfile from the repo, as opposed to the entire repo. There's a corresponding checkbox in the configuration screen.

How do you scale Jenkins?

Resilient Jenkins ArchitectureAdding build nodes to a Jenkins instance while beefing up the machine that runs the Jenkins controller is the typical way to scale Jenkins. Said differently, administrators scale their Jenkins controller vertically. However, there is a limit to how much an instance can be scaled.

What is checkout SCM in Jenkins?

1. The checkout step will checkout code from source control; scm is a special variable which instructs the checkout step to clone the specific revision which triggered this Pipeline run.


2 Answers

What I finally did:

pipeline {
    agent {
        node{
            label 'windows-node'
            customWorkspace "D:\\ws\\${env.BRANCH_NAME}"            
        }
    }
    options{
        skipDefaultCheckout()
    }
...
}

And I've a step that does the checkout. It was easier for me to have a "per-job" behavior, without touching jenkins global settings.

like image 93
J4N Avatar answered Sep 21 '22 10:09

J4N


Update (for any recent Jenkins instances)

Turns out that with recent Jenkins versions PATH_MAX seems to be ignored. The only thing it does: Issue a warning in the Jenkins log when smaller than a certain value, which actually does not matter - as the setting itself will anyways be ignored (as seen on Jenkins 2.249.3). See also: JENKINS-2111

As far as I can tell - the new setting was introduced in jenkins-branch-api 2.0.21:

There's a new property introduced: MAX_LENGTH. This defaults to 32 characters by default.

You can set it the same way like PATH_MAX:

As a java property - to ensure that Jenkins will start using the right setting, e.g.:

-Djenkins.branch.WorkspaceLocatorImpl.MAX_LENGTH=40

or during run-time, using the script console:

jenkins.branch.WorkspaceLocatorImpl.MAX_LENGTH=40

For older Jenkins instances

Actually there's a java property you can set to specify the length of the directory name, e.g.:

-Djenkins.branch.WorkspaceLocatorImpl.PATH_MAX=20

To make it permanent you have to specify this property in the Jenkins java startup configuration file.

You may also read and write this property using the Jenkins script console for temporary changes or to just give it a try as it takes effect immediately, e.g.

println jenkins.branch.WorkspaceLocatorImpl.PATH_MAX
jenkins.branch.WorkspaceLocatorImpl.PATH_MAX = 20
println jenkins.branch.WorkspaceLocatorImpl.PATH_MAX

Setting this value to 0 changes the path generation behavior.

For details please check:
https://issues.jenkins-ci.org/browse/JENKINS-34564
https://issues.jenkins-ci.org/browse/JENKINS-38706

like image 37
Joerg S Avatar answered Sep 20 '22 10:09

Joerg S