미들웨어

Jenkins - Pipeline 형식

feel2 2024. 12. 15. 21:57
반응형

Pod Template 관리

  1. jenkins 관리 > Clouds > kubenetes > Pod Templates
  2. default or Add a pod template
  3. pod template 선택 > Add Container > container 추가 > 저장

 

Pipeline 형식

  • pipeline: 우선 가장 먼저 pipeline을 선언, pipeline은 최상위 레벨이 되어야하며 { }으로 정의해야 한다.
pipeline {
/* insert Declarative Pipeline here */ 
}

pipeline은 Section, Directives, Steps 또는 assignment 문으로만 구성되야 한다.

  • section
    • agent: agent를 추가할 경우에 사용 (any, none, label, node, docker, dockerfile, kubernetes)
    
#예시: kubernetes
    
    agent {
        kubernetes {
            label 'default'
            defaultContainer 'jnlp'
        }
    }

#예시: docker

    agent {
        docker {
            image 'myregistry.com/node'
            label 'my-defined-label'
            registryUrl 'https://myregistry.com/'
            registryCredentialsId 'myPredefinedCredentialsInJenkins'
        }
    }


#예시: dockerfile

    agent {
        dockerfile {
            filename 'Dockerfile.build'
            dir 'build'
            label 'my-defined-label'
            registryUrl 'https://myregistry.com/'
            registryCredentialsId 'myPredefinedCredentialsInJenkins'
        }
    }

 

  • 예시: agent가 각각 적용 된 JenkinsFile Sample
pipeline {
    agent none # agent none이 pipeline의 최상위에 정의되어 있을 경우 stage는 각각 agent를 포함
    stages {
        stage('Example Build') {
            agent { docker 'maven:3-alpine' } # maven:3-alpine의 이미지를 갖는 도커를 에이전트로 사용
            steps {
                echo 'Hello, Maven'
                sh 'mvn --version'
            }
        }
        stage('Example Test') {
            agent { docker 'openjdk:8-jre' } # openjdk:8-jre의 이미지를 갖는 도커를 에이전트로 사용
            steps {
                echo 'Hello, JDK'
                sh 'java -version'
            }
        }
    }
}
  • steps: stage 내부 block
# step: 할일 정의

stage('stage명') {
    steps{
        steps{
            할 일
        }
            할 일
    }
}

# parallel: 병렬 실행

stage {
    parallel {
        stage('Branch A') {
        }
        stage('Branch B') {
        }
    }
}

# post: 특정 stage나 pipeline이 시작되기 이전 또는 이후에 실행 될 confition block을 정의

post{
	always {
    	echo '항상 실행되는 문'
    }
    changed {
    }
    failure{
    }
    success{
    }
}

always, changed, fixed, regression, aborted, failure, success, unstable, unsuccessful,와 cleanup 등의 상태를 정의 가능


  • Directives
# environment: 변수 정의

    environment {
        GIT_URL = "https://github.com/baeyuna97/K8S.git"
    }

# tool: 자동설치나 Path에 추가할 도구

tool{
	NodeJS 'Nodejs-bell'
}

# parameter: 파라미터 정의

# - 선언
 parameters {
        booleanParam(containername: 'hello', type: 'container')
    }

# - 사용
 script {
   if (params.containername=='hello') {
       echo 'test'
  }
}

# options: pipeline의 옵션을 선택적으로 포함 가능
 # - 예시: options가 적용 된 JenkinsFile Sample

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

 

 

  • 옵션 종류
