Jenkins 스크립트 파이프 라인 또는 선언적 파이프 라인
이전 스타일 프로젝트 기본 워크 플로를 Jenkins 기반 파이프 라인으로 변환하려고합니다. 문서를 살펴 보는 동안 scripted
및 이라는 두 가지 구문이 있음을 발견했습니다 declarative
. Jenkins 웹 declarative
구문 릴리스 최근 (2016 년 말) 등. 새로운 구문 릴리스가 있지만 Jenkins는 여전히 스크립트 구문도 지원합니다.
이제이 두 유형이 어떤 상황에서 가장 잘 맞는지 잘 모르겠습니다. scripted
구문은 곧 지원 중단됩니까? 그렇다면 declarative
Jenkins 파이프 라인의 미래가 될까요?
이 두 가지 구문 유형에 대해 몇 가지 생각을 공유 할 수있는 사람.
Jenkins Pipeline이 처음 만들어 졌을 때 Groovy가 기초로 선택되었습니다. Jenkins는 오랫동안 관리자와 사용자 모두에게 고급 스크립팅 기능을 제공하기 위해 내장 된 Groovy 엔진과 함께 제공되었습니다. 또한 Jenkins Pipeline의 구현자는 Groovy가 현재 "Scripted Pipeline"DSL이라고하는 것을 구축 할 수있는 견고한 기반임을 발견했습니다.
완전한 기능을 갖춘 프로그래밍 환경 인 Scripted Pipeline은 Jenkins 사용자에게 엄청난 양의 유연성과 확장 성을 제공합니다. Groovy 학습 곡선은 일반적으로 주어진 팀의 모든 구성원에게 바람직하지 않으므로 Jenkins Pipeline을 작성하기 위해 더 간단하고 독단적 인 구문을 제공하기 위해 Declarative Pipeline이 만들어졌습니다.
두 가지 모두 근본적으로 동일한 파이프 라인 하위 시스템입니다. 둘 다 "Pipeline as code"의 내구성있는 구현입니다. 둘 다 Pipeline에 내장되거나 플러그인에서 제공하는 단계를 사용할 수 있습니다. 둘 다 공유 라이브러리를 활용할 수 있습니다.
그러나 구문과 유연성이 다른 부분입니다. 선언적은보다 엄격하고 사전 정의 된 구조로 사용자가 사용할 수있는 것을 제한하므로보다 단순한 지속적 배포 파이프 라인에 이상적인 선택입니다. Scripted는 구조 및 구문에 대한 유일한 제한이 파이프 라인 특정 시스템이 아닌 Groovy 자체에 의해 정의되는 경향이있는 한 매우 적은 제한을 제공하므로 고급 사용자와 더 복잡한 요구 사항을 가진 사용자에게 이상적인 선택입니다. 이름에서 알 수 있듯이 Declarative Pipeline은 선언적 프로그래밍 모델을 권장합니다. 스크립팅 된 파이프 라인은보다 명령적인 프로그래밍 모델을 따릅니다.
https://jenkins.io/doc/book/pipeline/syntax/#compare 에서 복사
고려해야 할 또 다른 사항은 선언적 파이프 라인에 script () 단계가 있다는 것 입니다. 스크립팅 된 모든 파이프 라인을 실행할 수 있습니다. 따라서 필자는 선언적 파이프 라인을 사용하고 필요한 경우 script()
스크립팅 된 파이프 라인을 사용하는 것이 좋습니다 . 따라서 두 세계의 장점을 모두 얻을 수 있습니다.
declarative는 미래에 대비 한 옵션이며 사람들이 권장하는 옵션 인 것으로 보입니다. Visual Pipeline Editor가 지원할 수있는 유일한 것입니다. 유효성 검사를 지원합니다. 대부분의 컨텍스트에서 스크립팅 된 상태로 돌아갈 수 있으므로 스크립팅 된 기능의 대부분을 차지하게됩니다. 때때로 누군가가 선언적으로하고 싶은 일을 할 수없는 유스 케이스를 떠올리지 만, 이것은 일반적으로 한동안 스크립트를 사용해온 사람들이며 이러한 기능 격차는 시간이 지나면 사라질 가능성이 높습니다.
더 많은 컨텍스트 : https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/
최근에 kubernetes 에이전트로 스크립팅 된 것에서 선언적으로 전환했습니다. 2018 년 7 월까지 선언적 파이프 라인은 kubernetes pod를 지정할 수있는 완전한 기능이 없었습니다. 그러나 yamlFile
단계를 추가 하면 이제 저장소의 yaml 파일에서 포드 템플릿을 읽을 수 있습니다.
그러면 예를 들어 vscode의 훌륭한 kubernetes 플러그인을 사용하여 포드 템플릿의 유효성을 검사 한 다음 Jenkinsfile로 읽고 원하는대로 컨테이너를 사용할 수 있습니다.
pipeline {
agent {
kubernetes {
label 'jenkins-pod'
yamlFile 'jenkinsPodTemplate.yml'
}
}
stages {
stage('Checkout code and parse Jenkinsfile.json') {
steps {
container('jnlp'){
script{
inputFile = readFile('Jenkinsfile.json')
config = new groovy.json.JsonSlurperClassic().parseText(inputFile)
containerTag = env.BRANCH_NAME + '-' + env.GIT_COMMIT.substring(0, 7)
println "pipeline config ==> ${config}"
} // script
} // container('jnlp')
} // steps
} // stage
위에서 언급했듯이 스크립트 블록을 추가 할 수 있습니다. 사용자 정의 jnlp 및 docker가있는 예제 포드 템플릿.
apiVersion: v1
kind: Pod
metadata:
name: jenkins-pod
spec:
containers:
- name: jnlp
image: jenkins/jnlp-slave:3.23-1
imagePullPolicy: IfNotPresent
tty: true
- name: rsync
image: mrsixw/concourse-rsync-resource
imagePullPolicy: IfNotPresent
tty: true
volumeMounts:
- name: nfs
mountPath: /dags
- name: docker
image: docker:17.03
imagePullPolicy: IfNotPresent
command:
- cat
tty: true
volumeMounts:
- name: docker
mountPath: /var/run/docker.sock
volumes:
- name: docker
hostPath:
path: /var/run/docker.sock
- name: nfs
nfs:
server: 10.154.0.3
path: /airflow/dags
Jenkins 문서는 두 유형을 올바르게 설명하고 비교합니다.
To quote: "Scripted Pipeline offers a tremendous amount of flexibility and extensibility to Jenkins users. The Groovy learning-curve isn’t typically desirable for all members of a given team, so Declarative Pipeline was created to offer a simpler and more opinionated syntax for authoring Jenkins Pipeline.
The two are both fundamentally the same Pipeline sub-system underneath."
Read more here:https://jenkins.io/doc/book/pipeline/syntax/#compare
참고URL : https://stackoverflow.com/questions/43484979/jenkins-scripted-pipeline-or-declarative-pipeline
'Development Tip' 카테고리의 다른 글
Ruby on Rails에서 헤더 데이터 읽기 (0) | 2020.10.07 |
---|---|
GitHub에서 Maven 종속성로드 (0) | 2020.10.07 |
등록되지 않은 COM 예외 클래스를 해결하는 방법 (HRESULT의 예외 : 0x80040154 (REGDB_E_CLASSNOTREG))? (0) | 2020.10.07 |
Oracle의 LISTAGG는 고유 한 값을 반환합니다. (0) | 2020.10.07 |
IDENTITY 열이 하나만있는 테이블에 삽입하는 방법은 무엇입니까? (0) | 2020.10.07 |