Ссылка на выходную переменную cmd в Jenkinsfile для windows - PullRequest
0 голосов
/ 25 марта 2019

Я довольно новичок в groovy. В моем Jenkinsfile я пытаюсь сохранить выходные данные windows cmd в переменной, использовать их в следующей команде, но, похоже, ничего не работает.Это самое близкое, что я получил:

    pipeline {
    agent any    
    stages {        
        stage('package-windows') {
            when {
                expression { isUnix() == false}
            }
            steps {             
                script {
                FILENAME = bat(label: 'Get file name', returnStdout: true, script:"dir \".\\archive\\%MY_FOLDER%\\www\\main.*.js\" /s /b")              
                }
                bat label: 'replace content', script: "powershell -Command \"(gc \"$FILENAME\") -replace \"https://my-qa.domain.com/api/\", \"https://my-prod.domain.com/api/\" | Out-File \"$FILENAME\"\""
            }
        }
    }
}

Когда я делаю ECHO "$FILENAME", это вывод, который я получаю:

C:\Program Files (x86)\Jenkins\workspace\my-ui>dir ".\archive\55131c0d3c28dc69ce39572eaf2f8585996d9108\main.*.js" /s /b 
C:\Program Files (x86)\Jenkins\workspace\my-ui\archive\55131c0d3c28dc69ce39572eaf2f8585996d9108\www\main.16aedaf4c6be4e47266d.js

Все, что мне нужно, это имя файла main.16aedaf4c6be4e47266d.js дляиспользоваться в следующей команде для изменения содержимого.Но в следующей команде "$FILENAME" пусто.Как правильно сохранить вывод команды в переменной и получить доступ к следующим командам?

1 Ответ

1 голос
/ 25 марта 2019

Проблема в том, что вы фиксируете полный вывод команды, включая 2 строки.Первая строка - это текущий путь с помощью команды dir, вторая - требуемый вывод.При первом появлении команды вы увидите следующее: команда + вывод.Затем последующее использование приведет к тому, что результат будет выглядеть пустым, но на самом деле это запутанная строка, поскольку переменная FILENAME содержит 2 строки, каждая из которых имеет новую строку в конце.

Добавление @ перед пакетной командойпредотвратит его повторение, и это то, что вы хотите.Теперь переменная FILENAME будет содержать только одну строку с вашим именем файла.Тем не менее, вам нужно будет обрезать CRLF из результата, иначе он испортит вашу следующую команду powershell.

Я думаю, что приведенный ниже скрипт должен работать лучше.

pipeline {
    agent any
    stages {        
        stage('package-windows') {
            when {
                expression { isUnix() == false}
            }
            steps {             
                script {
                  FILENAME = bat(label: 'Get file name', returnStdout: true, script:"@dir \".\\archive\\%MY_FOLDER%\\www\\main.*.js\" /s /b").trim()
                }
                echo FILENAME
                bat label: 'replace content', script: "powershell -Command (gc \"$FILENAME\") -replace \"https://my-qa.domain.com/api/\", \"https://my-prod.domain.com/api/\""
            }
        }
    }
}
...