본문 바로가기
AWS

[deploy]jenkins, docker 배포 참고 2

by whitedeveloper 2023. 3. 31.

깃랩 WebHook 연결

다음은 싸피깃 레포지토리와 젠킨스를 WebHook으로 연결하여 자동 빌드를 진행해보겠습니다.

배포할 프로젝트가 있는 깃랩 Repository에서 밑줄친 위치로 WebHooks 페이지로 이동합니다.

URL에는 http://배포서버공인IP:9090/project/생성한jenkins프로젝트이름/을 입력해줍니다.

Secret token에는 아까 위에서 젠킨스 프로젝트를 생성할 때 저장해둔 값을 입력합니다.

빌드 유발 Trigger으로, Push events, Merge request events를 설정합니다. 대상 Branch는 master으로 설정합니다.

완료했다면 Add Webhook 버튼을 눌러 webhook을 생성합니다.

WebHook을 생성하고 나면 빌드 테스트를 위해 생성된 WebHook에서 test를 누르고, Push events를 선택해줍니다.

응답이 잘 넘어온 것을 확인할 수 있습니다. (code 200)

젠킨스에서도 정상적으로 빌드가 수행되는 것을 확인할 수 있습니다.

😆 여기까지 완료했으면 이제 Jenkins와 Gitlab이 연결되었습니다! 연결된 Gitlab의 master branch에 이벤트가 발생하면, 젠킨스에서는 빌드를 수행하게 됩니다!

젠킨스와 연결된 gitlab 프로젝트로 도커 이미지 빌드하기

참고사항

젠킨스에서 도커 빌드를 하기 위해서는 젠킨스 컨테이너 안에 도커를 설치해야 합니다. 도커 설치 방법은 Ec2에 도커를 설치할 때와 동일하게 진행합니다.

먼저 젠킨스 bash shell에 접근해보겠습니다. 명령어는 sudo docker exec -it jenkins bash 입니다.

정상적으로 접속되면 다음과 같은 화면이 됩니다. 이제 이 환경에 docker를 다시 설치하도록 합니다.

👉 사전 패키지 설치

apt update
apt-get install -y ca-certificates \
    curl \
    software-properties-common \
    apt-transport-https \
    gnupg \
    lsb-release

루트계정으로 접속되어있기 때문에, 젠킨스 컨테이너 내부에서는 명령어에 sudo를 지워야합니다.

👉 gpg 키 다운로드

mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
    $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

젠킨스에 gpg 키를 다운로드 받을 때의 변경사항입니다.

젠킨스 컨테이너 내부에서 설치된 os을 체크하는 명령어 cat /etc/issue를 통해 os를 확인해보면 debian으로 나타나는 것을 확인할 수 있습니다.

기존 링크에서 제공한 방식은 ubuntu os에 대한 gpg 키를 다운로드 하는 것이기 때문에, 이를 debian으로 바꾸어주어야 합니다.

이를 바꾸지 않으면 패키지를 찾지 못하는 에러가 발생합니다.

기존 명령어에서 ubuntu로 되어있는 부분을 debian으로 바꾸어주면 해결됩니다.

👉 Docker 설치

apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose

여기까지 진행하면 Jenkins Container에도 Docker가 설치 완료되었습니다.

👉 프로젝트에 DockerFile 작성

이제 깃랩의 각 프로젝트 폴더에 DockerFile을 만들어 명령어를 입력해주겠습니다.

Django Project DockerFile

FROM python:3.9.5
WORKDIR /var/jenkins_home/workspace/deploytest/testproject
COPY requirements.txt ./

RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "testproject.wsgi", "--bind", "0.0.0.0:8080"]

Django DockerFile에서는 Python 3.9.5 이미지를 베이스 이미지로 두고, Requirements를 통해 pip 패키지를 설치한 후, 프로젝트 폴더를 이미지에 복사, 그후 CMD를 통해 컨테이너를 실행하도록 하였습니다.

 Spring의 경우 Spring 빌드 프로세스를 따라 DockerFile을 작성해주시면 됩니다!

React Project DockerFile

FROM node:16.15.0 as build-stage
WORKDIR /var/jenkins_home/workspace/deploytest/testproject_react
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:stable-alpine as production-stage

COPY --from=build-stage /var/jenkins_home/workspace/deploytest/testproject_react/build /usr/share/nginx/html
#COPY --from=build-stage /var/jenkins_home/workspace/deploytest/testproject_react/deploy_conf/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g","daemon off;"]

