반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

가끔 보자, 하늘.

Windows에서 jenkins + docker를 이용한 개발용 인프라 자동 구축 본문

개발 이야기/인프라 구축 및 운영

Windows에서 jenkins + docker를 이용한 개발용 인프라 자동 구축

가온아 2022. 3. 4. 11:26

 CI/CD의 필요성은 이미 너무 잘 알려져 있으므로 잡설은 뒤로하고 바로 구축 절차를 살펴 보겠습니다. 별도 서버가 아닌 별도 PC 혹은 자신의 PC에 필요한 제품과 자신의 서비스를 docker로 실행할 수 있도록 다음과 같은 순서로 알아보겠습니다. 

  1. 시스템 설정
  2. Docker Desktop 설치
  3. Docker 이미지/컨테이너 살펴보기
  4. Jenkins로 서비스 자동 배포하기

 

[ 시스템 설정 ]

1. BIOS에서 Virtualization Technology 항목은 기본으로 "Disabled"로 설정되어 있으며, 이를 "Enabled"로 변경합니다.

2. Windwos 기능 켜기/끄기에서 Hyper-V / 가상 머신 플랫폼을 활성화합니다.

[Git/Jenkins 설치 참고 링크, Jenkins 한글 깨짐 현상 참고 링크

[ Docker Desktop 설치 ]

1. 다운로드 링크

2. 리소스 사용량 설정

C:\Users\사용자명 폴더에 .wslconfig 파일을 생성/수정하여 설정할 수 있습니다.

 

 

[ Docker 이미지/컨테이너 살펴보기 ]

1. 개요

  • 도커 이미지 : 도커 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합쳐둔 것으로 컨테이너 생성하기 위한 템플릿이라고 할 수 있다.
  • 도커 컨테이너 : 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화 된 것을 말합니다

2. Redis 이미지 다운받아 컨테이너로 실행하기 예제

  • 이미지 다운로드 : docker pull redis:latest
  • 컨테이너 실행 : docker run -p 6379:6379 redis:latest
  • docker desktop 에서는 GUI로 간단히 실행 가능

지정된 Remote Repositories가 없다면 cmd 창에서 docker pull redis:latest를 실행하면 images에서 바로 보입니다. (2)의 run 버튼을 클릭하면 실행 옵션창이 뜨며, container name과 Port forwarding을 위해 Ports -> Local Host아래에 연결할 포트번호를 입력합니다. 이를 입력하지 않으면 docker container 내에서만 포트가 오픈되고 로컬 PC에서 포트가 열려 있지 않아 실제로 연결이 되지 않으니 꼭 입력해야 합니다. 정상적으로 실행하면 Containers/App 화면에서 실행된 결과를 확인할 수 있습니다. 

[ Jenkins로 서비스 자동 배포하기 ]

예제에서는 python fastAPI로 간단한 api 서버를 만들어 보겠습니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def health_check():
    return 200

예제는 다음과 같이 실행할 수 있으며 (uvicorn main:app --port=8080),  실행 후 웹 브라우져에서 http://localhost:8080를 입력하면 200값이 돌아오는 것을 확인할 수 있습니다.

패키지 설치를 위해 requirements.txt 파일을 추가하여 설치할 패키지를 기술합니다.

fastapi>=0.73.0

docker 이미지 제작을 위해 "Dockerfile"이라는 파일을 추가하여 다음을 입력합니다.

# from
FROM ubuntu:latest

# apt init
ENV LANG=C.UTF-8
ENV TZ=Asia/Seoul
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
    apt-get install -y --no-install-recommends g++ git curl && \
    apt-get install -y sudo

# python stuff
RUN apt-get install -y python3-pip python3-dev
RUN cd /usr/local/bin && \
    ln -s /usr/bin/python3 python && \
    ln -s /usr/bin/pip3 pip && \
    pip3 install --upgrade pip

# apt cleanse
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# timezone
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

COPY . ./

# workspace
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . /usr/src/app

# install python packages
RUN pip install -r requirements.txt

# for run server
EXPOSE 5000
CMD uvicorn main:app --host=0.0.0.0 --port=8080

그리고 아래와 같이 빌드합니다.

docker build -t "my-service" ./

잘 빌드되었다면 docker desktop에서 아래와 같이 이미지로 등록된 것을 확인할 수 있습니다.

이 서비스를 Jenkins에서 하루 한 번 자동 배포 되도록 해보겠습니다.

우선 프로젝트에 Jenkinsfile을 만들고 아래 내용을 입력합니다.

pipeline{
    agent any

    environment {
       CONTAINER_NAME="my-server"
       NAME = "my-server"
       VERSION = "${env.BUILD_ID}-${env.GIT_COMMIT}"
       GIT_URL="http://Jenkins-server-ip/git/my-server.git"
    }
    stages {
        stage('Pull') {
            steps {
                git url:"${GIT_URL}", branch:"master", poll:true, changelog:true,credentialsId: 'your-git-credentialsId'
            }
        }
        stage('Clean'){
            steps{
                script {
                    try{
                        sh "docker stop ${CONTAINER_NAME}"
                        sleep 1
                        sh "docker rm ${CONTAINER_NAME}"
                    }catch(e){
                        sh 'exit 0'
                    }
                }
            }
        }
        stage('Build') {
            steps {
                sh "docker build -t ${NAME} ."
            }
        }
        stage('Deploy'){
            steps {
                sh "docker tag ${NAME}:latest ${NAME}:${VERSION}"
                sh "docker run -d --name=${CONTAINER_NAME} -p 8080:8080 ${NAME}:latest"
            }
        }
    }
}

Jenkinsfile 은 이 링크 를 참고하세요. script를 사용하면 조건이나 예외 처리가 가능하며 stage로 단계를 구별해두면 아래와 같이 진행결과를 확인하기가 편리합니다.

Jenkins에서 CD 설정을 위해 몇 가지 추가 설정이 필요합니다. 아래는 windows를 기준으로 설명합니다.

(1) PATH에 git path 등록하기

(1) PATH에 아래 경로를 등록합니다.

  • C:\Program Files\Git\cmd
  • C:\Program Files\Git\usr\bin

(2) shell 등록

이제 jenkins에 하루 한 번 자동 배포를 위한 작업을 등록해 보겠습니다. Dashboard에서 새로운 Item 메뉴를 선택합니다.

그리고 item name을 "my-service-pipeline"으로 입력 후 Pipeline을 선택합니다.

매일 오전 8시 자동 빌드를 한다고 가정하겠습니다. 항목 중 Build Triggers -> Build Periodically 를 선택 후 "00 08 * * *"을 입력합니다.

이후 Pipeline 항목에서 "Pipeline script from SCM"을 선택하고 SCM에서 "Git"을 선택, 자신의 Repository URL을 입력하고 해당 git의 Credentials을 선택합니다. Credentials이 없다면 Add를 추가 후 선택하면 됩니다.

하단의 Script Path는 기본으로 Jenkinsfile이 입력되어 있을 겁니다. 만약 도커 이미지 생성까지만 필요하다면 이 항목을 Dockerfile로 수정하시면 됩니다.

이제 매일 오전 8시면 위에서 우리가 기록해둔 Jenkinsfile을 실행하게 될 것입니다.

잘 안되는 내용들은 댓글로 남기시거나 ljh6341@gmail.com로 문의 주셔도 됩니다. 

모두 좋은 하루 되세요. :)

반응형