DevOps

Jenkins scripted pipeline (젠킨스 스크립트 파이프라인)

Dan-k 2020. 1. 10. 11:31
반응형

DevOps를 위해 보통 파이프 라인을 만들어 사용한다. 젠킨스 내에 파이프 라인은 크게 선언적(declarative) 파이프라인과 스크립티드(scripted) 파이프라인을 지원한다.

선언적(Declarative) 파이프라인

pipeline {
agent { docker ‘node:6.3’ }
	stages {
		stage(‘build’) {
			steps {
				sh "abc.sh ${variables}"
			}
		}
	}
}
스크립티드(Scripted) 파이프라인

node() {
	checkout scm
	stage(‘Build’) {
		sh "abc.sh ${variables}"
		}
	}
}

젠킨스 파이프라인은 기본적으로 groovy 언어를 지원하고 있어 이를 이용하면 메소드를 만들어 적용한다던가 간단한 반복 작업은 for문 groovy에서는 [].each{변수 -> } 이런식으로 사용할 수 있다.

 

또한 parallel 한 기능을 제공해주어서 파이프라인안에 parallel 명령어를 통해 병렬 처리를 쉽게 할 수있다.

retry와 timeout을 거는 것.

그리고 job이 실패 했을 때 mail을 받아보는 기능 등을 손쉽게 구현할 수 있다.

 

스크립트 파이프라인으로 구성한 예제 코드이다.

def Train(DATASET) {
	sh """training.sh ${MODEL_TYPE} ${JOB_DATE} ${DATASET}"""
}

node {
    try{
        JOB_DATE = sh(script: 'TZ=Asia/Seoul date "+%Y%m%d" -d "yesterday"', returnStdout: true).trim()
        timeout(time:15, unit:'MINUTES') {
            stage('Initialize') {
                echo "MODEL_TYPE:       ${MODEL_TYPE}"
                echo "JOB_DATE:         ${JOB_DATE}"
            }
        timeout(time:2, unit:'HOURS') {
            dir('script') {
                stage('train') {
                    retry(3) {
                        echo 'predicting...'
                        parallel (
                            'k1' : {
                                DATASET='k1'
                                Train(DATASET)
                            },
                            'k2' : {
                                sleep 10
                                DATASET='k2'
                                Train(DATASET)
                            },
                            'k3' : {
                                sleep 20
                                DATASET='k3'
                                Train(DATASET)
                            }
                        )
                    }
                }
            }
        }
    }
    catch(err) {
        currentBuild.result = 'FAILURE'
    }
    finally {
        step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: RECIPIENTS, sendToIndividuals: true])
    }
}

 

Train을 함수로 만들어 dataset별로 병렬 처리한 예이다.

retry와 timeout을 걸어 동작을 제어할 수 있다.

 

젠킨스 파이프라인 뿐만 아니라 리모트 연결을 통해 다른 vm에 접속하여 동작을 명령시키는 것도 가능하다.

 

젠킨스와 더불어 airflow 등 devops를 위한 tool은 꼭 잘 숙지하는 것이 좋을  것이다.!!!

 

젠킨스도 하다보면 재미가 들려서 이를 이용하면 주기적인 크롤링이나 여러 반복되야하는 업무들을 자동화할 수 있어 편리하다.

 

젠킨스 스케쥴러는 crontab 으로 관리할 수 있어 편하다.. 나중에 크론탭도 한번 포스팅해야겠다. 끝~

728x90
반응형
LIST