How to determine the current operating system in a Jenkins pipeline

后端 未结 5 1286
醉梦人生
醉梦人生 2020-12-28 21:31

What would be the way to determine the current OS a Jenkins pipeline is running?

Context: I\'m building a shared Jenkins pipeline script that should run on all platf

相关标签:
5条回答
  • 2020-12-28 21:37

    The workaround I found for this is

    try{
       sh(script: myScript, returnStdout: true)
     }catch(Exception ex) {
        //assume we are on windows
       bat(script: myScript, returnStdout: true)
     }
    

    Or a little bit more elegant solution without using the try/catch is to use the env.NODE_LABELS. Assuming you have all the nodes correctly labelled you can write a function like this

    def isOnWindows(){
        def os = "windows"
        def List nodeLabels  = NODE_LABELS.split()
        for (i = 0; i <nodeLabels.size(); i++) 
        {
            if (nodeLabels[i]==os){
            return true
            }
       }
        return false
     }
    

    and then

    if (isOnWindows()) {
        def osName = bat(script: command, returnStdout: true)   
    } else {
        def osName = sh(script: command, returnStdout: true)
    }
    
    0 讨论(0)
  • 2020-12-28 21:38

    Using Java classes is probably not the best approach. I'm pretty sure that unless it's a jenkins / groovy plugin, those run on the master Jenkins JVM thread. I would look into a shell approach, such as the one outlined here: https://stackoverflow.com/a/8597411/5505255

    You could wrap that script in a shell step to get the stdout like so:

    def osName = sh(script: './detectOS', returnStdout: true)
    

    to call a copy of the script being outlined above. Then just have that script return the OS names you want, and branch logic based on the osName var.

    0 讨论(0)
  • 2020-12-28 21:47

    As far as I know Jenkins only differentiates between windows and unix, i.e. if on windows, use bat, on unix/mac/linux, use sh. So you could use isUnix(), more info here, to determine if you're on unix or windows, and in the case of unix use sh and @Spencer Malone's answer to prope more information about that system (if needed).

    0 讨论(0)
  • 2020-12-28 21:49

    I initially used @fedterzi answer but I found it problematic because it caused the following crash:

    org.jenkinsci.plugins.workflow.steps.MissingContextVariableException: Required context class hudson.Launcher is missing
    

    when attempting to call isUnix() outside of a pipeline (for example assigning a variable). I solved by relying on traditional Java methods to determine Os:

    def getOs(){
        String osname = System.getProperty('os.name');
        if (osname.startsWith('Windows'))
            return 'windows';
        else if (osname.startsWith('Mac'))
            return 'macosx';
        else if (osname.contains('nux'))
            return 'linux';
        else
            throw new Exception("Unsupported os: ${osname}");
    }
    

    This allowed to call the function in any pipeline context.

    0 讨论(0)
  • 2020-12-28 21:55

    Assuming you have Windows as your only non-unix platform, you can use the pipeline function isUnix() and uname to check on which Unix OS you're on:

    def checkOs(){
        if (isUnix()) {
            def uname = sh script: 'uname', returnStdout: true
            if (uname.startsWith("Darwin")) {
                return "Macos"
            }
            // Optionally add 'else if' for other Unix OS  
            else {
                return "Linux"
            }
        }
        else {
            return "Windows"
        }
    }
    
    0 讨论(0)
提交回复
热议问题