데이터를 걷는 선비

[CI/CD] Jenkins(젠킨스) 개념 및 실습(Python) 본문

Machine Learning/MLOps

[CI/CD] Jenkins(젠킨스) 개념 및 실습(Python)

세미제로 2023. 8. 10. 22:07

https://semizero.tistory.com/39

 

[CI/CD] Jenkins(젠킨스) 개념 및 설치 방법!!

[CI / CD 란 무엇인가?] 1. CI CI는 지속적 통합(Continuous Integration)을 말한다 여기서 통합은 보통 소스 코드의 통합을 의미하며, 여러 명의 많은 개발자들이 코드 베이스를 계속해서 통합하는 것이다.

semizero.tistory.com

지난 포스트에서는 Jenkins의 개념과 설치 방법에 대해서 알아보았다. 

이번 포스트에서는 Jenkins를 이용해서 커밋만 하 어떻게 빌드 배포를 자동화할 수 있는지 알아보자!!

 

[순서] 

  • 1) Jenkins 실습 아키텍처 설명

[Prerequisite] 

실습을 하기 위해선 작업 환경과 github를 연동이 된 상태여야 한다.

https://github.com/semi-zero/js-pipeline-project

 

GitHub - semi-zero/js-pipeline-project

Contribute to semi-zero/js-pipeline-project development by creating an account on GitHub.

github.com


1. Jenkins 실습 아키텍처

실습에서는 FastAPI 예제 코드를 사용하여

깃허브에 커밋했을 때 Jenkins를 활용하여 바로 Dockerfile을 빌드해 웹서버를 배포하는 실습을 진행할 것이다.

FastAPI, Docker 등의 사전 지식이 어느정도 필요하며,

실습코드의 디렉토리 구조는 다음과 같다.

 


2. Docker compose를 통해 웹 서버 만들

  • main.py
    • FastAPI를 구동하는 파이썬 파일이다
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "MLOps-!!!"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
  • requirements.txt
    • main.py를 실행하기 위해선 fastapi와 uvicorn 라이브러리가 필요하다.
fastapi
uvicorn
  • Dockerfile
    • uvicorn을 이용해 80번 port로 fastapi를 구동한다는 내용의 Dockerfile이다.
FROM python:3.9

WORKDIR /app

COPY ./app/requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

COPY ./app /app

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
  • docker-compose.yml
    • fastapi-app이라는 이름의 도커 컨테이너를 빌드하고자 하는 docker-compose yml 파일이다.
version: "3"

services:
  web:
    build: .
    container_name: fastapi-app
    volumes:
      - .:/code
    ports:
      - "80:80"
  • 서버에서 Docker container 생성
docker-compose build web
docker images
docker-compose up -d
docker ps -a

docker-compose build web
docker images 확인
docker compose up -d를 통한 build 와 run 자동
localhost 확인!!

※ Jenkins를 실행하기 전에 up을 한 docker fastapi-app을 다시 삭제해주어야 한다.

docker stop fastapi-app
docker rm fastapi-app

 

이제 Jenkins를 작성하여 Jenkins를 통해 main.py가 변경했을 때 자동 배포하는 시스템을 구축해보자.


3. Jenkinsfile 의 기본적인 구조를 알아보기

  • 기본 코드 구조
    • pipeline : 반드시 맨 위에 있어야 한다.
    • agent : 어디에서 실행할 것인지 정의한다.
      • any, none, label, node, docker, dockerfile, kubernetes
      • agent 가 none 인 경우 stage 에 포함시켜야 함
      • stages : 하나 이상의 stage 에 대한 모음
        • pipeline 블록 안에서 한 번만 실행 가능함
pipeline {
	agent any
	parameters {
		choice(name: 'VERSION', choices: ['1.1.0','1.2.0','1.3.0'], description: '')
		booleanParam(name: 'executeTests', defaultValue: true, description: '')
	}
	stages {
		stage("init") {
			steps {
				script {
					gv = load "script.groovy"
				}
			}
		}
		stage("Checkout") {
			steps {
				checkout scm
			}
		}
		stage("Build") {
			steps {
				sh 'docker-compose build web'
			}
		}
		stage("test") {
			when {
				expression {
					params.executeTests
				}
			}
			steps {
				script {
					gv.testApp()
				}
			}
		}
		stage("deploy") {
			steps {
				sh "docker-compose up -d"
			}
		}
	}
}
  • script.groovy
def buildApp() {
	echo 'building the applications...'
}

def testApp() {
	echo 'testing the applications...'
}

def deployApp() {
	echo 'deploying the applicaiton...'
	echo "deploying version ${params.VERSION}"
}
return this

잠깐!!

  • JVM에서 실행되는 스크립트 언어
  • 문법이 Java와 아주 가깝다
  • Java와 호환이 되며 Java 클래스 파일을 그대로 Groovy 클래스로 사용할 수 있다

4. Jenkinsfile 의 기본적인 구조를 알아보기

  • docker group 에 jenkins 등록
sudo gpasswd -a jenkins docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  • Jenkins 가동
sudo service jenkins restart

Jenkins를 실행하기 전에 up을 한 docker fastapi-app을 다시 삭제해주어야 한다.

docker stop fastapi-app
docker rm fastapi-app

 


4. Jenkinsfile 와 Github 연동

  • Pipeline 생성
    • 이름은 'jenkins-pipeline' 으로 입력

  • Git 추가
    • [General]-[Branch Sources]-[Add source 선택]-[Git]
    • 위에서 생성한 Github Repository 추가
    • Credentials - [Add]
    • [Save] - Log 출력
  • Pipeline Status 확인
    • 각 stage log 확인

  • 지금 Build 를 누르면 현재 Github에 상태를 확인해 수동으로 배포가 가능하다!!

 

그렇지만 Github commit 된 것을 수동으로 매번 지금 빌드를 눌러주면 Jenkins를 사용하는 이유가 퇴색된다.

 

 

이제 다음 게시물에서는 직접 실습을 해보며 Jenkins 사용법을 익혀보자!!

Comments