로컬이 아닌 저장소에서 체크아웃해야 하는 스크립트된 파이프라인이 있습니다. 그러나 git에 추가하면 작업이 즉시 실패합니다. 다음은 작업 스크립트입니다.
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()
}
}
}
나는 그것을 변화시켜 변환하려고 노력한다. node {
에게;
#!/usr/bin/env groovy
def INSTANCE_ID = ""
pipeline {
agent any
stages {
나머지는 동일하게 유지됩니다. 다음 오류가 발생합니다.
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
답변1
이 작업을 수행해 본 적이 있나요? 변환을 시도한 후 Jenkinsfile의 나머지 부분을 보지 않고는 말하기가 어렵습니다. 그러나 붙여넣은 오류 출력은 선언적 구문 문제가 아닌 다른 문제가 발생하는 것처럼 보입니다. 스크립트된 버전을 기반으로 제가 제공할 수 있는 단순화된 버전은 다음과 같습니다.
#!/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()
}
}
}
}
}
도움이 되었으면 좋겠습니다.
script {}
부품 의 포장지 였을 수도 있습니다 sh(returnStdout: true, script: ...
. 내 생각엔 그게 중요할 수도 있을 것 같아.
답변2
선언적 파이프라인으로 변환할 필요는 없습니다. 자신에게 적합하다면 Scripted를 사용하세요. 일반적으로 스크립트 파이프라인을 선언적 파이프라인으로 변환하는 것은 그 반대보다 훨씬 어렵습니다. 작동 중인 스크립트 파이프라인이 있는 경우 전혀 변경하지 말고 작동 중인 파이프라인 스크립트를 Git 저장소의 Jenkinsfile에 넣으면 제대로 작동합니다.