Передача значения переменной в различные локальные области в файле Jenkins с помощью Powershell - PullRequest
0 голосов
/ 25 августа 2018

Я разрабатываю файл Jenkins для создания тестового конвейера.

Я изо всех сил пытался найти решение для следующего:

В файле Jenkins я добавил этап, на котором я хочу публиковать отчет Nunit после завершения тестов, однако для каждого запуска создается папка с меткой даты и времени, поэтому важно всегда выбирать последняя папка из списка. Моя проблема заключается в том, что я использую команду powershell для получения имени последней созданной папки и выполняю эту команду в определенном пути к каталогу следующим образом:

stage('Publish NUnit Test Report'){

                        dir('C:\\Jenkins\\workspace\\QA-Test-Pipeline\\iGCAutomation.Runner\\Reports') {

                        powershell 'echo "Set directory"'

                        powershell 'New-Variable -Name "testFile" -Value (gci|sort LastWriteTime|select -last 1).Name  -Scope global'

                        powershell 'Get-Variable -Name "testFile"'

                    }

                    testFile = powershell 'Get-Variable -Name "testFile"'

                    dir("C:\\Jenkins\\workspace\\QA-Test-Pipeline\\iGCAutomation.Runner\\Reports\\" + testFile + "\\") {

                        powershell 'Get-Location'

                        powershell 'copy-item "TestResultNUnit3.xml" -destination "C:\\Jenkins\\workspace\\QA-Test-Pipeline\\iGCAutomation.Runner\\Reports\\NUnitXmlReport" -force'                         
                    }    

                    dir('C:\\Jenkins\\workspace\\QA-Test-Pipeline\\iGCAutomation.Runner\\Reports\\NUnitXmlReport'){

                        nunit testResultsPattern: 'TestResultNUnit3.xml'
                    }
                }

Как вы можете заметить, я пытаюсь создать новую переменную с именем 'testFile', в которой хранится значение имени последней папки, но когда я перехожу к следующей части скрипта, которая требует смены каталога снова, переменная testfile не создается, и при попытке получить ее значение выдается исключение.

Все, что я хотел бы сделать, это получить имя последней созданной папки и передать его этой части скрипта, чтобы перейти на новый путь к каталогу.

dir("C:\\Jenkins\\workspace\\QA-Test-Pipeline\\iGCAutomation.Runner\\Reports\\" + testFile + "\\")

Я пробовал много решений в Интернете, но, похоже, ничего не работает. Powershell в Groovy-песочнице не всегда работает так, как я ожидаю.

1 Ответ

0 голосов
/ 26 августа 2018

Вместо многократного запуска powershell объедините все сценарии вместе и выполните powershell только один раз. Каждый раз, когда powershell заканчивается, все переменные удаляются.

Решение:

  1. Создайте файл с именем Copy-NUnitResults.ps1:

    # Filename: Copy-NUnitResults.ps1
    $reportsSrcDir = 'C:\Jenkins\workspace\QA-Test-Pipeline\iGCAutomation.Runner\Reports'
    $reportDestDir = 'C:\Jenkins\workspace\QA-Test-Pipeline\iGCAutomation.Runner\Reports\NUnitXmlReport'
    
    Push-Location $reportsSrcDir
    $testFile = (gci|sort LastWriteTime|select -last 1).Name
    Pop-Location
    
    Push-Location "$reportsSrcDir\$testFile"
    Copy-Item TestResultNUnit3.xml -Destination $reportDest -Force
    Pop-Location
    
  2. Измените свой шаг Jenkins, чтобы он выглядел следующим образом

    stage('Publish NUnit Test Report'){
    
      # you may need to put in the full path to Copy-NUnitResults.ps1
      # e.g. powershell C:\\Jenkins\\Copy-NUnitResults.ps1
      powershell .\Copy-NUnitResults.ps1
    
      dir('C:\\Jenkins\\workspace\\QA-Test-Pipeline\\iGCAutomation.Runner\\Reports\\NUnitXmlReport'){
        nunit testResultsPattern: 'TestResultNUnit3.xml'
      }
    }
    
...