Development Tip

Jenkins 스크립트 파이프 라인 또는 선언적 파이프 라인

yourdevel 2020. 10. 7. 21:20
반응형

Jenkins 스크립트 파이프 라인 또는 선언적 파이프 라인


이전 스타일 프로젝트 기본 워크 플로를 Jenkins 기반 파이프 라인으로 변환하려고합니다. 문서를 살펴 보는 동안 scripted이라는 두 가지 구문이 있음을 발견했습니다 declarative. Jenkins 웹 declarative구문 릴리스 최근 (2016 년 말) 등. 새로운 구문 릴리스가 있지만 Jenkins는 여전히 스크립트 구문도 지원합니다.

이제이 두 유형이 어떤 상황에서 가장 잘 맞는지 잘 모르겠습니다. scripted구문은 곧 지원 중단됩니까? 그렇다면 declarativeJenkins 파이프 라인의 미래가 될까요?

이 두 가지 구문 유형에 대해 몇 가지 생각을 공유 할 수있는 사람.


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

반응형