Неудачный конвейер Jenkins при ошибке чтения файла при чтении файла - PullRequest
0 голосов
/ 16 сентября 2018

Я пишу сценарий с конвейером как часть многоотраслевого конвейера, в котором мне нужно прочитать пары ключ-значение из файла JSON.Когда я запускаю конвейер, я получаю следующую ошибку: /home/jenkins/workspace/dMyproject-QRMU74PK33RGCZRTDPVXCWOT55L2NNSXNPY2LJQ5R2UIIYSJR2RQ@tmp/durable-c4b5faa2/script.sh * 100 * мой код поиска 100: * найден * заменитель * 100 * * * * * * * *2 *в частности, эта строка вызывает ошибку:

String fileContents = new File( ".env" ).text;

Но я не могу выяснить, что именно не так.Мой файл env выглядит так:

{
"key" :"value",
"key2" :"value2"
}
import groovy.json.JsonSlurper
import java.io.File 


node('google-cloud-node') {
   dockerfile {
      filename 'BuildDockerfile'
    }
    currentBuild.result = "SUCCESS"
    try {
        String dockerFileName = "BuildDockerfile"
        def customImage = docker.build("my-image:${env.BUILD_ID}","-f ${dockerFileName} .")

        customImage.inside('-u root') {
            stage('Checkout'){
                checkout scm
            }
            stage('Build'){
              notify("#test-ci-builds","Oh, time to  build something!")
                sh '''
                set +x
                whoami
                pwd
                npm install
                npm build
               '''
             }
             stage('Deploy') {
                        parseArgsFile()
                        withCredentials([file(credentialsId: "scanner-dev-ssh-service-account", variable: 'ID')]) {
                            sh '''
                              set +x
                              gcloud auth activate-service-account jenkins-test1@scanner-dev-212008.iam.gserviceaccount.com --key-file=$ID  --project=scanner-dev-212008
                              gcloud compute --project scanner-dev-212008 ssh --zone us-west2-a ubuntu@docker-slave --command "uname -a"
                            '''
                        }
             }
         }
    }
    catch (err) {
        notify("#test-ci-builds","Oh, crap!")
        currentBuild.result = "FAILURE"
            sh 'echo  ${env.BUILD_URL}'
        throw err
    }

}

def notify(channel,text) {
  slackSend (channel: "${channel}", message: "${text}", teamDomain: "distillery-tech", token: "0W6205gwiR1CEVOV4iMFiNQw")
}

def parseArgsFile(params=null){

    String fileContents = new File( ".env" ).text;
    def InputJSON = new JsonSlurper().parseText(inputFile.text)
    InputJSON.each{ println it }
}

1 Ответ

0 голосов
/ 16 сентября 2018

Короткий ответ

Вместо использования new File и JsonSlurper просто используйте шаг readJSON.

Длинный ответ

В вашем распоряжении более одной проблемыскрипт:

  1. Вы не можете использовать File объекты в конвейере.На самом деле вы можете, но на эти файлы всегда будет ссылаться мастер Дженкинс, и для этого потребуется отключить песочницу.Вы не можете читать файлы из агента сборки, используя объект File.Вместо этого используйте шаг конвейера readFile
  2. JsonSlurper нельзя использовать в простом коде конвейера, поскольку он не реализует интерфейс Serializable.Вам нужно будет заключить все в метод @NonCPS.Однако вы не должны этого делать, поскольку код @NonCPS не может быть прерван или продолжен после перезапуска, и есть шаг утилиты readJSON Pipeline.
...