본문 바로가기

프로젝트

젠킨스 파이프라인에서 도커 사용하기

728x90

Docker with Pipeline

Jenkins(이하 젠킨스)를 이용해 CI/CD를 구성하다 보면, 프로젝트 빌드를 위해 호스트에 직접 필요한 도구를 설치하는 경우가 있었다. 하지만 프로젝트가 많아지고, 각기 사용하는 언어 및 빌드 환경이 달라지게 되면 호스트 OS에 무분별하게 도구를 설치하는 상황이 생길 수 있고, 만약 조직 단위로 움직이는 회사인 경우 언어 선택 및 빌드 환경 수정 시 DevOps에게 불필요한 작업 리소스를 줄 수 있다. 젠킨스는 이런 문제를 인식하고 파이프라인에 도커를 사용하도록 지원한다.

플러그인 설치

젠킨스 파이프라인에서 도커를 사용하기 전 필요한 플러그인을 설치한다.

  • Docker plugin
  • Docker pipeline

그리고 호스트 OS에 도커를 사용할 수 있는 환경이 필요하다.

예시

pipeline {
    agent {
        docker { image 'node:20.9.0-alpine3.18' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

 

agent 내 docker로 image를 선택하면 각 스텝에서 수행되는 명령어는 도커 컨테이너 내부에서 명령어가 실행된다.

 

docker run -t -d -u 109:114 -w /var/lib/jenkins/workspace/perfume-frontend \
-v /var/lib/jenkins/workspace/perfume-frontend:/var/lib/jenkins/workspace/perfume-frontend:rw,z \
-v /var/lib/jenkins/workspace/perfume-frontend@tmp:/var/lib/jenkins/workspace/perfume-frontend@tmp:rw,z \
-e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** node:21-alpine3.18 cat

 

젠킨스를 실행하면 다음 명령어가 보이는데 원리 자체는 젠킨스 워크스페이스와 컨테이너 내부 볼륨을 연결해 명령어를 수행하게 하는 것이다.

 

만약 특정 스테이지만 도커 내에서 실행되지 원한다면 다음과 같이 스크립트를 작성할 수 있다.

 

pipeline {
    agent any
    stages {
        stage('Build') {
            agent {
                docker {
                    image 'gradle:8.2.0-jdk17-alpine'
                    // Run the container on the node specified at the
                    // top-level of the Pipeline, in the same workspace,
                    // rather than on a new node entirely:
                    reuseNode true
                }
            }
            steps {
                sh 'gradle --version'
            }
        }
    }
}

 

추가적으로 이전 스테이지 워크 스페이스가 유지되기 원한다면 "reuseNode true" 옵션을 추가할 수 있다. 내 경우 프론트엔드 작업물을 배포하기 위해서 빌드 스테이지만 Node.js 이미지의 컨테이너 내에서 수행하도록 설정했다.

 

그리고 특정 이미지가 아닌 개별 구성한 Dockerfile을 사용하려면 다음과 같이 사용하면된다.

 

pipeline {
    agent { dockerfile true }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
                sh 'svn --version'
            }
        }
    }
}

 

출처

'프로젝트' 카테고리의 다른 글

도커로 Jenkins 설치하기  (0) 2022.09.17