Eu tenho um pipeline com script que preciso fazer checkout em um repositório, em vez de localmente. No entanto, quando eu o adiciono ao git, o trabalho falha instantaneamente. Aqui está o script de trabalho;
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()
}
}
}
Tento convertê-lo mudando; node {
para;
#!/usr/bin/env groovy
def INSTANCE_ID = ""
pipeline {
agent any
stages {
O resto permanece o mesmo. Estou tendo o erro a seguir;
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
Responder1
Você já conseguiu fazer isso funcionar? É difícil dizer sem ver o restante do Jenkinsfile depois de tentar convertê-lo. Mas a saída de erro que você colou parece que algo está acontecendo além de apenas problemas de sintaxe declarativa. Uma versão simplificada que posso oferecer com base na versão com script pode ser mais ou menos assim:
#!/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()
}
}
}
}
}
Espero que isso ajude.
Poderia ter sido o script {}
invólucro do sh(returnStdout: true, script: ...
papel. Acho que isso pode importar.
Responder2
Você não precisa converter para um pipeline declarativo; apenas siga o Scripted se funcionar para você. De modo geral, é muito mais difícil converter pipelines com script em pipelines declarativos do que o contrário. Se você tiver um Scripted Pipeline funcionando, não o altere, apenas coloque o script do Pipeline funcional em seu arquivo Jenkins em seu repositório Git e ele deve funcionar perfeitamente.