Jenkins 스터디

young·2021년 9월 26일
0

Jenkins

  • 빌드, 테스트, 배포 등의 지속적인 통합을 자동화 해주는 툴
  • 지속적으로 코드를 통합해서 배포하기 때문에 개발의 진행상황을 쉽게 파악할 수 있음
  • Git과 같은 버전 관리 시스템과 연동해 source commit을 감지하면 자동적으로 자동화 테스트가 포함된 작동되도록 설정할 수 있음

Jenkins Pipeline

  • Jenkins job이나 이벤트들을 연속적으로 실행시키는 등의 일을 지원하는 기능

  • 여러 방식으로 구현 가능

    1) Jenkins Webadmin
    : Jenkins Pipeline을 생성해 Shell Script를 직접 생성하고 빌드
    2) Git SCM
    : Git Repository에 JenkinsFile을 작성해 빌드
    3) Blue Ocean
    : Pipeline을 시각화하여 손쉽게 구성하고 빌드

  • 2가지 타입의 문법

    1) Scripted Pipeline
    : Groovy로 빌드되기 때문에 pipeline을 생성하는데 보다 유연한 방법
    2) Declarative Pipeline
    : 고정된 방식이지만 간단하게 작성할 수 있는 방법
    *1)과 2)는 호환되지 않음


Declarative Pipeline

  • pipeline 블록 내 section, directives 등으로 구성

1) Pipeline (Required)

  • 최상위 레벨이 되어야하고 {}로 정의

2) Section

  • stage: 하나 이상의 stage에 대한 모음
    - pipeline 블록 안에서 한 번만 실행될 수 있음
    - 여러 stage 포함
  • steps: stage 내부에서 실행되는 단계
  • post: build 끝난 후 조건에 따라 실행될 내용
    - always: 실행 끝나고 나서 실행되는 step
    - failure: 실패하면 실행되는 step
    - success: 성공하면 실행되는 step
    - unstable: test fail, code violation 등 일 때 실행되는 step
pipeline {
	agent any
	stages {
		stage('Example') {
			steps {
				echo 'Hello World'
			}
		}
	}
	post {
		always {
			echo 'I will always say Hello again!'
		}
	}
}
  • agent: 해당 agent로 설정
    - pipeline의 최상위에 포함

    parameters
    - any: 사용 가능한 agent
    - none: global agent는 설정되지 않음, 대신 각 stage에 설정 필요
    - label: 특정 label명으로 된 environment로 설정
    - node: label과 유사
    - docker: 특정 docker 이미지로 수행
    - dockerfile: dockerfile 기반으로 수행

pipeline {
	agent none 
	stages {
		stage('Example Build') {
			agent { docker 'maven:3-alpine' }
			steps {
				echo 'Hello, Maven'
				sh 'mvn --version'
			}
		}
		stage('Example Test') {
			agent { docker 'openjdk:8-jre' }
			steps {
				echo 'Hello, JDK'
				sh 'java -version'
			}
		}
	}
}

3) Directives

  • environment
    - key-value 형태로 pipeline 내부에서 사용할 환경 변수 선언
    - 최상의에 정의될 경우 pipeline 모든 stage에 적용
    - stage 내부에 정의될 경우 해당 stage에서만 유효
pipeline {
	agent any
	environment {
		CC = 'clang'
	}
	stages {
		stage('Example') {
			environment {
				AN_ACCESS_KEY = credentials('my-prefined-secret-text')
			}
			steps {
				sh 'printenv'
			}
		}
	}
}
  • script
    - step 내에서 scripted 문법 사용
pipeline {
	agent any
	stages {
		stage('Example') {
			steps {
				echo 'Building Container..'
				script {
					if (ENVIRONMENT_NAME == 'development') {
						ENV_NAME = 'Development'
					}
					else if (ENVIRONMENT_NAME == 'release') {
						ENV_NAME = 'Production'
					}
				}
				echo 'Building Branch: ' + env.BRANCH_NAME
				echo 'Build Number: ' + env.BUILD_NUMBER
				echo 'Building Environment: ' + ENV_NAME
				echo 'Running your service with environment ${ENV_NAME} now'
			}
		}
	}
}
  • options
    - pipeline 옵션을 선택적으로 포함
    - pipeline 블록 안에서 한 번만 정의할 수 있음
    - timeout: pipeline 중단 후 실행에 대한 제한시간 설정
    - timestamps: pipeline 실행에서 생성된 모든 콘솔 출력 앞에 line이 생성된 시간 추가
pipeline {
	agent any
	options {
		timeout(time: 1, unit: 'HOURS')
	}
	stages {
		stage('Example') {
			steps {
				echo 'Hello World'
			}
		}
	}
}
  • parameters
    - 사용자가 제공해야 할 변수에 대해 선언
    - string, text, booleanParam, choice, password 등 정의
    - pipeline 블록 안에서 한 번만 정의할 수 있음
pipeline {
	agent any
	parameters {
		string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
		text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
		booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
		choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
		password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
	}
	stages {
		stage('Example') {
			steps {
				echo "Hello ${params.PERSON}"
				echo "Biography: ${params.BIOGRAPHY}"
				echo "Toggle: ${params.TOGGLE}"
				echo "Choice: ${params.CHOICE}"
				echo "Password: ${params.PASSWORD}"
			}
		}
	}
}

0개의 댓글