Konvertieren Sie ein Jenkins-Skript in eine deklarative Pipeline

Konvertieren Sie ein Jenkins-Skript in eine deklarative Pipeline

Ich habe eine geskriptete Pipeline, die ich aus einem Repo auschecken muss, anstatt sie lokal zu haben. Wenn ich sie jedoch zu Git hinzufüge, schlägt der Job sofort fehl. Hier ist das funktionierende Skript:

node {
    INSTANCE_ID = ""

    stage('Get Instance Id') {
        INSTANCE_ID = sh (
            script: 'aws ec2 describe-instances --region=$awsRegion --filters Name=tag:Name,Values=\"$instanceName\" --query \'Reservations[0].Instances[0].InstanceId\'',
            returnStdout: true
        ).trim()

        if (INSTANCE_ID == "") {
            error 'No instance with the name ' + $instanceName + ' was found in the ' + $awsRegion + ' region.'
        }
    }

    stage('Start EC2 Instance') {
        sh ('aws ec2 start-instances --region=$awsRegion --instance-ids ' + INSTANCE_ID)
    }

    stage('Wait for instance to be running') {
        INSTANCE_STATE = sh (
            script: 'aws ec2 describe-instances --region=$awsRegion --instance-id ' + INSTANCE_ID + ' --query \'Reservations[0].Instances[0].State.Name\'',
            returnStdout: true
        ).trim()

        numberOfStatusChecksPerformed = 0
        while (INSTANCE_STATE != '"running"') {
            echo INSTANCE_STATE
            sleep 20
            numberOfStatusChecksPerformed = numberOfStatusChecksPerformed + 1

            // Wait 5 minutes
            if (numberOfStatusChecksPerformed > 15) {
                error 'Instance state was not running, it status is: ' + INSTANCE_STATE
            }

            INSTANCE_STATE = sh (
                script: 'aws ec2 describe-instances --region=$awsRegion --instance-id ' + INSTANCE_ID + ' --query \'Reservations[0].Instances[0].State.Name\'',
                returnStdout: true
            ).trim()
        }
    }
}

Ich versuche, es umzuwandeln, indem ich es node {in Folgendes ändere:

#!/usr/bin/env groovy

def INSTANCE_ID = ""

pipeline {
    agent any
    stages {

Der Rest bleibt gleich. Ich erhalte die folgende Fehlermeldung:

java.io.FileNotFoundException
    at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:167)
    at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:159)
    at jenkins.plugins.git.GitSCMFileSystem$3.invoke(GitSCMFileSystem.java:193)
    at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.withRepository(AbstractGitAPIImpl.java:29)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.withRepository(CliGitAPIImpl.java:72)
    at jenkins.plugins.git.GitSCMFileSystem.invoke(GitSCMFileSystem.java:189)
    at jenkins.plugins.git.GitSCMFile.content(GitSCMFile.java:159)
    at jenkins.scm.api.SCMFile.contentAsString(SCMFile.java:338)
    at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:110)
    at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:67)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:303)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:429)
Finished: FAILURE

Antwort1

Haben Sie das jemals zum Laufen gebracht? Das ist schwer zu sagen, ohne den Rest der Jenkins-Datei zu sehen, nachdem Sie versucht haben, sie zu konvertieren. Aber die von Ihnen eingefügte Fehlerausgabe scheint etwas anderes zu sein als nur Probleme mit der deklarativen Syntax. Eine vereinfachte Version, die ich basierend auf der geskripteten Version anbieten kann, könnte ungefähr so ​​aussehen:

#!/usr/bin/env groovy

def INSTANCE_ID = ""

pipeline {
  agent any
  options {
    // your options here
  }
  parameters {
    // your parameters here
  }
  environment {
    // KEY = "Value"
  }
  stages {
    stage('Get Instance Id') {
      steps {
        script {
          sh "./some_command.sh"
          INSTANCE_ID = sh(returnStdout: true, script: 'aws ec2 describe-instances ... ').trim()
        }
      }
    }
  }
}

Hoffentlich hilft das.

script {}Es könnte die Verpackung für das Teil gewesen sein sh(returnStdout: true, script: .... Ich denke, das könnte wichtig sein.

Antwort2

Sie müssen nicht zu einer deklarativen Pipeline wechseln. Bleiben Sie einfach bei Scripted, wenn es für Sie funktioniert. Generell ist es viel schwieriger, Scripted Pipelines in deklarative Pipelines umzuwandeln als umgekehrt. Wenn Sie eine funktionierende Scripted Pipeline haben, ändern Sie sie überhaupt nicht, sondern fügen Sie das funktionierende Pipeline-Skript einfach in Ihre Jenkins-Datei in Ihrem Git-Repository ein, und es sollte problemlos funktionieren.

verwandte Informationen