간단 명령어 설명

  • FROM : 베이스 이미지를 지정
  • WORKDIR : 작업 디렉토리 설정
  • COPY : 파일 복사 <Host 파일 경로> <Docker 이미지 파일 경로>
  • RUN : 명령 실행
  • CMD 컨테이너 실행 명령
  • EXPORT : 포트 익스포트

React DockerFile에서는 먼저 node:16.15.0 이미지를 베이스 이미지로 둡니다. as build-stage는 이미지를 지칭하는 별명을 말합니다.

그 후 package*.json에 등록되어있는 라이브러리들을 npm install으로 설치하고, 프로젝트 폴더를 이미지에 복사, npm run build를 통해 build폴더에 빌드한 프로젝트(static 파일)가 저장됩니다.

실제 컨테이너로 생성되는 건 다음 이미지인데요, nginx:stable-alpine 이미지를 베이스로 설정하고, COPY의 옵션으로 --from=build-stage 를 통해 아까 빌드했던 파일들을 nginx의 서비스 폴더인 /usr/share/nginx/html으로 복사합니다.

그 후 80포트로 익스포팅 하고 CMD를 통해 nginx를 백그라운드에서 실행하는 컨테이너를 실행하도록 하였습니다.

 Vue.js의 경우 npm run build를 했을 때 생성되는 폴더가 build가 아닌 dist이므로 폴더명에 주의해주시면 됩니다!

React 도커파일에서 #으로 주석처리한 부분은 nginx 설정에 사용되는 부분입니다. 뒤에서 nginx 설정할 때 설명하겠습니다.

프로젝트의 도커 파일 설정은 이제 완료되었습니다! 다음은 젠킨스에서 이 도커파일을 이용해서 이미지를 생성하도록 해보겠습니다.

👉 젠킨스에서 DockerFile 이용 도커 이미지 생성

젠킨스 프로젝트 페이지에서, 구성 버튼을 클릭합니다.

그럼 아까 프로젝트 생성할 때의 창과 비슷한 창이 나타납니다. Build 탭으로 이동하고, 아까 프로젝트 생성할 때 pwd로 적어두었던 명령어를 다음 명령어로 바꾸어줍니다.

docker image prune -a --force
mkdir -p /var/jenkins_home/images_tar
cd /var/jenkins_home/workspace/deploytest/testproject_react/
docker build -t react .
docker save react > /var/jenkins_home/images_tar/react.tar

cd /var/jenkins_home/workspace/deploytest/testproject/
docker build -t django .
docker save django > /var/jenkins_home/images_tar/django.tar

ls /var/jenkins_home/images_tar

위 명령어에 대한 개별 설명

  • docker image prune -a --force : 사용하지 않는 이미지 삭제
  • mkdir -p /var/jenkins_home/images_tar : 도커 이미지 압축파일을 저장할 폴더 생성
  • cd /var/jenkins_home/workspace/deploytest/testproject_react : 해당 경로로 이동(react 프로젝트 폴더)
  • docker build -t react . : 도커 이미지 빌드(React 프로젝트)
  • docker save react > /var/jenkins_home/images_tar/react.tar : 도커 이미지를 react.tar로 압축하여 위에서 생성한 폴더에 저장
  • cd /var/jenkins_home/workspace/deploytest/testproject/ : 해당 경로로 이동(django 프로젝트 폴더)
  • docker build -t django . : 도커 이미지 빌드(Django 프로젝트)
  • docker save django > /var/jenkins_home/images_tar/django.tar : 도커 이미지를 django.tar로 압축하여 위에서 생성한 폴더에 저장
  • ls /var/jenkins_home/images_tar : 해당 폴더에 있는 파일 목록 출력(잘 압축되어 저장되었는지 확인)

이후 저장 버튼을 눌러줍니다.

그 후 지금 빌드 버튼을 눌러 빌드해줍니다.

열심히 일하고 있는 젠킨스 할아버지 😢

프로젝트에 오타가 있어서 수정하는 김에 Push event를 이용하여 자동으로 빌드되는 것 까지 테스트 해보았습니다.

빌드에 성공했다는 메시지입니다.

이 글 초반부의 젠킨스 컨테이너 생성할 때의 docker-compose.yml 파일이 기억 나시나요? 그 때 공유 폴더로 aws의 /jenkins와 /var/jenkins_home를 연결했었습니다.

젠킨스 컨테이너 안의 /var/jenkins_home/images_tar 폴더 안에 2개의 tar 파일이 생성되어있고, 폴더를 공유하는 EC2의 /jenkins/images_tar에도 똑같이 2개의 tar 파일이 생성되어 있는 것을 확인할 수 있습니다.

😆 여기까지 완료했으면 젠킨스에서 도커 이미지를 빌드하여 tar 압축파일로 생성하는 부분까지 완성되었습니다!