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.