Jenkins
이전 글
이전 포스팅에서 우리는 Jenkins와 Ansible을 연동해서 Ansible이 관리하는 여러 호스트들에게 작업을 지정했다.
이번 포스팅에서는 Jenkins의 Pipeline 사용에 관해 알아볼 것이다.
Jenkins의 Delivery Pipeline
Delivery Pipeline 플러그인을 설치하게 되면 Item의 빌드의 연쇄적인 진행 과정을 확인할 수 있다.
우선, Item을 연쇄적으로 빌드하는 방법에 관해 알아보자.
1. 첫번째 Item은 그냥 echo 작업
2. 두번째 Item은 git에서 코드를 가져와서 Maven 빌드를 하는 작업
3. 세번째 Item은 빌드한 것을 배포하는 작업
위와 같이 진행된다고 가정해보자.
특정 작업이 끝난 뒤 다른 Item을 실행하기 위해선 빌드 후 조치 탭에서 다음과 같이 지정해주면 된다.
Build other projects를 선택한 뒤 Item을 선택해주면 된다. 이때, stable, unstable, failes 상태를 체크하여 진행할 수 있다.
그 후, Delivery Pipeline Plugin을 설치해주자.
설치가 완료된 뒤 Dashboard -> My View에 접속해보자.
+ 버튼을 클릭하게 되면 새롭게 View를 생성할 수 있는 창이 나오고 아래와 같이 지정해보자.
생성이 된 후 맨 아래에 Pipeline -> Components에 접근하여 다음과 같이 설정해주자.
그 후, 저장해준 뒤 첫번째 Item인 My-First-Project를 빌드하면 다음과 같이 Pipeline의 진행 상태를 확인할 수 있다.
Jenkins의 Pipeline 프로젝트
위에서 살펴본 Delivery Pipeline은 Item이라는 프로젝트 타입에다가 소스 코드 -> 빌드 -> 배포하는 과정을 거쳤다.
하지만, Jenkins에서 제공하는 Pipeline이라는 프로젝트 타입을 사용하면 스크립트를 통해 좀 더 다이나믹한 Pipeline 구성이 가능하다.
(원했던 형태로 만드는 것이 가능)
Jenkins Pipeline 프로젝트의 두가지 형태
- Declarative
- Scripted(Groovy + DSL)
- Groovy란 언어를 기본적으로 사용
- DSL(Domain Specific Language)
- 특별한 문법이 아닌 젠킨스의 자체적인 문법으로 스크립트 구성
- 차이점
- 시작 시 유효성 검사 여부
- Declarative -> 실패했을 때 다음 단계로 진행 X
- Scripted -> 실패해도 다음 단계
- 제어문
- 옵션
Declarative 샘플 코드
pipeline {
agent any
stages {
steps ('build'){
//
}
steps ('test'){
//
}
steps ('deploy'){
//
}
}
}
- agent: Jenkins 서버를 기동할 때 Master 서버와 Slave 서버로 구성할 수 있는 어떤 서버를 진행할지 선택할 때 사용
- any의 경우 어떤 서버든 상관없이 실행
- stages: 구성하고자 하는 각각의 단계를 넣을 수 있음
- 위의 예시에서는 빌드 -> 테스트 -> 배포
한번 Pipeline 프로젝트를 생성해보자.
Pipeline 프로젝트 생성
아래와 같이 Pipeline 프로젝트를 생성하자.
그 후, 맨 아래에 가면 Pipeline 항목이 존재할 것이고 거기에 아래와 같이 입력해주자.
pipeline {
agent any
stages {
stage('Compile') {
steps {
echo "Compiled successfully!";
}
}
stage('JUnit') {
steps {
echo "JUnit passed successfully!";
}
}
stage('Code Analysis') {
steps {
echo "Code Analysis completed successfully!";
}
}
stage('Deploy') {
steps {
echo "Deployed successfully!";
}
}
}
post {
always {
echo "This will always run"
}
success {
echo "This will run when the run finished successfully"
}
failure {
echo "This will run if failed"
}
unstable {
echo "This will run when the run was marked as unstable"
}
changed {
echo "This will run when the state of the pipeline has changed"
}
}
}
- stages: 작업할 목록들
- stage: 작업할 내용
- step: 실제로 진행될 작업
- stage: 작업할 내용
- post: Pipeline이 모두 끝났을 때 실행될 작업을 설명하는 부분이다.
- always: Pipeline이 끝났을 때 공통으로 실행될 부분
- success/failure/... : 해당 상태로 Pipeline 종료되었을 때 작업될 내용이다.
Pipeline 프로젝트 설정
그 후, 저장 후 빌드를 해보자.
빌드 결과
Console Output
정상적으로 동작하는 것을 확인할 수 있다.
Pipeline Syntax 사용
위에서 본 것처럼 Pipeline 프로젝트를 사용하려면 우리는 Pipeline 문법을 알아야했다.
(Declarative, Scripted 방식 둘다 문법을 알아야 사용가능)
우리가 모든 문법을 다 알기는 힘들기 때문에 Jenkins는 문법 생성기를 지원해준다.
맨 아래에 있는 Pipeline Syntax를 클릭해보자
목록
클릭하게 되면 여러 목록이 나오는데 우리에게 친숙한 Git부터 여러 항목이 존재한다.
위의 항목들을 선택해서 우리는 쉽게 Pipeline을 구성할 수도 있다.
Git Repository로부터 clone 해오는 작업을 위해 Git을 선택해보자.
위의 예시처럼 Git에서 clone을 받아오고 싶은 레포의 URL을 등록해주고 Branch를 등록해준다.
만약, Private Repository라면 Credentials를 등록해주어야 한다.
그 후, Generate Pipeline Script를 클릭하면 Jenkins가 Pipeline Script를 생성해준다.
그걸 복사해서 넣어주자.
pipeline {
agent any
stages {
stage('Git clone') {
steps {
git 'https://github.com/joneconsulting/jenkins_pipeline_script';
}
}
stage('Compile') {
steps {
echo "Compiled successfully!";
sh './build.sh'
}
}
stage('JUnit') {
steps {
echo "JUnit passed successfully!";
sh './unit.sh'
}
}
stage('Code Analysis') {
steps {
echo "Code Analysis completed successfully!";
sh './quality.sh'
}
}
stage('Deploy') {
steps {
echo "Deployed successfully!";
sh './deploy.sh'
}
}
}
post {
always {
echo "This will always run"
}
success {
echo "This will run when the run finished successfully"
}
failure {
echo "This will run if failed"
}
unstable {
echo "This will run when the run was marked as unstable"
}
changed {
echo "This will run when the state of the pipeline has changed"
}
}
}
위 처럼 넣어주면 Git Repo에서 Clone을 받아오게 된다.
필자의 예시는 이도원 강사님의 제공해주신 Github 주소를 사용했지만,
다른 주소도 마찬가지로 생성이 가능하다.
sh(쉘 스크립트)를 실행할 경우 sh {'./쉘 스크립트.sh'} 형태로 실행이 가능하다.
(sh를 사용하면 우리가 리눅스에서 사용하는 명령어들을 사용할 수 있다고 생각하면 된다.)
Pipeline 프로젝트로 도커 컨테이너 배포
Pipeline Syntax를 사용하는 다른 예로 ssh로 Jenkins -> Docker 서버로 빌드 파일을 전달하여 이미지 파일을 빌드해보자.
Pipeline Syntax를 클릭하여 sshPublisher를 선택해주자.
그 후, 이전에 설정해둔 도커 서버를 이용하여 이미지를 빌드하고
컨테이너를 구동시키기 위한 Exec command를 입력한다.
Generate Pipeline Script를 누르면
sshPublisher(publishers: [sshPublisherDesc(configName: 'docker-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build --tag hanyoonsoo/devops_exam1 -f Dockerfile .
docker run -d -p 8080:8080 --name cicd-project hanyoonsoo/devops_exam1''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '.', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.war')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
이런식으로 Pipeline Script를 생성을 해준다.
그걸 복사하여 Pipeline Script를 구성하면 아래와 같다.
전체 Pipeline Script
pipeline {
agent any
tools {
maven 'Maven3.9.8'
}
stages{
stage('git clone'){
steps{
git branch: 'main', url: 'https://github.com/HanYoonSoo/cicd-web-project'
}
}
stage('build'){
steps{
sh '''
echo build start
mvn clean compile package -DskipTests=true
'''
}
}
stage('ssh publisher'){
steps{
sshPublisher(publishers: [sshPublisherDesc(configName: 'docker-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build --tag hanyoonsoo/devops_exam1 -f Dockerfile .
docker run -d -p 8080:8080 --name cicd-project hanyoonsoo/devops_exam1''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '.', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.war')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
- tools: Git clone한 프로젝트를 빌드하기 위해 Maven3.9.8 툴로 활용할 것임을 명시한다.
- stage('build'): Maven 빌드 도구를 활용하여 빌드 파일을 패키징한다.
- stage('ssh publisher'): 제작한 빌드 파일을 Docker 서버로 전달하고 이미지 빌드 및 컨테이너 실행을 진행한다.
Maven Tool 등록도 아래와 같이 생성할 수도 있다.
자, 이제 저장 후 Pipeline을 빌드해보자.
빌드 확인
정상적으로 빌드가 되는 것을 확인할 수 있다.
정리
이번 포스팅에서는 Jenkins의 Pipeline 사용법에 관해 알아보았다.
Jenkins의 Pipeline Script 작성 숙달을 위해선 많은 경험이 필요해보인다.
추가로, Pipeline Script 자체를 .jenkinsfile로 깃에 저장해두고 불러와서 사용할 수도 있다.
Pipeline 구성에서 Pipeline script fram SCM을 선택하여 사용하면 된다.
나중에 Private Repo를 하나 만들고 거기에 저장해둔 뒤 Pipeline Script를 불러와서 사용하는 것도 좋은 방법이 될 것 같다.
참고
'Infra > Jenkins' 카테고리의 다른 글
[Jenkins] Jenkins Multi nodes 구성 - Master + Slaves (0) | 2024.08.02 |
---|---|
[Jenkins] Jenkins + SonarQube 사용 (0) | 2024.08.01 |
[Jenkins] Jenkins + Ansible 연동하기 (0) | 2024.07.31 |
[Jenkins] Ansible Playbook 사용 (0) | 2024.07.30 |
[Jenkins] Ansible 기본 명령어 (0) | 2024.07.30 |