Tengo una canalización con secuencia de comandos que necesito verificar desde un repositorio en lugar de tenerla localmente. Sin embargo, cuando lo agrego a git, el trabajo falla instantáneamente. Aquí está el guión de trabajo;
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()
}
}
}
Intento convertirlo cambiando; node {
a;
#!/usr/bin/env groovy
def INSTANCE_ID = ""
pipeline {
agent any
stages {
El resto sigue igual. Obtuve el siguiente error;
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
Respuesta1
¿Alguna vez lograste que esto funcionara? Es difícil saberlo sin ver el resto del archivo Jenkins después de intentar convertirlo. Pero el resultado de error que pegaste parece que está sucediendo algo más además de problemas de sintaxis declarativa. Una versión simplificada que puedo ofrecer basada en la versión con guión podría verse así:
#!/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()
}
}
}
}
}
Ojalá eso ayude.
Podría haber sido el script {}
envoltorio del sh(returnStdout: true, script: ...
papel. Creo que eso podría importar.
Respuesta2
No es necesario realizar la conversión a un canal declarativo; simplemente quédese con Scripted si funciona para usted. En términos generales, es mucho más difícil convertir canalizaciones programadas en canalizaciones declarativas que al revés. Si tiene un scripted Pipeline en funcionamiento, no lo cambie en absoluto, simplemente coloque el script del Pipeline en funcionamiento en su Jenkinsfile en su repositorio Git y debería funcionar bien.