지난번에 airflow를 실습해 본 것처럼 젠킨스 CI/CD도 도커 기반으로 실습해 보자.
젠킨스 환경 구축
docker-compose.yml 파일을 다음과 같이 만들어보자.
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:latest
ports:
- "8080:8080"
- "50000:50000"
volumes:
- jenkins_home:/var/jenkinshome
environment:
- JENKINS_OPTS=--httpPort=8080
restart: unless-stopped
volumes:
jenkins_home:
이렇게 만들어주고 컨테이너를 백그라운드로 띄워보자
docker-compose up -d
실행이 완료되고 http://localhost:8080으로 접속하면 이렇게 젠킨스 초기 화면이 나온다.
일단 여기에 작성해야 하는 비밀번호는 우리가 모르고 있다.
현재 젠킨스가 실행 중인 컨테이너 터미널 로그를 확인해 보자.
❓ 혹시 로그를 어떻게 보는지 모르겠다면 일단 docker ps로 현재 실행 중인 컨테이너 ID를 알아온다. 그리고 docker logs [컨테이너 ID]를 입력하면 위와 동일한 로그를 볼 수 있다.
이렇게 Jenkins initial setup is required. An admin user has been created and a password generated. 라는 문구가 있을 거다. 여기 아래에 있는 게 초기 비밀번호다.
비밀번호를 입력하면 이렇게 선택창이 나온다. 우리는 왼쪽껄 선택하면 된다.
그럼 이렇게 권장하는 라이브러리/플러그인들이 잘 설치된다.
이렇게 지금 하는 것처럼 도커를 써서 사용해야 하는 인프라를 구축하면 확장성이 좋다. 이걸 도커 기반으로 구축하면 쿠버네티스 위에서 구동을 하면 자연스럽게 고가용성도 보장이 된다. 만약에 지금 설치하는 젠킨스에 문제가 있어서 꺼지면 쿠버네티스가 알아서 젠킨스를 다시 설치해 주고 이런 과정을 거치니 좋다!
설치가 완료됐으면 계정 생성 창이 나온다. 여기서 임의로 어드민 계정을 만들어주자.
이 뒤에 나오는 url 은 건들지 말고 다음단계로 넘어가고 넘어가면 잘 생성된 걸 확인할 수 있다.
젠킨스 실습
위 화면에서 + 새로운 Item을 클릭해 주자.
이름을 지어주고 Pipeline을 선택해 준다.
그리고 ok를 누르면 된다.
General에 설명을 적어주고
pipeline script를 적어주자.
node {
// init stage
stage("init"){
sh "echo init hello world"
}
// build stage
stage("build"){
sh "echo 'start build' "
}
// deploy stage
stage("deploy"){
sh "echo 'deploying' "
}
}
위 코드를 머신러닝에 접목시켜 보자면 init 부분에서 깃허브 코드의 merge나 변경을 감지하고 태스크를 수행해야 하는 곳으로 옮긴다.
그리고 build stage에서는 머신러닝을 다시 학습하는 과정. 그리고 추가적으로 평가하고 괜찮으면 배포하는 과정을 거칠 수 있다.
그럼 이렇게 완성된 모습을 볼 수 있다. 여기서 우측 실행 버튼을 클릭해 보자.
실행하고 끝나면 이렇게 그 과정을 볼 수 있다.
콘솔 로그를 보면 이렇게 잘 찍힌 걸 볼 수 있다.
지금은 이렇게 로그만 찍는데 실제로는 init 부분에서 깃허브 코드 변경을 감지해서 실제 사용될 곳에 옮겨놓는다거나 그렇게 해주고 빌드 부분에서 이전에 workflow management 부분에서 봤던 모델 학습, 추론, 평가 이 과정이 실행해 주는 역할이 될 수 있다. 모델이 학습되고 나면 학습된 모델을 상품화를 위해 어딘가로 옮겨놓는 게 deploy 스테이지가 될 수 있다.
실제로 사용한다면 이런 식으로 진행될 수 있다.
pipeline {
agent any
environment {
DOCKER_IMAGE = 'your-docker-image-name'
}
stages {
stage('Checkout') {
steps {
// Git 레포지토리에서 소스 코드 체크아웃
git url: 'https://github.com/your-repository/your-project.git', branch: 'main'
}
}
stage('Build Docker Image') {
steps {
script {
// Docker 이미지 빌드
docker.build("${DOCKER_IMAGE}:${env.BUILD_NUMBER}")
}
}
}
stage('Push Docker Image') {
steps {
script {
// Docker Hub에 이미지 푸시
docker.withRegistry('https://registry.hub.docker.com', 'dockerhub-credentials') {
docker.image("${DOCKER_IMAGE}:${env.BUILD_NUMBER}").push()
}
}
}
}
}
}
'MLOps' 카테고리의 다른 글
Docker 기반 Apache Airflow 간단 실습 (2) | 2024.11.20 |
---|---|
쿠버네티스 환경 구축 및 주요 구성 (0) | 2024.11.19 |
[MLflow] 로컬 파일 시스템에 기록된 실험 데이터 확인 방법 (0) | 2024.11.02 |
Docker 기반 Airflow, MLFlow, FastAPI, Streamlit 적용한 MLOps 프로젝트 후기 (5) | 2024.10.12 |
Docker로 mlflow 실행할때 OSError: [Errno 30] Read-only file system: '/mlflow' 에러 발생 (5) | 2024.10.09 |