옵션 내용
buildDiscarder • 특정 수의 최근 파이프 라인 실행에 대한 아티팩트 및 콘솔 출력을 유지한다.
• ex) options { buildDiscarder(logRotator(numToKeepStr: '1')) }  
checkoutToSubdirectory • 작업 공간의 서브 디렉토리에서 자동 소스 제어 체크 아웃을 수행한다.
• ex) options { checkoutToSubdirectory('foo') }  
disableConcurrentBuilds • 파이프 라인의 동시 실행을 허용하지 않는다. 공유 리소스 등에 대한 동시 액세스를 방지하는 데 유용 할 수 있다.
• ex) options { disableConcurrentBuilds() }  
disableResume • 마스터가 다시 시작되면 파이프 라인을 다시 시작하지 않게 도와준다.
• ex) options { disableResume() }  
newContainerPerStage • 함께 사용 docker 또는 dockerfile로 지정된 경우 각 스테이지는 동일한 컨테이너 인스턴스에서 실행되는 모든 스테이지가 아니라 동일한 노드의 새 컨테이너 인스턴스에서 실행된다.
overrideIndexTriggers • 분기 인덱싱 트리거의 기본 처리를 재정의 할 수 있다.
• 멀티 브랜치 또는 조직 레이블에서 분기 인덱싱 트리거가 비활성화 된 options { overrideIndexTriggers(true) } 경우에 대해서만 활성화된다.  
• 그렇지 않으면 options { overrideIndexTriggers(false) }이 작업에 대해서만 분기 인덱싱 트리거를 비활성화한다.  
preserveStashes • 스테이지를 다시 시작할 때 사용할 수 있도록 완료된 빌드에서 숨김을 유지한다.
• ex) options { preserveStashes() }  
• 가장 최근에 완료된 빌드 options { preserveStashes(buildCount: 5) }에서 stash를 보존 하거나 가장 최근에 완료된 5 개의 빌드에서 stash를 보존하는 용도로 사용  
quietPeriod • 파이프 라인에 대한 자동 기간을 초 단위로 설정하여 글로벌 기본값을 대체한다.
• ex) options { quietPeriod(30) }  
retry • 실패하면 전체 파이프 라인을 지정된 횟수만큼 재 시도한다.
• ex) options { retry(3) }  
skipDefaultCheckout • agent 지시문에서 기본적으로 소스 제어에서 코드 체크 아웃을 건너 뛴다.
• ex) options { skipDefaultCheckout() }  
skipStagesAfterUnstable • 빌드 상태가 불안정 해지면 단계를 건너 뛴다.
• ex) options { skipStagesAfterUnstable() }  
timeout • Jenkins가 파이프 라인을 중단한 후 파이프 라인 실행에 대한 제한 시간을 설정한다.
• ex) options { timeout(time: 1, unit: 'HOURS') }  
timestamps • 파이프라인 실행에서 생성된 모든 콘솔 출력 앞에 라인이 생성 된 시간을 추가한다.
• ex) options { timestamps() }  
parallelsAlwaysFailFast • 파이프 라인의 모든 후속 병렬 단계에 대해 failfast를 true로 설정한다.
• ex) options { parallelsAlwaysFailFast() }


 
- 조건문  
- when, steps  
# when, steps

    when {
       조건문
    }
    steps {
       조건이 맞으면 실행할 내용
    }



# if


    script { // if문 쓰기 위해 선언
       if (조건문) {
            조건이 맞으면 실행할 내용
       }
    }

 

샘플 형식

 

pipeline {
    agent {
        kubernetes {
            label 'jenkins-jenkins-agent'
            defaultContainer 'jnlp'
        }
    }
    parameters {
        string(name: '', defaultValue: '', description: '')
    }
    environment {
        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        DEV_KUBECONFIG_CREDENTIAL_ID = 'host'
        REGISTRY = 'harbor.kk.example.com:30443/library'
        DOCKERHUB_NAMESPACE = 'platform'
        APP_NAME = 'devops-maven-sample'
        SONAR_CREDENTIAL_ID = 'sonar-token'
        TAG_NAME = "SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER"
    }
    stages {
        stage('checkout') {
            steps {
                container('maven393-java17') {
                    sh 'export GIT_SSL_NO_VERIFY=0'
                    git branch: 'master', url: 'https://github.com/kubesphere/devops-maven-sample.git'
                }
            }
        }
        stage('unit test') {
            steps {
                container('maven393-java17') {
                    sh 'mvn clean test'
                }
            }
        }
        stage('sonarqube analysis') {
            steps {
                container('maven') {
                    withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
                        withSonarQubeEnv('sonar') {
                            sh "mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN -Dsonar.projectKey=java-demo -Dsonar.host.url=http://sonar.kk.example.com:30080"
                        }
                    }
                }
            }
        }
        stage('build & push') {
            steps {
                container('maven') {
                    sh 'mvn -Dmaven.test.skip=true clean package'
                    sh 'podman build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
                    withCredentials([usernamePassword(passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME', credentialsId: "$DOCKER_CREDENTIAL_ID",)]) {
                        sh 'echo "${DOCKER_PASSWORD}" | podman login $REGISTRY -u "${DOCKER_USERNAME}" --password-stdin --tls-verify=false'
                        sh 'podman push --tls-verify=false $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
                    }
                }
            }
        }
        stage('push latest') {
            steps {
                container('maven') {
                    sh 'podman tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
                    sh 'podman push --tls-verify=false $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
                }
            }
        }
        stage('deploy to dev') {
            steps {
                container('maven') {
                    withCredentials([
                        kubeconfigFile(credentialsId: env.DEV_KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')
                    ]) {
                        sh 'envsubst < deploy/dev-all-in-one/devops-sample.yaml | kubectl apply -f -'
                    }
                }
            }
        }
        stage('deploy to staging') {
            steps {
                container('maven') {
                    input(id: 'deploy-to-staging', message: 'deploy to staging?')
                    withCredentials([
                        kubeconfigFile(credentialsId: env.DEV_KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')
                    ]) {
                        sh 'envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -'
                    }
                }
            }
        }
        stage('deploy to production') {
            steps {
                container('maven') {
                    input(id: 'deploy-to-production', message: 'deploy to production?')
                    withCredentials([
                        kubeconfigFile(credentialsId: env.DEV_KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')
                    ]) {
                        sh 'envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -'
                    }
                }
            }
        }
    }
}
반응형

'미들웨어' 카테고리의 다른 글

nexus repository 연동 (Maven)  (1) 2024.12.08
Docker Image 폐쇄망 옮기기  (0) 2024.11.30